feat(transport) : filtre archivedOnly sur le repertoire (coherence M1/M2/M3)
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.
This commit is contained in:
@@ -23,11 +23,19 @@ interface CarrierRepositoryInterface
|
|||||||
* Fetch-join uniquement qualimatCarrier (ManyToOne, sur — § 2.11) : la liste
|
* Fetch-join uniquement qualimatCarrier (ManyToOne, sur — § 2.11) : la liste
|
||||||
* n'embarque aucune sous-collection. Tri par defaut name ASC.
|
* 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<string> $certificationTypes filtre repetable (OR) sur certificationType
|
* @param list<string> $certificationTypes filtre repetable (OR) sur certificationType
|
||||||
*/
|
*/
|
||||||
public function createListQueryBuilder(
|
public function createListQueryBuilder(
|
||||||
bool $includeArchived = false,
|
bool $includeArchived = false,
|
||||||
?string $search = null,
|
?string $search = null,
|
||||||
array $certificationTypes = [],
|
array $certificationTypes = [],
|
||||||
|
bool $archivedOnly = false,
|
||||||
): QueryBuilder;
|
): QueryBuilder;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ use Symfony\Component\DependencyInjection\Attribute\Autowire;
|
|||||||
* Collection (GET /api/carriers) :
|
* Collection (GET /api/carriers) :
|
||||||
* - exclut par defaut les archives (is_archived = true) ET les soft-deletes ;
|
* - exclut par defaut les archives (is_archived = true) ET les soft-deletes ;
|
||||||
* - ?includeArchived=true reintegre les archives (soft-deletes toujours exclus) ;
|
* - ?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) ;
|
* - filtres ?search= (fuzzy name) et ?certificationType= (repetable) ;
|
||||||
* - tri par defaut name ASC ; pagination Hydra (regle n°13) + echappatoire
|
* - tri par defaut name ASC ; pagination Hydra (regle n°13) + echappatoire
|
||||||
* ?pagination=false.
|
* ?pagination=false.
|
||||||
@@ -58,6 +60,7 @@ final class CarrierProvider implements ProviderInterface
|
|||||||
{
|
{
|
||||||
$filters = $context['filters'] ?? [];
|
$filters = $context['filters'] ?? [];
|
||||||
$includeArchived = $this->readBool($filters['includeArchived'] ?? false);
|
$includeArchived = $this->readBool($filters['includeArchived'] ?? false);
|
||||||
|
$archivedOnly = $this->readBool($filters['archivedOnly'] ?? false);
|
||||||
$search = $filters['search'] ?? null;
|
$search = $filters['search'] ?? null;
|
||||||
$certificationTypes = $this->readStringList($filters['certificationType'] ?? []);
|
$certificationTypes = $this->readStringList($filters['certificationType'] ?? []);
|
||||||
|
|
||||||
@@ -65,11 +68,12 @@ final class CarrierProvider implements ProviderInterface
|
|||||||
$includeArchived,
|
$includeArchived,
|
||||||
is_string($search) ? $search : null,
|
is_string($search) ? $search : null,
|
||||||
$certificationTypes,
|
$certificationTypes,
|
||||||
|
$archivedOnly,
|
||||||
);
|
);
|
||||||
|
|
||||||
// Echappatoire ?pagination=false : collection complete (selects front).
|
// Echappatoire ?pagination=false : collection complete (selects front).
|
||||||
if (!$this->pagination->isEnabled($operation, $context)) {
|
if (!$this->pagination->isEnabled($operation, $context)) {
|
||||||
/** @var list<Carrier> $carriers */
|
// @var list<Carrier> $carriers
|
||||||
return $qb->getQuery()->getResult();
|
return $qb->getQuery()->getResult();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ class DoctrineCarrierRepository extends ServiceEntityRepository implements Carri
|
|||||||
bool $includeArchived = false,
|
bool $includeArchived = false,
|
||||||
?string $search = null,
|
?string $search = null,
|
||||||
array $certificationTypes = [],
|
array $certificationTypes = [],
|
||||||
|
bool $archivedOnly = false,
|
||||||
): QueryBuilder {
|
): QueryBuilder {
|
||||||
// Fetch-join de la SEULE relation ManyToOne qualimatCarrier (sur, pas de
|
// Fetch-join de la SEULE relation ManyToOne qualimatCarrier (sur, pas de
|
||||||
// cartesien) pour exposer statut/date de validite QUALIMAT en liste sans
|
// 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.
|
// 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');
|
$qb->andWhere('c.isArchived = false');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user