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

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