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 $categoryCodes * @param list $siteIds */ public function createListQueryBuilder( bool $includeArchived = false, ?string $search = null, array $categoryCodes = [], array $siteIds = [], bool $archivedOnly = false, ): QueryBuilder; }