From 0f62deb80f41c6f29cdff34f2c923057c52f71dd Mon Sep 17 00:00:00 2001 From: Matthieu Date: Tue, 16 Jun 2026 14:38:33 +0200 Subject: [PATCH] feat(transport) : filtre archivedOnly sur le repertoire (coherence M1/M2/M3) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Aligne CarrierProvider/DoctrineCarrierRepository sur Client/Supplier/Provider : ?archivedOnly=true n'expose que les archives (prioritaire sur includeArchived), pour que le toggle « Voir les archives » du front (ERP-173/ERP-164) soit operant. Parametre optionnel en fin de signature : retro-compatible avec les appels existants. --- .../Domain/Repository/CarrierRepositoryInterface.php | 8 ++++++++ .../ApiPlatform/State/Provider/CarrierProvider.php | 6 +++++- .../Infrastructure/Doctrine/DoctrineCarrierRepository.php | 7 ++++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/Module/Transport/Domain/Repository/CarrierRepositoryInterface.php b/src/Module/Transport/Domain/Repository/CarrierRepositoryInterface.php index 4ff6f88..13466f0 100644 --- a/src/Module/Transport/Domain/Repository/CarrierRepositoryInterface.php +++ b/src/Module/Transport/Domain/Repository/CarrierRepositoryInterface.php @@ -23,11 +23,19 @@ interface CarrierRepositoryInterface * Fetch-join uniquement qualimatCarrier (ManyToOne, sur — § 2.11) : la liste * n'embarque aucune sous-collection. Tri par defaut name ASC. * + * Perimetre d'archivage (aligne sur ClientProvider/SupplierProvider/ + * ProviderProvider — toggle « Voir les archives » d'ERP-173) : + * - $archivedOnly = true -> uniquement les archives (is_archived = true) ; + * - sinon $includeArchived = true -> actifs + archives (echappatoire) ; + * - par defaut -> actifs seuls (is_archived = false). + * $archivedOnly a la priorite sur $includeArchived. + * * @param list $certificationTypes filtre repetable (OR) sur certificationType */ public function createListQueryBuilder( bool $includeArchived = false, ?string $search = null, array $certificationTypes = [], + bool $archivedOnly = false, ): QueryBuilder; } diff --git a/src/Module/Transport/Infrastructure/ApiPlatform/State/Provider/CarrierProvider.php b/src/Module/Transport/Infrastructure/ApiPlatform/State/Provider/CarrierProvider.php index 3c2b02f..f091400 100644 --- a/src/Module/Transport/Infrastructure/ApiPlatform/State/Provider/CarrierProvider.php +++ b/src/Module/Transport/Infrastructure/ApiPlatform/State/Provider/CarrierProvider.php @@ -23,6 +23,8 @@ use Symfony\Component\DependencyInjection\Attribute\Autowire; * Collection (GET /api/carriers) : * - exclut par defaut les archives (is_archived = true) ET les soft-deletes ; * - ?includeArchived=true reintegre les archives (soft-deletes toujours exclus) ; + * - ?archivedOnly=true n'expose QUE les archives (prioritaire sur includeArchived, + * aligne sur Client/Supplier/Provider — toggle « Voir les archives » ERP-173) ; * - filtres ?search= (fuzzy name) et ?certificationType= (repetable) ; * - tri par defaut name ASC ; pagination Hydra (regle n°13) + echappatoire * ?pagination=false. @@ -58,6 +60,7 @@ final class CarrierProvider implements ProviderInterface { $filters = $context['filters'] ?? []; $includeArchived = $this->readBool($filters['includeArchived'] ?? false); + $archivedOnly = $this->readBool($filters['archivedOnly'] ?? false); $search = $filters['search'] ?? null; $certificationTypes = $this->readStringList($filters['certificationType'] ?? []); @@ -65,11 +68,12 @@ final class CarrierProvider implements ProviderInterface $includeArchived, is_string($search) ? $search : null, $certificationTypes, + $archivedOnly, ); // Echappatoire ?pagination=false : collection complete (selects front). if (!$this->pagination->isEnabled($operation, $context)) { - /** @var list $carriers */ + // @var list $carriers return $qb->getQuery()->getResult(); } diff --git a/src/Module/Transport/Infrastructure/Doctrine/DoctrineCarrierRepository.php b/src/Module/Transport/Infrastructure/Doctrine/DoctrineCarrierRepository.php index bda439a..a39eca5 100644 --- a/src/Module/Transport/Infrastructure/Doctrine/DoctrineCarrierRepository.php +++ b/src/Module/Transport/Infrastructure/Doctrine/DoctrineCarrierRepository.php @@ -35,6 +35,7 @@ class DoctrineCarrierRepository extends ServiceEntityRepository implements Carri bool $includeArchived = false, ?string $search = null, array $certificationTypes = [], + bool $archivedOnly = false, ): QueryBuilder { // Fetch-join de la SEULE relation ManyToOne qualimatCarrier (sur, pas de // cartesien) pour exposer statut/date de validite QUALIMAT en liste sans @@ -47,7 +48,11 @@ class DoctrineCarrierRepository extends ServiceEntityRepository implements Carri ; // Pas de cloisonnement par site (§ 2.3) : referentiel global. - if (!$includeArchived) { + // Perimetre d'archivage : archivedOnly prioritaire sur includeArchived + // (jumeau de DoctrineProviderRepository — toggle « Voir les archives »). + if ($archivedOnly) { + $qb->andWhere('c.isArchived = true'); + } elseif (!$includeArchived) { $qb->andWhere('c.isArchived = false'); }