# 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`