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

225 lines
9.7 KiB
Markdown

# Suivi Bundle Deep Dive
## Ubiquitous Language
- **Suivi salarié**: umbrella follow-up workflow for active/exited employees.
Paths: `src/Uriae/SuiviBundle/Controller/SuiviController.php`, `src/Uriae/SuiviBundle/Resources/translations/messages.fr.yml`
- **Action**: abstract intervention (`dateDebut`, `duree`, `typeAction`, `commentaire`, `structure`).
Path: `src/Uriae/SuiviBundle/Entity/Action.php`
- **Accompagnement**: socio-professional support action with objective/result/encadrants/partenaires.
Path: `src/Uriae/SuiviBundle/Entity/Accompagnement.php`
- **Evaluation**: employee assessment action with notes and validation lifecycle.
Path: `src/Uriae/SuiviBundle/Entity/Evaluation.php`
- **Note**: score item per savoir with bounded values.
Path: `src/Uriae/SuiviBundle/Entity/Note.php`
- **Savoir taxonomy** (`TypeSavoir`, `CategorieSavoir`, `Savoir`): evaluation referential tree.
Paths: `src/Uriae/SuiviBundle/Entity/TypeSavoir.php`, `src/Uriae/SuiviBundle/Entity/CategorieSavoir.php`, `src/Uriae/SuiviBundle/Entity/Savoir.php`
- **Action taxonomy** (`AxeTypeAction`, `CategorieTypeAction`, `TypeAction`): insertion action referential tree.
Paths: `src/Uriae/SuiviBundle/Entity/AxeTypeAction.php`, `src/Uriae/SuiviBundle/Entity/CategorieTypeAction.php`, `src/Uriae/SuiviBundle/Entity/TypeAction.php`
- **FormationInterne** + **ParticipationFormation**: training and attendee participation.
Paths: `src/Uriae/SuiviBundle/Entity/FormationInterne.php`, `src/Uriae/SuiviBundle/Entity/ParticipationFormation.php`
- **Potentiel**: employability/motivation/mobility profile.
Path: `src/Uriae/SuiviBundle/Entity/Potentiel.php`
- **Problematique**: insertion issue lifecycle and resolution.
Path: `src/Uriae/SuiviBundle/Entity/Problematique.php`
- **Habilitation**: employee certification/authorization with expiry.
Path: `src/Uriae/SuiviBundle/Entity/Habilitation.php`
- **RDV** and **Event**: appointment and event timeline entries.
Paths: `src/Uriae/SuiviBundle/Entity/Rdv.php`, `src/Uriae/SuiviBundle/Entity/Event.php`
## Domain Core
- **Practical root today: `Employee` (outside Suivi)**
- Most Suivi entities attach to `Employee` and are also maintained from Employee-side relations.
- Path: `src/Uriae/EmployeeBundle/Entity/Employee.php`
- **Action hierarchy**
- Polymorphic root `Action` with concrete subclasses:
- `Accompagnement`
- `Evaluation`
- `FormationInterne`
- Path: `src/Uriae/SuiviBundle/Entity/Action.php`
- **Evaluation subgraph**
- `Evaluation` + `Note` collection and validation lifecycle.
- Paths:
- `src/Uriae/SuiviBundle/Entity/Evaluation.php`
- `src/Uriae/SuiviBundle/Entity/Note.php`
- **Formation subgraph**
- `FormationInterne` + participants + costs.
- Paths:
- `src/Uriae/SuiviBundle/Entity/FormationInterne.php`
- `src/Uriae/SuiviBundle/Entity/ParticipationFormation.php`
- **Potentiel and conformite subgraphs**
- `Potentiel`, `Problematique`, `Habilitation`.
- Paths:
- `src/Uriae/SuiviBundle/Entity/Potentiel.php`
- `src/Uriae/SuiviBundle/Entity/Problematique.php`
- `src/Uriae/SuiviBundle/Entity/Habilitation.php`
- **Reference models**
- Action and savoir taxonomies are mutable references with strong structure-level administration.
- Paths:
- `src/Uriae/SuiviBundle/Entity/TypeAction.php`
- `src/Uriae/SuiviBundle/Entity/CategorieTypeAction.php`
- `src/Uriae/SuiviBundle/Entity/AxeTypeAction.php`
- `src/Uriae/SuiviBundle/Entity/TypeSavoir.php`
- `src/Uriae/SuiviBundle/Entity/CategorieSavoir.php`
- `src/Uriae/SuiviBundle/Entity/Savoir.php`
## Invariants / Concistency
- `src/Uriae/SuiviBundle/Entity/Note.php`
- Note value must be numeric and in allowed range.
- `src/Uriae/SuiviBundle/Entity/Evaluation.php`
- New evaluation starts unvalidated.
- Note initialization uses selected categories and default non-evaluated value.
- `src/Uriae/SuiviBundle/Repository/EvaluationRepository.php`
- Creation flow expects previous evaluations to be validated.
- First/last evaluation selection is based on validated subset.
- `src/Uriae/SuiviBundle/Controller/EvaluationController.php`
- Blocks new evaluation when prior validations are pending.
- `src/Uriae/SuiviBundle/Model/Bilan/CategoryNode.php`
- Non-evaluated notes ignored from score computation.
- `src/Uriae/SuiviBundle/Model/Bilan/FamilyNode.php`
- Category score threshold drives strong/weak point classification.
- `src/Uriae/SuiviBundle/Entity/FormationInterne.php`
- `src/Uriae/SuiviBundle/Form/Validator/Collection/ArrayLength.php`
- Formation must have at least one participant.
- `src/Uriae/SuiviBundle/Entity/Action.php`
- `src/Uriae/SuiviBundle/Entity/ParticipationFormation.php`
- Duration fields (`heures/minutes`) recompute total duration via lifecycle logic.
- `src/Uriae/SuiviBundle/Repository/TypeActionRepository.php`
- Accompagnement-compatible action types are axis-filtered and category-filtered.
- `src/Uriae/SuiviBundle/Form/Type/FormationInterneType.php`
- Formation action type constrained to specific axis.
- `src/Uriae/SuiviBundle/Entity/TypeAction.php`
- `structure = null` means global type; non-null means structure-owned type.
- `src/Uriae/StructureBundle/Controller/GrilleEvaluationController.php`
- Prevents deleting a savoir when notes exist.
- `src/Uriae/SuiviBundle/Repository/HabilitationRepository.php`
- Expiry alerts depend on active habilitation + employee state.
- `src/Uriae/SuiviBundle/Command/DesactivateHabilitationsCommand.php`
- Batch deactivation for outdated active habilitations.
- `src/Uriae/SuiviBundle/Repository/RdvRepository.php`
- SMS target list filtered by send flag + next-day date rule.
## Cross-context Dependencies
- **Suivi <-> Employee (strong coupling)**
- Paths:
- `src/Uriae/SuiviBundle/Entity/*`
- `src/Uriae/EmployeeBundle/Entity/Employee.php`
- Direction idea: Suivi depends on Employee identity/reference boundary, not shared rich object graph.
- **Suivi <-> Structure**
- Paths:
- `src/Uriae/SuiviBundle/Entity/Action.php`
- `src/Uriae/SuiviBundle/Entity/TypeAction.php`
- `src/Uriae/SuiviBundle/Entity/CategorieSavoir.php`
- `src/Uriae/StructureBundle/Controller/GrilleEvaluationController.php`
- `src/Uriae/StructureBundle/Controller/ReferentielInsertionController.php`
- Direction idea: explicit catalog management contract instead of direct structure controllers mutating Suivi references.
- **Suivi -> Union**
- Paths:
- `src/Uriae/SuiviBundle/Entity/FormationInterne.php`
- `src/Uriae/SuiviBundle/Entity/Accompagnement.php`
- Direction idea: consume Union referentials through explicit read model/ACL.
- **Suivi -> User**
- Paths:
- `src/Uriae/SuiviBundle/Entity/Rdv.php`
- `src/Uriae/SuiviBundle/Entity/Event.php`
- `src/Uriae/SuiviBundle/Entity/Habilitation.php`
- Direction idea: reference user identity and role policy via dedicated boundary service.
## DDD Slicing
- **Subcontexts**
- `suivi-actions` (`Accompagnement`, `Evaluation`, `FormationInterne`, `ParticipationFormation`)
- `suivi-potentiel` (`Potentiel`, `Problematique`, projet/experience profile)
- `suivi-interactions` (`Rdv`, `Event`)
- `suivi-conformite` (`Habilitation`)
- `suivi-referentiels` (taxonomy aggregates)
- **Aggregates (candidate)**
- `EvaluationAggregate` (evaluation + notes).
- `FormationInterneAggregate` (formation + participations + costs).
- `AccompagnementAggregate`.
- `PotentielAggregate`.
- `HabilitationAggregate`.
- `RdvAggregate`.
- `EventAggregate`.
- **Domain services (candidate)**
- `EvaluationPolicyService`.
- `FormationParticipationService`.
- `HabilitationExpiryService`.
- `RdvNotificationPolicy`.
- **Repository interfaces (domain-facing)**
- `EvaluationRepository`, `AccompagnementRepository`, `FormationInterneRepository`.
- `HabilitationRepository`, `RdvRepository`, `ProblematiqueRepository`.
- `TypeActionCatalog`, `SavoirCatalog`.
- **Domain events (candidate)**
- `EvaluationCreated`, `EvaluationValidated`.
- `FormationParticipantAdded`, `FormationParticipantRemoved`.
- `HabilitationExpired`, `HabilitationDeactivated`.
- `RdvPlanned`, `RdvSmsRequested`.
- **Value objects (candidate)**
- `DurationMinutes`.
- `NoteValue`.
- `Avancement`.
- `ResolutionMode`.
- `ActionTypeCode`.
- `StructureScope`.
## Reading Order
1. `src/Uriae/EmployeeBundle/Entity/Employee.php`
2. `src/Uriae/SuiviBundle/Entity/Action.php`
3. `src/Uriae/SuiviBundle/Entity/Evaluation.php`
4. `src/Uriae/SuiviBundle/Entity/Note.php`
5. `src/Uriae/SuiviBundle/Entity/Accompagnement.php`
6. `src/Uriae/SuiviBundle/Entity/FormationInterne.php`
7. `src/Uriae/SuiviBundle/Entity/ParticipationFormation.php`
8. `src/Uriae/SuiviBundle/Entity/Potentiel.php`
9. `src/Uriae/SuiviBundle/Entity/Problematique.php`
10. `src/Uriae/SuiviBundle/Entity/Habilitation.php`
11. `src/Uriae/SuiviBundle/Entity/Rdv.php`
12. `src/Uriae/SuiviBundle/Entity/Event.php`
13. `src/Uriae/SuiviBundle/Entity/TypeAction.php`
14. `src/Uriae/SuiviBundle/Entity/CategorieSavoir.php`
15. `src/Uriae/SuiviBundle/Entity/TypeSavoir.php`
16. `src/Uriae/SuiviBundle/Repository/EvaluationRepository.php`
17. `src/Uriae/SuiviBundle/Repository/FormationInterneRepository.php`
18. `src/Uriae/SuiviBundle/Repository/TypeActionRepository.php`
19. `src/Uriae/SuiviBundle/Repository/HabilitationRepository.php`
20. `src/Uriae/SuiviBundle/Controller/EvaluationController.php`
21. `src/Uriae/SuiviBundle/Controller/FormationInterneController.php`
22. `src/Uriae/SuiviBundle/Controller/AccompagnementController.php`
23. `src/Uriae/SuiviBundle/Model/FormatterBilanIndividuel.php`
24. `src/Uriae/StructureBundle/Controller/GrilleEvaluationController.php`
25. `src/Uriae/StructureBundle/Controller/ReferentielInsertionController.php`
26. `src/Uriae/StructureBundle/Model/DiaryHandler.php`