Recueillir à l'embauche ce qu'exige le contrat

Créer un salarié demandait cinq champs. Le contrat, la déclaration et le
registre en réclament une vingtaine, et rien ne permettait de les saisir :
le sexe, le nom de naissance, le pays et le département de naissance, la
situation de famille, les personnes à charge, le téléphone fixe, le
complément d'adresse et l'heure d'embauche n'existaient pas en base.

La migration les ajoute, toutes facultatives : un dossier incomplet doit
pouvoir exister — c'est au registre de signaler ce qui lui manque, pas à
la base de refuser l'embauche. Seul l'envoi des plannings par SMS fait
exception : c'est un consentement, donc faux par défaut, la charge de la
preuve pesant sur l'employeur.

Le pays et le département de naissance sont des colonnes à part et non une
commune saisie librement : la déclaration sociale les demande séparément,
et les rétro-extraire échouerait au premier « Bar-le-Duc (Meuse) ».

Le formulaire devient un panneau latéral : une trentaine de champs posés
au centre masquaient l'annuaire, et on embauche en regardant qui est déjà
là. Le matricule y est proposé à la suite du dernier, attribué dans la
transaction pour que deux embauches simultanées ne tombent pas sur le même
rang. Le nom de naissance vaut le nom de famille quand il n'en diffère
pas, plutôt que d'imposer une ressaisie à l'immense majorité des dossiers.

Le responsable hiérarchique et la politique RTT se posent enfin à
l'embauche : les deux modèles existaient sans qu'aucun écran ne les
alimente.

Le registre unique du personnel gagne sa colonne « sexe » et se tient
désormais au nom de naissance — le nom d'usage peut changer sans que la
personne change.

La migration s'applique au redéploiement : l'entrypoint du conteneur passe
`prisma migrate deploy` avant de démarrer le serveur. Elle n'ajoute que des
colonnes nullables et deux types énumérés, sans réécriture de table.
Écrite et validée contre le schéma, non exécutée ici : aucune base n'était
ouverte.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
MichaelandClaude Opus 5 committed 2026-08-10 17:34:10 +02:00
1 parent e27d61dd4c
commit b608aa87cf
20 files changed
+791 -155

No files matched your search

@@ -0,0 +1,44 @@
-- État civil complet du dossier salarié.
--
-- Ces mentions manquaient au schéma alors que la loi les réclame ou que la
-- paie s'appuie dessus :
--
-- - le **sexe** est exigé au registre unique du personnel (art. D1221-23) ;
-- sans lui, tout dossier y sort incomplet ;
-- - le **nom de naissance** ne se déduit pas du nom d'usage, et c'est lui que
-- portent la déclaration sociale et le registre ;
-- - le **pays** et le **département** de naissance sont demandés séparément
-- par la déclaration : les extraire d'une commune saisie librement échouerait
-- au premier « Bar-le-Duc (Meuse) » ;
-- - la **situation de famille** et les **personnes à charge** commandent des
-- droits que le salarié seul peut déclarer ;
-- - l'**heure d'embauche** est demandée par la DPAE, que la date seule ne
-- suffit pas à remplir.
--
-- Toutes les colonnes sont facultatives : un dossier incomplet doit pouvoir
-- exister — c'est au registre de signaler ce qui lui manque, pas à la base de
-- refuser l'embauche. Seule exception, l'envoi des plannings par SMS, qui est
-- un consentement : explicitement faux par défaut, la charge de la preuve
-- pesant sur l'employeur.
-- CreateEnum
CREATE TYPE "Gender" AS ENUM ('FEMALE', 'MALE', 'UNSPECIFIED');
-- Le PACS est distinct du concubinage et du mariage : les trois n'ouvrent pas
-- les mêmes droits, et les confondre fausserait la paie.
-- CreateEnum
CREATE TYPE "MaritalStatus" AS ENUM ('SINGLE', 'MARRIED', 'PACS', 'COHABITING', 'DIVORCED', 'WIDOWED');
-- AlterTable
ALTER TABLE "EmployeeProfile" ADD COLUMN "addressLine2" TEXT,
ADD COLUMN "birthCountry" TEXT,
ADD COLUMN "birthDepartment" TEXT,
ADD COLUMN "birthName" TEXT,
ADD COLUMN "dependents" INTEGER,
ADD COLUMN "gender" "Gender",
ADD COLUMN "landline" TEXT,
ADD COLUMN "maritalStatus" "MaritalStatus",
ADD COLUMN "smsSchedules" BOOLEAN NOT NULL DEFAULT false;
-- AlterTable
ALTER TABLE "UserContract" ADD COLUMN "startTime" TEXT;
+49 -1
View File
@@ -481,16 +481,41 @@ model EmployeeProfile {
firstName String
lastName String
/// Nom de naissance, distinct du nom d'usage. La paie, la déclaration
/// sociale et le registre du personnel se tiennent au nom de naissance ;
/// l'un ne remplace pas l'autre.
birthName String?
/// Sexe — mention exigée au registre unique du personnel (art. D1221-23).
/// Facultatif en base : un dossier incomplet doit pouvoir exister, et c'est
/// le registre qui signale ce qui lui manque.
gender Gender?
birthDate DateTime? @db.Date
birthPlace String?
/// Commune de naissance. Le pays et le département sont portés à part :
/// la déclaration sociale les demande séparément, et les recoller depuis une
/// chaîne libre échouerait au premier « Bar-le-Duc (Meuse) ».
birthPlace String?
birthCountry String?
birthDepartment String?
nationality String?
/// Situation de famille et personnes à charge : la paie en dépend, et le
/// salarié seul peut les déclarer.
maritalStatus MaritalStatus?
dependents Int?
addressLine1 String?
addressLine2 String?
postalCode String?
city String?
country String?
phone String?
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?
@@ -505,6 +530,26 @@ model EmployeeProfile {
@@index([accountId])
}
/// Sexe au sens de l'état civil, tel que le registre du personnel le demande.
/// Trois valeurs et non deux : un dossier peut être ouvert avant que la
/// mention soit connue, et « non précisé » se distingue d'un champ jamais rempli.
enum Gender {
FEMALE
MALE
UNSPECIFIED
}
/// Situation de famille. Le PACS est distinct du concubinage et du mariage :
/// les trois n'ouvrent pas les mêmes droits, et les confondre fausserait la paie.
enum MaritalStatus {
SINGLE
MARRIED
PACS
COHABITING
DIVORCED
WIDOWED
}
/// Titre de séjour et son échéance. Le tableau de bord RH surveille les
/// expirations : un titre périmé interdit l'emploi.
model WorkPermit {
@@ -530,6 +575,9 @@ model UserContract {
contractType ContractType
startDate DateTime @db.Date
/// Heure de prise de poste le premier jour, au format « HH:MM ».
/// Une date seule ne suffit pas à la DPAE, qui demande l'heure d'embauche.
startTime String?
endDate DateTime? @db.Date
trialEndDate DateTime? @db.Date