diff --git a/src/Module/Commercial/Domain/Repository/ClientRepositoryInterface.php b/src/Module/Commercial/Domain/Repository/ClientRepositoryInterface.php index 2bc081b..8bdafc7 100644 --- a/src/Module/Commercial/Domain/Repository/ClientRepositoryInterface.php +++ b/src/Module/Commercial/Domain/Repository/ClientRepositoryInterface.php @@ -33,6 +33,12 @@ interface ClientRepositoryInterface * la liste paginee (ClientProvider) et l'export (ClientExportController) * partagent strictement la meme logique de selection. * + * Contrat = SELECTION uniquement (filtres + tri). Aucun fetch-join to-many : + * l'hydratation des collections affichees est une decision de l'appelant + * (cf. {@see self::hydrateListCollections()}), pour ne pas imposer le cout + * d'un produit cartesien a un consommateur qui ne filtrerait/compterait que + * (ERP-100). + * * @param list $categoryCodes * @param list $siteIds */ @@ -43,4 +49,19 @@ interface ClientRepositoryInterface array $siteIds = [], bool $archivedOnly = false, ): QueryBuilder; + + /** + * Hydrate en lot les collections affichees par le repertoire (categories, + * adresses et leurs sites) sur un jeu de clients DEJA charges, via l'identity + * map Doctrine (memes instances). A appeler apres une selection bornee (page + * courante ou jeu d'export) pour eviter le N+1 a la serialisation, sans + * imposer de fetch-join au QueryBuilder de selection (ERP-100). + * + * Charge les categories et les adresses/sites en DEUX requetes distinctes + * (et non un triple fetch-join) pour ne pas multiplier categories x adresses + * x sites en un seul produit cartesien. + * + * @param list $clients + */ + public function hydrateListCollections(array $clients): void; } diff --git a/src/Module/Commercial/Infrastructure/ApiPlatform/State/Provider/ClientProvider.php b/src/Module/Commercial/Infrastructure/ApiPlatform/State/Provider/ClientProvider.php index 7c47760..1d90cef 100644 --- a/src/Module/Commercial/Infrastructure/ApiPlatform/State/Provider/ClientProvider.php +++ b/src/Module/Commercial/Infrastructure/ApiPlatform/State/Provider/ClientProvider.php @@ -83,8 +83,13 @@ final class ClientProvider implements ProviderInterface // Echappatoire ?pagination=false : collection complete sans Paginator // (cf. convention ERP-72 — utile pour un