feat(commercial) : export XLSX fournisseurs (ERP-91) #70
Reference in New Issue
Block a user
Delete Branch "feature/ERP-91-export-xlsx-m2"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Export XLSX du répertoire fournisseurs (spec-back M2 § 4.6), jumeau de l'export client M1. Stack : cible
feature/ERP-90-rbac-fournisseurs(ERP-84→91 non encore mergés dans develop).Périmètre
SupplierExportControlleravec#[Route(priority: 1)](anti-conflit API Platform{id}) +is_granted('commercial.suppliers.view').includeArchived/archivedOnly/search/categoryCode/siteId) viacreateListQueryBuilder()partagé avec leSupplierProvider; non archivés par défaut.SupplierContactde plus petitposition, ERP-106), Tél principal, Tél secondaire, Email, Catégories (CSV), Sites (CSV), SIREN omis sansaccounting.view, Date de création.repertoire-fournisseurs-{YYYYMMDD}.xlsx.hydrateContacts()ajouté au repository : chargement batché des contacts en une requêteIN(anti-N+1). Méthode dédiée à l'export — la liste paginée n'embarque pas les contacts, on ne lui impose pas ce coût.Correctif hors-périmètre (signalé)
Tables
supplier*ajoutées àColumnCommentsCatalog: leursCOMMENT ON COLUMN(posés par la migration ERP-85) étaient dropés par leschema:update --forcedutest-db-setupet non restaurés (catalogue = source rejouée parapp:apply-column-comments), cassantColumnsHaveSqlCommentTestdès un re-setup de la base de test. Trou laissé par ERP-85/86, vert tant que personne ne re-setup la base.Tests
SupplierExportControllerTest(9 cas) : réponse/filename, exclusion archives, filtre search, contact principal, colonnes catégories/sites, gating SIREN avec/sansaccounting.view, 403, 401.make test: 508 tests / 2035 assertions, 0 échec.php-cs-fixerclean.Review MR #70 — remarques (non bloquantes, cosmétiques)
Verdict : PR propre, jumeau fidèle de l'export client M1. Tests verts (
SupplierExportControllerTest9/9,ColumnsHaveSqlCommentTestOK), catalogueColumnCommentsCatalogvérifié colonne par colonne contre la migrationVersion20260605130000. Rien à corriger impérativement.Deux remarques mineures :
Tri redondant dans
hydrateContacts(DoctrineSupplierRepository.php:124) — leORDER BY sc.position ASCde la requête est doublé par leusort()deprincipalContact()(SupplierExportController.php:192). Le commentaire « pour que le contact principal soit déterministe à l'export » est un peu trompeur : c'est leusortqui décide réellement. On peut retirer l'orderBy(travail DB inutile) ou retirer leusort.Contact principal non déterministe à
positionégale (SupplierExportController.php:192-197) — ni la requête ni leusortn'ont de critère secondaire (ex.id). Si deux contacts partagent la mêmeposition, le contact principal retenu est arbitraire d'un run à l'autre. Cas limite (positions normalement distinctes), faible sévérité — un tiebreaker$a->getPosition() <=> $b->getPosition() ?: $a->getId() <=> $b->getId()lèverait le doute.Export XLSX du répertoire fournisseurs (spec § 4.6), jumeau de l'export client M1. - SupplierExportController avec #[Route(priority: 1)] (anti-conflit API Platform {id}), is_granted('commercial.suppliers.view'). Mêmes filtres que la liste (includeArchived/archivedOnly/search/categoryCode/siteId) via createListQueryBuilder() partagé avec le SupplierProvider ; non archivés par défaut. - Colonnes : Nom, Contact principal (SupplierContact de plus petit position — ERP-106), Tél principal/secondaire, Email, Catégories (CSV), Sites (CSV), SIREN (omis sans accounting.view), Date de création. - hydrateContacts() ajouté au repository (chargement batché des contacts en une requête IN, anti-N+1) — méthode dédiée à l'export, la liste paginée n'embarque pas les contacts. - Tables supplier* ajoutées à ColumnCommentsCatalog : leurs COMMENT (posés par la migration ERP-85) étaient dropés par le schema:update --force du test-db-setup et non restaurés, cassant ColumnsHaveSqlCommentTest dès un re-setup de la base de test. - Test fonctionnel SupplierExportControllerTest (9 cas).e917c413dctoc6a0a51810