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

148 lines
7.7 KiB
Markdown

# Union Bundle Deep Dive
## Ubiquitous Language
- **Union**: federation-level identity (sigle, organisme, address, contact) stored in `union_informations`.
Path: `src/Uriae/UnionBundle/Entity/Union.php`
- **Partenaire**: partner actor (moral/physical), typed via `TypePartenaire`, optionally scoped to a `Structure`.
Path: `src/Uriae/UnionBundle/Entity/Partenaire.php`
- **TypePartenaire**: partner role label (ordered list).
Path: `src/Uriae/UnionBundle/Entity/TypePartenaire.php`
- **Conventionnement**: ordered conventionnement catalog entry.
Path: `src/Uriae/UnionBundle/Entity/Conventionnement.php`
- **ButFormation**: ordered training-goal catalog entry.
Path: `src/Uriae/UnionBundle/Entity/ButFormation.php`
- **TypeSituationSortie**: exit typology with ASP codes per SIAE type and category constants (`Durable`, `Transition`, etc.).
Path: `src/Uriae/UnionBundle/Entity/TypeSituationSortie.php`
- **SituationSortie**: employee insertion exit segment (dates, type, contracts grouping) tied to `ParcoursInsertion`.
Path: `src/Uriae/UnionBundle/Entity/SituationSortie.php`
- **HomepageMessage**: union-wide homepage banner text.
Path: `src/Uriae/UnionBundle/Entity/HomepageMessage.php`
## Domain Core
- **Union profile aggregate (catalog root)**
- Single-row style configuration for the federation.
- Depends on `StructureBundle` `Town` for city reference.
- Path: `src/Uriae/UnionBundle/Entity/Union.php`
- **Partner directory**
- `Partenaire` + `TypePartenaire` (many-to-many typing).
- Optional `Structure` scope blurs pure “union referential” vs “structure-local partner”.
- Paths: `src/Uriae/UnionBundle/Entity/Partenaire.php`, `src/Uriae/UnionBundle/Entity/TypePartenaire.php`
- **Ordered catalogs**
- `Conventionnement`, `ButFormation` with `position` ordering.
- Paths: `src/Uriae/UnionBundle/Entity/Conventionnement.php`, `src/Uriae/UnionBundle/Entity/ButFormation.php`
- **Exit taxonomy + lifecycle segment (boundary anomaly)**
- `TypeSituationSortie` is clearly union-level referential.
- `SituationSortie` is **employee insertion state**: links `ParcoursInsertion`, `Contrat[]`, and exit type. It lives in Union bundle but behaves as **Employee / insertion journey** domain.
- Paths: `src/Uriae/UnionBundle/Entity/TypeSituationSortie.php`, `src/Uriae/UnionBundle/Entity/SituationSortie.php`
- **Admin referential UI (not Union-owned data)**
- Controllers under Union manage `SuiviBundle` taxonomies (`AxeTypeAction`, `CategorieTypeAction`, `TypeAction`) and evaluation grid (`TypeSavoir`, `CategorieSavoir`, `Savoir`) using `StructureBundle` form types.
- Paths:
- `src/Uriae/UnionBundle/Controller/ReferentielInsertionController.php`
- `src/Uriae/UnionBundle/Controller/GrilleEvaluationController.php`
## Invariants / Concistency
- `src/Uriae/UnionBundle/Entity/Union.php`
- Sigle, adresse, code postal (length 5), telephone constraints (via `@Telephone` from Structure bundle).
- `src/Uriae/UnionBundle/Entity/Partenaire.php`
- Libellé not blank.
- `src/Uriae/UnionBundle/Entity/TypePartenaire.php`, `Conventionnement.php`, `ButFormation.php`
- Name not blank; position field for ordering.
- `src/Uriae/UnionBundle/Entity/TypeSituationSortie.php`
- Libellé not blank; ASP code fields length-capped per SIAE column.
- `src/Uriae/UnionBundle/Entity/SituationSortie.php`
- Callback `isSituationSortieValid`: if `dateSortie` set then `typeSituationSortie` required.
- Callback `isDateSortieValid`: if `typeSituationSortie` set then `dateSortie` required.
- `setParcoursInsertion` / `addContrat` maintain bidirectional graph with Employee entities.
- `src/Uriae/UnionBundle/Controller/NatureEmploisController.php`
- Metier delete allowed only when no contract references that metier.
- `src/Uriae/UnionBundle/Controller/SituationsSalariesController.php`
- Position assignment on add for `ProblemeInsertion` / `DureeAide` (via Employee repositories).
## Cross-context Dependencies
- **Union -> Structure**
- `Union` uses `Town`.
- `Partenaire` optional `Structure`.
- Paths: `src/Uriae/UnionBundle/Entity/Union.php`, `src/Uriae/UnionBundle/Entity/Partenaire.php`
- **Union (entity) -> Employee**
- `SituationSortie` -> `ParcoursInsertion`, `Contrat`.
- Path: `src/Uriae/UnionBundle/Entity/SituationSortie.php`
- **Union (controllers) -> Employee**
- Metier, resource categories, problem types, aide durations.
- Paths: `src/Uriae/UnionBundle/Controller/NatureEmploisController.php`, `src/Uriae/UnionBundle/Controller/SituationsSalariesController.php`
- **Union (controllers) -> Suivi**
- Insertion referential + evaluation grid.
- Paths: `src/Uriae/UnionBundle/Controller/ReferentielInsertionController.php`, `src/Uriae/UnionBundle/Controller/GrilleEvaluationController.php`
- **Downstream consumers**
- Employee (`ParcoursInsertion`, `Contrat`, `FirstHome`), Suivi (`Partenaire`, `ButFormation`), Asp (`TypeSituationSortie` codes), Bilan/reporting.
## DDD Slicing
Treat **Union** as two conceptual areas:
### A) Federation referential (true Union BC)
- **Aggregates (candidate)**
- `UnionOrganizationProfile` (current `Union` entity).
- `PartnerDirectory` (`Partenaire` + types; clarify global vs structure-scoped partners as separate AR or explicit `PartnerScope` VO).
- `ConventionnementCatalog`, `ButFormationCatalog`.
- `ExitTypeCatalog` (`TypeSituationSortie` only).
- **Value objects (candidate)**
- `PartnerLabel`, `ExitTypeCode`, `AspExitCodeBySiae` (wrap per-SIAE code columns).
- **Domain services**
- `PartnerTypingPolicy` (conventionneur-only rules currently enforced in Employee `FirstHome` should align with Union vocabulary).
### B) Relocate out of Union (employee insertion)
- **SituationSortie** as part of **Employee / InsertionJourney** aggregate (or its own AR owned by Employee context), with Union only providing `ExitTypeId` / published catalog.
- **Application layer**
- “Union admin” use cases that today edit Suivi/Employee referentials should become explicit **application services** in the owning BC, callable from Union UI via APIs or shared kernel interfaces—not direct entity manipulation from Union controllers.
## Reading Order
1. `src/Uriae/UnionBundle/Entity/Union.php`
2. `src/Uriae/UnionBundle/Repository/UnionRepository.php`
3. `src/Uriae/UnionBundle/Controller/InformationsController.php`
4. `src/Uriae/UnionBundle/Entity/Partenaire.php`
5. `src/Uriae/UnionBundle/Entity/TypePartenaire.php`
6. `src/Uriae/UnionBundle/Repository/PartenaireRepository.php`
7. `src/Uriae/UnionBundle/Controller/PartenairesController.php`
8. `src/Uriae/UnionBundle/Entity/Conventionnement.php`
9. `src/Uriae/UnionBundle/Entity/ButFormation.php`
10. `src/Uriae/UnionBundle/Repository/ConventionnementRepository.php`
11. `src/Uriae/UnionBundle/Repository/ButFormationRepository.php`
12. `src/Uriae/UnionBundle/Controller/FormationsController.php`
13. `src/Uriae/UnionBundle/Entity/TypeSituationSortie.php`
14. `src/Uriae/UnionBundle/Entity/SituationSortie.php`
15. `src/Uriae/UnionBundle/Repository/SituationSortieRepository.php`
16. `src/Uriae/UnionBundle/Controller/SituationsSortiesController.php`
17. `src/Uriae/UnionBundle/Entity/HomepageMessage.php`
18. `src/Uriae/UnionBundle/Controller/HomepageMessageController.php`
19. `src/Uriae/UnionBundle/Controller/ReferentielInsertionController.php`
20. `src/Uriae/UnionBundle/Controller/GrilleEvaluationController.php`
21. `src/Uriae/UnionBundle/Controller/NatureEmploisController.php`
22. `src/Uriae/UnionBundle/Controller/SituationsSalariesController.php`
23. `src/Uriae/UnionBundle/Controller/TypologieSiaeController.php`
24. `src/Uriae/EmployeeBundle/Entity/ParcoursInsertion.php`
25. `src/Uriae/EmployeeBundle/Model/SituationSortieUpdater.php`