feat(technique) : export XLSX du repertoire prestataires (ERP-137) #96

Closed
matthieu wants to merge 1 commits from feature/ERP-137-export-xlsx-prestataires into feature/ERP-136-validations-rg-server-side
Owner

ERP-137 — Export XLSX des prestataires (M3, § 4.6)

Stack par-dessus ERP-136 (base = feature/ERP-136-validations-rg-server-side, non encore mergé sur develop).

Implémentation

  • ProviderExportController (#[AsController]) — route GET /api/providers/export.xlsx avec #[Route(priority: 1)] (règle ABSOLUE, conflit API Platform {id}), #[IsGranted('technique.providers.view')].
  • Mêmes filtres que la liste via ProviderRepositoryInterface::createListQueryBuilder() (archivage, search, categoryCode, siteId) + hydratation batchée (anti N+1, § 2.12).
  • Cloisonnement par site (§ 2.13) : réplique ProviderProvider (bypass_scope / currentSite → applySiteScope()) — un user cloisonné n'exporte que son site.
  • Colonnes : Nom prestataire, Contact principal (Nom+Prénom du contact de plus petit position), Tél principal, Tél secondaire, Email, Catégories (CSV), Sites (relation directe provider.sites), SIREN (omis si pas technique.providers.accounting.view), Date de création.
  • Génération déléguée au SpreadsheetExporterInterface (Shared). Filename repertoire-prestataires-{YYYYMMDD}.xlsx.

Tests

ProviderExportControllerTest — 12 cas / 81 assertions (en-têtes, archivage, search, contact principal, catégories+sites, gating SIREN admin/minimal/absent, dedup multi-catégories, cloisonnement site, 403, 401).

  • make php-cs-fixer-allow-risky → clean
  • make test → OK (647 tests, 3017 assertions)
## ERP-137 — Export XLSX des prestataires (M3, § 4.6) Stack par-dessus ERP-136 (base = `feature/ERP-136-validations-rg-server-side`, non encore mergé sur develop). ### Implémentation - `ProviderExportController` (`#[AsController]`) — route `GET /api/providers/export.xlsx` avec `#[Route(priority: 1)]` (règle ABSOLUE, conflit API Platform `{id}`), `#[IsGranted('technique.providers.view')]`. - Mêmes filtres que la liste via `ProviderRepositoryInterface::createListQueryBuilder()` (archivage, search, categoryCode, siteId) + hydratation batchée (anti N+1, § 2.12). - **Cloisonnement par site (§ 2.13)** : réplique `ProviderProvider` (bypass_scope / currentSite → `applySiteScope()`) — un user cloisonné n'exporte que son site. - Colonnes : Nom prestataire, Contact principal (Nom+Prénom du contact de plus petit `position`), Tél principal, Tél secondaire, Email, Catégories (CSV), **Sites (relation directe `provider.sites`)**, SIREN (omis si pas `technique.providers.accounting.view`), Date de création. - Génération déléguée au `SpreadsheetExporterInterface` (Shared). Filename `repertoire-prestataires-{YYYYMMDD}.xlsx`. ### Tests `ProviderExportControllerTest` — 12 cas / 81 assertions (en-têtes, archivage, search, contact principal, catégories+sites, gating SIREN admin/minimal/absent, dedup multi-catégories, cloisonnement site, 403, 401). - `make php-cs-fixer-allow-risky` → clean - `make test` → OK (647 tests, 3017 assertions)
matthieu added 1 commit 2026-06-12 12:23:02 +00:00
matthieu added the backM3-Prestatairetype/feat labels 2026-06-12 12:23:26 +00:00
Author
Owner

Consolidée dans #100 : toute la pile M3-Prestataire (ERP-134 à ERP-139) a été rebasée sur develop et regroupée dans la MR #100 (mergeable, tests verts). Cette MR intermédiaire est fermée pour ne garder qu'une seule MR ouverte. Les commits de ce ticket restent présents dans #100.

Consolidée dans #100 : toute la pile M3-Prestataire (ERP-134 à ERP-139) a été rebasée sur develop et regroupée dans la MR #100 (mergeable, tests verts). Cette MR intermédiaire est fermée pour ne garder qu'une seule MR ouverte. Les commits de ce ticket restent présents dans #100.
matthieu closed this pull request 2026-06-12 14:37:12 +00:00

Pull request closed

Sign in to join this conversation.