e986980d68
Front : - Bouton « Filtres » (à droite d'Ajouter) ouvrant un drawer accordion (façon audit-log) : Recherche, Catégories (multi), Sites (multi), Statut (archivés). État brouillon → appliqué, 100 % local. Compteur de filtres actifs sur le bouton. - Suppression du toggle « Voir les archivés » (remplacé par le bool du drawer). - Export et liste partagent les mêmes filtres. - useClientsRepository redevient un simple wrapper de usePaginatedList. Back (contrat liste partagé liste + export) : - createListQueryBuilder : categoryCodes[] (OR), siteIds[] (clients ayant ≥1 adresse sur le site), archivedOnly (archives seules, prioritaire sur includeArchived). search inchangé. - ClientProvider + ClientExportController lisent les nouveaux params (valeur unique ou liste ?key[]=). Tests fonctionnels (catégories multi, site, archivés).
47 lines
1.8 KiB
PHP
47 lines
1.8 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Module\Commercial\Domain\Repository;
|
|
|
|
use App\Module\Commercial\Domain\Entity\Client;
|
|
use Doctrine\ORM\QueryBuilder;
|
|
|
|
interface ClientRepositoryInterface
|
|
{
|
|
public function findById(int $id): ?Client;
|
|
|
|
public function save(Client $client): void;
|
|
|
|
/**
|
|
* Construit un QueryBuilder de liste pour le repertoire clients.
|
|
* - Exclut toujours les clients soft-deletes (deleted_at IS NOT NULL, RG-1.24).
|
|
* - Archivage (RG-1.25) :
|
|
* - $archivedOnly = true -> uniquement les archives (is_archived = true) ;
|
|
* - sinon $includeArchived = true -> actifs + archives (echappatoire) ;
|
|
* - sinon (defaut) -> uniquement les actifs (is_archived = false).
|
|
* $archivedOnly a la priorite sur $includeArchived.
|
|
* - Tri par defaut : companyName ASC (RG-1.26).
|
|
* - $search : recherche fuzzy insensible a la casse sur companyName +
|
|
* lastName + email (metacaracteres LIKE echappes). Ignore si null/vide.
|
|
* - $categoryCodes : restreint aux clients possedant au moins une categorie
|
|
* dont le code est dans la liste (OR — ERP-78). Liste vide = pas de filtre.
|
|
* - $siteIds : restreint aux clients ayant au moins une adresse rattachee a
|
|
* l'un des sites donnes (OR — RG-1.10). Liste vide = pas de filtre.
|
|
*
|
|
* Filtrage centralise ICI (et non dans les providers/controllers) pour que
|
|
* la liste paginee (ClientProvider) et l'export (ClientExportController)
|
|
* partagent strictement la meme logique de selection.
|
|
*
|
|
* @param list<string> $categoryCodes
|
|
* @param list<int> $siteIds
|
|
*/
|
|
public function createListQueryBuilder(
|
|
bool $includeArchived = false,
|
|
?string $search = null,
|
|
array $categoryCodes = [],
|
|
array $siteIds = [],
|
|
bool $archivedOnly = false,
|
|
): QueryBuilder;
|
|
}
|