7.7 KiB
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 aStructure.
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
StructureBundleTownfor city reference. - Path:
src/Uriae/UnionBundle/Entity/Union.php
-
Partner directory
Partenaire+TypePartenaire(many-to-many typing).- Optional
Structurescope blurs pure “union referential” vs “structure-local partner”. - Paths:
src/Uriae/UnionBundle/Entity/Partenaire.php,src/Uriae/UnionBundle/Entity/TypePartenaire.php
-
Ordered catalogs
Conventionnement,ButFormationwithpositionordering.- Paths:
src/Uriae/UnionBundle/Entity/Conventionnement.php,src/Uriae/UnionBundle/Entity/ButFormation.php
-
Exit taxonomy + lifecycle segment (boundary anomaly)
TypeSituationSortieis clearly union-level referential.SituationSortieis employee insertion state: linksParcoursInsertion,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
SuiviBundletaxonomies (AxeTypeAction,CategorieTypeAction,TypeAction) and evaluation grid (TypeSavoir,CategorieSavoir,Savoir) usingStructureBundleform types. - Paths:
src/Uriae/UnionBundle/Controller/ReferentielInsertionController.phpsrc/Uriae/UnionBundle/Controller/GrilleEvaluationController.php
- Controllers under Union manage
Invariants / Concistency
-
src/Uriae/UnionBundle/Entity/Union.php- Sigle, adresse, code postal (length 5), telephone constraints (via
@Telephonefrom Structure bundle).
- Sigle, adresse, code postal (length 5), telephone constraints (via
-
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: ifdateSortieset thentypeSituationSortierequired. - Callback
isDateSortieValid: iftypeSituationSortieset thendateSortierequired. setParcoursInsertion/addContratmaintain bidirectional graph with Employee entities.
- Callback
-
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).
- Position assignment on add for
Cross-context Dependencies
-
Union -> Structure
UnionusesTown.PartenaireoptionalStructure.- 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 (TypeSituationSortiecodes), Bilan/reporting.
- Employee (
DDD Slicing
Treat Union as two conceptual areas:
A) Federation referential (true Union BC)
-
Aggregates (candidate)
UnionOrganizationProfile(currentUnionentity).PartnerDirectory(Partenaire+ types; clarify global vs structure-scoped partners as separate AR or explicitPartnerScopeVO).ConventionnementCatalog,ButFormationCatalog.ExitTypeCatalog(TypeSituationSortieonly).
-
Value objects (candidate)
PartnerLabel,ExitTypeCode,AspExitCodeBySiae(wrap per-SIAE code columns).
-
Domain services
PartnerTypingPolicy(conventionneur-only rules currently enforced in EmployeeFirstHomeshould 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
src/Uriae/UnionBundle/Entity/Union.phpsrc/Uriae/UnionBundle/Repository/UnionRepository.phpsrc/Uriae/UnionBundle/Controller/InformationsController.phpsrc/Uriae/UnionBundle/Entity/Partenaire.phpsrc/Uriae/UnionBundle/Entity/TypePartenaire.phpsrc/Uriae/UnionBundle/Repository/PartenaireRepository.phpsrc/Uriae/UnionBundle/Controller/PartenairesController.phpsrc/Uriae/UnionBundle/Entity/Conventionnement.phpsrc/Uriae/UnionBundle/Entity/ButFormation.phpsrc/Uriae/UnionBundle/Repository/ConventionnementRepository.phpsrc/Uriae/UnionBundle/Repository/ButFormationRepository.phpsrc/Uriae/UnionBundle/Controller/FormationsController.phpsrc/Uriae/UnionBundle/Entity/TypeSituationSortie.phpsrc/Uriae/UnionBundle/Entity/SituationSortie.phpsrc/Uriae/UnionBundle/Repository/SituationSortieRepository.phpsrc/Uriae/UnionBundle/Controller/SituationsSortiesController.phpsrc/Uriae/UnionBundle/Entity/HomepageMessage.phpsrc/Uriae/UnionBundle/Controller/HomepageMessageController.phpsrc/Uriae/UnionBundle/Controller/ReferentielInsertionController.phpsrc/Uriae/UnionBundle/Controller/GrilleEvaluationController.phpsrc/Uriae/UnionBundle/Controller/NatureEmploisController.phpsrc/Uriae/UnionBundle/Controller/SituationsSalariesController.phpsrc/Uriae/UnionBundle/Controller/TypologieSiaeController.phpsrc/Uriae/EmployeeBundle/Entity/ParcoursInsertion.phpsrc/Uriae/EmployeeBundle/Model/SituationSortieUpdater.php