Files
deep-dive-ming/docs/deep-dive-employee-domain.md

205 lines
8.9 KiB
Markdown

# Employee Bundle Deep Dive
## Ubiquitous Language
- **Employee / Salarie / Employe**: central person lifecycle record.
Path: `src/Uriae/EmployeeBundle/Entity/Employee.php`
- **TypeEmployee**: profile category driving workflows/filters.
Paths: `src/Uriae/EmployeeBundle/Entity/Employee.php`, `src/Uriae/EmployeeBundle/Repository/EmployeeRepository.php`
- **Employee state** (`Postulant`, `En contrat`, `Sorti`): lifecycle projection from contracts/sortie.
Paths: `src/Uriae/EmployeeBundle/Entity/Employee.php`, `src/Uriae/EmployeeBundle/Model/EmployeeStateUpdater.php`
- **Contrat**: contract period + métier + site + ASP bridge.
Path: `src/Uriae/EmployeeBundle/Entity/Contrat.php`
- **ParcoursInsertion**: insertion timeline + sortie segments.
Path: `src/Uriae/EmployeeBundle/Entity/ParcoursInsertion.php`
- **SituationSortie**: exit segment with dates/type.
Path: `src/Uriae/UnionBundle/Entity/SituationSortie.php`
- **FirstHome**: intake/prescriber/resource/mutuelle context.
Path: `src/Uriae/EmployeeBundle/Entity/FirstHome.php`
- **AdministrativeInformation**: civil/admin identity block (NIR/NTT, nationality, birth info).
Path: `src/Uriae/EmployeeBundle/Entity/AdministrativeInformation.php`
- **PersonnalDetail**: address/contact block.
Path: `src/Uriae/EmployeeBundle/Entity/PersonnalDetail.php`
- **HiringStatus**: eligibility and social condition matrix (RSA, AAH, RQTH, etc.).
Path: `src/Uriae/EmployeeBundle/Entity/HiringStatus.php`
## Domain Core
- **De facto root: `Employee`**
- Owns/coordinates personal, admin, intake, insertion, contracts, jobs, medical visits, receipts, competencies.
- Path: `src/Uriae/EmployeeBundle/Entity/Employee.php`
- **Contract lifecycle cluster**
- `Contrat` + ASP contract dossier + sortie semantics.
- Paths:
- `src/Uriae/EmployeeBundle/Entity/Contrat.php`
- `src/Uriae/AspBundle/Entity/FicheContratAsp.php`
- `src/Uriae/UnionBundle/Entity/SituationSortie.php`
- **Insertion timeline cluster**
- `ParcoursInsertion` with associated sortie segments.
- Path: `src/Uriae/EmployeeBundle/Entity/ParcoursInsertion.php`
- **Profile/intake clusters**
- `PersonnalDetail`, `AdministrativeInformation`, `HiringStatus`, `FirstHome`.
- Paths:
- `src/Uriae/EmployeeBundle/Entity/PersonnalDetail.php`
- `src/Uriae/EmployeeBundle/Entity/AdministrativeInformation.php`
- `src/Uriae/EmployeeBundle/Entity/HiringStatus.php`
- `src/Uriae/EmployeeBundle/Entity/FirstHome.php`
## Invariants / Concistency
- `src/Uriae/EmployeeBundle/Entity/Employee.php`
- State constrained to known values.
- `civility` drives derived sex.
- Sortie considered complete only when both date + type are present.
- Contract timeline helpers (first/last/previous/initial logic).
- `src/Uriae/EmployeeBundle/Model/EmployeeStateUpdater.php`
- Recomputes state from contracts/sortie chronology.
- `src/Uriae/EmployeeBundle/Entity/Contrat.php`
- Contract date ordering constraints.
- ROME validity constraints.
- ASP-specific duration-in-months rounding behavior.
- `src/Uriae/EmployeeBundle/Form/Validator/DateEffectiveContratValidator.php`
- Prevents new/update contract when previous relevant contract has no effective end date.
- `src/Uriae/EmployeeBundle/Form/Validator/CodeRomeValidator.php`
- Rejects expired ROME codes at contract start.
- Adds date-threshold behavior around 2022 policy.
- `src/Uriae/EmployeeBundle/Entity/ParcoursInsertion.php`
- Agreement number format constraints.
- First/last sortie determination rules by entry dates.
- `src/Uriae/UnionBundle/Entity/SituationSortie.php`
- Sortie type/date consistency (both required together).
- `src/Uriae/EmployeeBundle/Model/SituationSortieUpdater.php`
- Rebuilds contract-sortie mapping.
- Removes empty sorties.
- Creates sortie for orphan contracts.
- Triggers state refresh.
- `src/Uriae/EmployeeBundle/Entity/AdministrativeInformation.php`
- Birth date required and validated.
- NIR/NTT consistency via validators.
- `src/Uriae/EmployeeBundle/Form/Validator/SocialSecurityNumberValidator.php`
- NIR shape + civility constraints.
- NTT fallback requirement when NIR absent in specific cases.
- `src/Uriae/EmployeeBundle/Form/Validator/TemporaryTechnicalNumberValidator.php`
- NIR/NTT mutual exclusivity.
- `src/Uriae/EmployeeBundle/Entity/HiringStatus.php`
- Coherence between social flags (RSA/ayant-droit, sans-ressources, AAH-handicap linkage).
- Young-in-difficulty age window logic based on DOB + first contract.
- `src/Uriae/EmployeeBundle/Entity/PersonnalDetail.php`
- At least one phone required.
- Phone/address/town/zip consistency checks.
- `src/Uriae/EmployeeBundle/Entity/FirstHome.php`
- PE inscription-dependent fields required conditionally.
- PE identifier formatting.
- Conventionneur-only partner constraint.
## Cross-context Dependencies
- **Employee -> Suivi**
- Paths:
- `src/Uriae/EmployeeBundle/Entity/Employee.php`
- `src/Uriae/SuiviBundle/Entity/Accompagnement.php`
- `src/Uriae/SuiviBundle/Entity/Evaluation.php`
- `src/Uriae/SuiviBundle/Entity/Problematique.php`
- `src/Uriae/SuiviBundle/Entity/Potentiel.php`
- DDD direction idea: Suivi consumes Employee identity/reference, not full object graph.
- **Employee -> ASP**
- Paths:
- `src/Uriae/EmployeeBundle/Entity/Contrat.php`
- `src/Uriae/AspBundle/Entity/FicheContratAsp.php`
- `src/Uriae/AspBundle/Manager/AspFicheContratManager.php`
- DDD direction idea: ASP as downstream integration context reacting to contract events.
- **Employee -> Union**
- Paths:
- `src/Uriae/EmployeeBundle/Entity/ParcoursInsertion.php`
- `src/Uriae/UnionBundle/Entity/SituationSortie.php`
- DDD direction idea: shared kernel or ACL around sortie taxonomy.
- **Employee <-> Structure**
- Paths:
- `src/Uriae/EmployeeBundle/Entity/Employee.php`
- `src/Uriae/StructureBundle/Entity/Structure.php`
- DDD direction idea: explicit IDs/reference objects instead of deep bidirectional graph.
## DDD Slicing
- **Aggregates (candidate)**
- `EmployeeProfile` (identity + personal/admin + hiring status).
- `EmploymentLifecycle` (contracts + state projection + timeline fields).
- `InsertionJourney` (parcours + sortie segments).
- `IntakeContext` (first home/resources/mutuelle data).
- `EmployeeCompetency` (employee-competence assignment).
- **Domain services (candidate)**
- `EmployeeStatePolicy` (from `EmployeeStateUpdater`).
- `SituationSortieRebuilder` (from `SituationSortieUpdater`).
- `ContractTimelineCalculator` (first/last contract rules).
- `HiringStatusPolicy` (coherence rules currently scattered in entity callbacks/validators).
- **Repository interfaces (domain-facing)**
- `EmployeeRepository` (aggregate retrieval only).
- `ContractRepository` (active/last/chronology views).
- `InsertionJourneyRepository`.
- Separate read-model queries for reporting/export/bilan.
- **Domain events (candidate)**
- `ContractAdded`, `ContractUpdated`, `ContractRemoved`.
- `EmployeeStateChanged`.
- `SituationSortieRecomputed`.
- `AspSubmissionAcknowledged` (integration side).
- **Value objects (candidate)**
- `EmployeeState`, `EmployeeTypeSlug`.
- `ContractPeriod`.
- `SocialSecurityNumber`, `TemporaryTechnicalNumber`.
- `AgreementNumber`, `PoleEmploiId`.
- `PhoneNumber`, `PostalAddress`, `ZipCode`.
`src/Uriae/EmployeeBundle/Entity/Employee.php`
## Reading Order (Employee domain deep dive)
1. `src/Uriae/EmployeeBundle/Entity/Employee.php`
2. `src/Uriae/EmployeeBundle/Entity/Contrat.php`
3. `src/Uriae/EmployeeBundle/Entity/ParcoursInsertion.php`
4. `src/Uriae/UnionBundle/Entity/SituationSortie.php`
5. `src/Uriae/EmployeeBundle/Model/SituationSortieUpdater.php`
6. `src/Uriae/EmployeeBundle/Model/EmployeeStateUpdater.php`
7. `src/Uriae/EmployeeBundle/EventSubscriber/ContratChangeSubscriber.php`
8. `src/Uriae/EmployeeBundle/Entity/AdministrativeInformation.php`
9. `src/Uriae/EmployeeBundle/Entity/HiringStatus.php`
10. `src/Uriae/EmployeeBundle/Entity/PersonnalDetail.php`
11. `src/Uriae/EmployeeBundle/Entity/FirstHome.php`
12. `src/Uriae/EmployeeBundle/Entity/Pmsmp.php`
13. `src/Uriae/EmployeeBundle/Form/Validator/DateEffectiveContratValidator.php`
14. `src/Uriae/EmployeeBundle/Form/Validator/CodeRomeValidator.php`
15. `src/Uriae/EmployeeBundle/Form/Validator/SocialSecurityNumberValidator.php`
16. `src/Uriae/EmployeeBundle/Form/Validator/TemporaryTechnicalNumberValidator.php`
17. `src/Uriae/EmployeeBundle/Repository/EmployeeRepository.php`
18. `src/Uriae/EmployeeBundle/Repository/ContratRepository.php`
19. `src/Uriae/EmployeeBundle/Controller/ContratsController.php`
20. `src/Uriae/EmployeeBundle/Controller/InsertionController.php`
21. `src/Uriae/AspBundle/Entity/FicheContratAsp.php`
22. `src/Uriae/AspBundle/Manager/AspFicheContratManager.php`
23. `src/Uriae/SuiviBundle/Entity/Accompagnement.php`
24. `src/Uriae/SuiviBundle/Entity/Evaluation.php`
25. `src/Uriae/StructureBundle/Entity/Structure.php`