feat(technique) : entités + repositories Provider* (ERP-133) #91

Merged
matthieu merged 1 commits from feature/ERP-133-creer-entites-provider into develop 2026-06-12 14:25:29 +00:00
Owner

PR empilée sur ERP-132 (#90) — base = `feature/ERP-132-migrer-schema-bdd-m3` (ERP-132 pas encore mergé dans develop). À rebaser sur develop une fois #90 mergée.

Périmètre (ticket Lesstime #133, M3 § 3.3/3.4/2.12/4.0)

Entités Doctrine + mapping ApiResource (squelette) + repository avec hydratation anti-N+1. Miroir des entités Supplier* (M2), amputé de l'onglet Information et augmenté de provider.sites (M2M direct, RG-3.03).

Créé

  • Provider, ProviderContact, ProviderAddress (simplifiée : pas de addressType/bennes/triageProvider), ProviderRib#[Auditable] + Timestampable/Blamable.
  • ProviderRepositoryInterface + DoctrineProviderRepository : createListQueryBuilder (filtres + tri seuls) + hydrateListCollections anti-N+1 (catégories puis sites en relation directe, requêtes IN bornées séparées — § 2.12).

Contrat de sérialisation (RETEX M1 — 3 maillons)

Groupes posés sur l'entité (source unique) : liste = provider:read+category:read+site:read ; détail = +provider:item:read. Piège booléen isArchived traité (#[Groups]+#[SerializedName] sur le getter). Embed categories[].code/name + sites[].name/postalCode (objet, pas IRI).

Consommation cross-module (§ 2.1)

  • Site/Category via contrats Shared (SiteInterface/CategoryInterface + resolve_target_entities) — comme Supplier, conforme règle ABSOLUE n°1.
  • Référentiels comptables (TvaMode/PaymentDelay/PaymentType/Bank) en relation ORM partagée directe (décision § 2.1, remontée Shared tracée HP-M4-2).

Garde-fous / infra (requis pour le vert)

  • Mapping ORM du module Technique dans doctrine.yaml (sinon les 9 tables provider* vues orphelines → DROP).
  • Tables provider* ajoutées à ColumnCommentsCatalog + ligne dbal:run-sql uq_provider_company_name_active au makefile test-db-setup.
  • 4 libellés audit.entity.technique_* (fr.json) ; ProviderAddress::postalCode whitelisté dans EXCLUDED_LENGTH_MIRROR (Regex CP {4,5}).

Hors périmètre (→ ERP-134)

ApiResource sans ProviderProvider/ProviderProcessor ; sous-entités sans #[ApiResource]. Hydratation effective, gating accounting, cloisonnement par site, normalisation, 409 doublon, RG-3.07/3.08 → ERP-134. Sous-ressources POST/PATCH/DELETE → ticket ultérieur.

Tests

  • `make test` → 589/589 ✓ · `php-cs-fixer` → 0 correction.
  • `schema:validate` : mapping OK ; « not in sync » résiduel strictement homologue à supplier (COMMENT via catalogue + index FK auto-Doctrine), non régressif.
PR **empilée sur ERP-132** (#90) — base = \`feature/ERP-132-migrer-schema-bdd-m3\` (ERP-132 pas encore mergé dans develop). À rebaser sur develop une fois #90 mergée. ## Périmètre (ticket Lesstime #133, M3 § 3.3/3.4/2.12/4.0) Entités Doctrine + mapping ApiResource (squelette) + repository avec hydratation anti-N+1. Miroir des entités `Supplier*` (M2), **amputé de l'onglet Information** et **augmenté de `provider.sites`** (M2M direct, RG-3.03). ### Créé - `Provider`, `ProviderContact`, `ProviderAddress` (simplifiée : pas de `addressType`/`bennes`/`triageProvider`), `ProviderRib` — `#[Auditable]` + Timestampable/Blamable. - `ProviderRepositoryInterface` + `DoctrineProviderRepository` : `createListQueryBuilder` (filtres + tri seuls) + `hydrateListCollections` anti-N+1 (catégories puis **sites en relation directe**, requêtes `IN` bornées séparées — § 2.12). ### Contrat de sérialisation (RETEX M1 — 3 maillons) Groupes posés sur l'entité (source unique) : liste = `provider:read`+`category:read`+`site:read` ; détail = +`provider:item:read`. Piège booléen `isArchived` traité (`#[Groups]`+`#[SerializedName]` sur le getter). Embed `categories[].code/name` + `sites[].name/postalCode` (objet, pas IRI). ### Consommation cross-module (§ 2.1) - Site/Category via contrats Shared (`SiteInterface`/`CategoryInterface` + `resolve_target_entities`) — comme Supplier, conforme règle ABSOLUE n°1. - Référentiels comptables (`TvaMode`/`PaymentDelay`/`PaymentType`/`Bank`) en relation ORM partagée directe (décision § 2.1, remontée Shared tracée HP-M4-2). ### Garde-fous / infra (requis pour le vert) - Mapping ORM du module `Technique` dans `doctrine.yaml` (sinon les 9 tables `provider*` vues orphelines → DROP). - Tables `provider*` ajoutées à `ColumnCommentsCatalog` + ligne `dbal:run-sql uq_provider_company_name_active` au makefile `test-db-setup`. - 4 libellés `audit.entity.technique_*` (fr.json) ; `ProviderAddress::postalCode` whitelisté dans `EXCLUDED_LENGTH_MIRROR` (Regex CP {4,5}). ## Hors périmètre (→ ERP-134) ApiResource **sans** `ProviderProvider`/`ProviderProcessor` ; sous-entités **sans** `#[ApiResource]`. Hydratation effective, gating accounting, cloisonnement par site, normalisation, 409 doublon, RG-3.07/3.08 → ERP-134. Sous-ressources POST/PATCH/DELETE → ticket ultérieur. ## Tests - \`make test\` → **589/589 ✓** · \`php-cs-fixer\` → 0 correction. - \`schema:validate\` : mapping OK ; « not in sync » résiduel strictement homologue à supplier (COMMENT via catalogue + index FK auto-Doctrine), non régressif.
matthieu added the backM3-Prestatairetype/feat labels 2026-06-12 08:34:23 +00:00
matthieu changed target branch from feature/ERP-132-migrer-schema-bdd-m3 to develop 2026-06-12 14:19:51 +00:00
matthieu added 1 commit 2026-06-12 14:24:58 +00:00
feat(technique) : entités + repositories Provider* (ERP-133)
Pull Request — Quality gate / Backend (PHP CS + PHPUnit) (pull_request) Successful in 4m16s
Pull Request — Quality gate / Frontend (lint + Vitest + build) (pull_request) Successful in 1m32s
f8be14a299
- 4 entités Provider / ProviderContact / ProviderAddress / ProviderRib
  (#[Auditable] + Timestampable/Blamable), miroir Supplier* amputé de
  l'onglet Information et augmenté de provider.sites (M2M direct, RG-3.03).
- Contrat de sérialisation à 3 maillons (groupes liste/détail, getter
  isArchived + SerializedName) ; référentiels comptables consommés en
  relation ORM partagée, Site/Category via contrats Shared.
- DoctrineProviderRepository : createListQueryBuilder (filtres + tri) +
  hydratation anti-N+1 categories puis sites (relation directe) en requêtes
  IN bornées séparées.
- Mapping ORM du module Technique (doctrine.yaml), catalogue COMMENT des
  tables provider*, index partiel uq_provider_company_name_active
  (test-db-setup), libellés audit i18n technique_*, whitelist Length du CP
  ProviderAddress.

ApiResource posé en squelette : ProviderProvider / ProviderProcessor
(hydratation effective, gating accounting, cloisonnement site, normalisation,
409, RG-3.07/3.08) relèvent d'ERP-134.
matthieu force-pushed feature/ERP-133-creer-entites-provider from 58474404b4 to f8be14a299 2026-06-12 14:24:58 +00:00 Compare
matthieu merged commit 54d8327fa5 into develop 2026-06-12 14:25:29 +00:00
matthieu deleted branch feature/ERP-133-creer-entites-provider 2026-06-12 14:25:31 +00:00
Sign in to join this conversation.