aucun filtre ; * - site courant null (module Sites off / user sans site) -> no-op (l'user voit * tout, decision site-aware.md § 5) ; * - sinon -> liste restreinte aux tickets du site courant, AVANT pagination * (totalItems reflete le perimetre). * * Item (GET /api/weighing_tickets/{id} + provider de PATCH) : * - 404 si introuvable OU soft-delete (deleted_at non null) ; * - 404 si hors perimetre site (ne pas reveler l'existence d'une ligne d'un autre * site — anti-enumeration). * * @implements ProviderInterface */ final class WeighingTicketProvider implements ProviderInterface { public function __construct( #[Autowire(service: 'App\Module\Logistique\Infrastructure\Doctrine\DoctrineWeighingTicketRepository')] private readonly WeighingTicketRepositoryInterface $repository, private readonly Pagination $pagination, private readonly CurrentSiteProviderInterface $currentSiteProvider, private readonly Security $security, ) {} public function provide(Operation $operation, array $uriVariables = [], array $context = []): iterable|Paginator|WeighingTicket|null { if ($operation instanceof CollectionOperationInterface) { return $this->provideCollection($operation, $context); } return $this->provideItem($uriVariables); } /** * @param array $context * * @return list|Paginator */ private function provideCollection(Operation $operation, array $context): array|Paginator { $filters = $context['filters'] ?? []; $search = $filters['search'] ?? null; $qb = $this->repository->createListQueryBuilder(is_string($search) ? $search : null); $this->applyDisplayDateOrder($qb, $filters); $this->applySiteScope($qb); // Echappatoire ?pagination=false : collection complete sans Paginator // (regle n°13 — utile pour alimenter un