diff --git a/prisma/migrations/20260811160000_drop_sms/migration.sql b/prisma/migrations/20260811160000_drop_sms/migration.sql
new file mode 100644
index 0000000..e1491e2
--- /dev/null
+++ b/prisma/migrations/20260811160000_drop_sms/migration.sql
@@ -0,0 +1,11 @@
+-- ---------------------------------------------------------------------------
+-- Retrait de l'envoi des plannings par SMS.
+--
+-- Le drapeau était un consentement recueilli pour un canal qui n'a jamais
+-- existé : aucun envoi de SMS n'est branché, et il n'est pas prévu de l'être.
+-- Un consentement conservé sans finalité est une donnée collectée sans base
+-- légale — la minimisation impose de la supprimer, pas de la garder « au cas
+-- où ».
+-- ---------------------------------------------------------------------------
+
+ALTER TABLE "EmployeeProfile" DROP COLUMN IF EXISTS "smsSchedules";
diff --git a/prisma/schema.prisma b/prisma/schema.prisma
index 07448d5..77484a8 100644
--- a/prisma/schema.prisma
+++ b/prisma/schema.prisma
@@ -603,10 +603,6 @@ model EmployeeProfile {
landline String?
personalEmail String?
- /// Envoi des plannings par SMS. Un consentement, donc explicitement faux
- /// par défaut : la charge de la preuve pèse sur l'employeur.
- smsSchedules Boolean @default(false)
-
socialSecurityNumberEnc Bytes?
ibanEnc Bytes?
bicEnc Bytes?
diff --git a/src/app/(app)/equipe/AddEmployeeForm.tsx b/src/app/(app)/equipe/AddEmployeeForm.tsx
index 5d4b472..59d4d19 100644
--- a/src/app/(app)/equipe/AddEmployeeForm.tsx
+++ b/src/app/(app)/equipe/AddEmployeeForm.tsx
@@ -25,18 +25,35 @@ import type {
const empty: ActionState = {};
+/**
+ * Les neuf types de contrat, par ordre alphabétique.
+ *
+ * Pas de « CDI en premier » : le classement par fréquence supposée fait chercher
+ * les huit autres, et se lit comme un défaut à accepter. L'ordre alphabétique
+ * ne privilégie rien et se parcourt sans réfléchir.
+ */
const CONTRACT_TYPES = [
- ['CDI', 'CDI'],
- ['CDD', 'CDD'],
['APPRENTISSAGE', 'Apprentissage'],
- ['STAGIAIRE', 'Stagiaire'],
- ['SAISONNIER', 'Saisonnier'],
- ['EXTRA', 'Extra'],
- ['INTERIM', 'Intérim'],
+ ['CDD', 'CDD'],
+ ['CDI', 'CDI'],
['DIRIGEANT_ASSIMILE_SALARIE', 'Dirigeant assimilé salarié'],
['DIRIGEANT_NON_SALARIE', 'Dirigeant non salarié'],
+ ['EXTRA', 'Extra'],
+ ['INTERIM', 'Intérim'],
+ ['SAISONNIER', 'Saisonnier'],
+ ['STAGIAIRE', 'Stagiaire'],
] as const;
+/** Marque d'obligation, annoncée aussi aux lecteurs d'écran. */
+function Required() {
+ return (
+
+ *
+ (requis)
+
+ );
+}
+
const selectClass =
'h-9 min-w-0 rounded-2 border border-line-2 bg-surface px-2 text-sm text-ink-1 outline-none focus-visible:border-focus';
@@ -136,20 +153,6 @@ export function AddEmployeeForm({
/>
-
-
@@ -186,9 +189,22 @@ export function AddEmployeeForm({
/>
+ {/* Aucune valeur par défaut : un type de contrat pré-rempli est
+ un type que personne n'a choisi, et il commande les règles de
+ durée comme la déclaration. */}
+ {/* L'équipe est **requise** avec un contrat. Le planning
+ s'ordonne par équipe : un salarié rattaché à l'établissement
+ mais à aucune équipe n'apparaît sur aucune grille, et rien ne
+ le signale avant la première semaine à couvrir. */}