← Back
Editing: OptionsTrait.php
<?php namespace App\Repository; use App\Entity\Adresse; use App\Session\Filter\Role\OrganizationSessionFilters; use App\Session\Filter\Role\SupervisorSessionFilters; use App\Session\Filter\SessionFiltersContainer; use Doctrine\ORM\Query\Expr\Join; use Doctrine\ORM\QueryBuilder; use Symfony\Contracts\Service\Attribute\Required; trait OptionsTrait { private ?SessionFiltersContainer $sessionFiltersContainer; #[Required] public function setSessionFiltersContainer(SessionFiltersContainer $sessionFiltersContainer): void { $this->sessionFiltersContainer = $sessionFiltersContainer; } private function addOptions(QueryBuilder $qb, bool $previous = false, array $forceOptions = []): QueryBuilder { $prevStartDate = $prevEndDate = null; if (isset($forceOptions['limit'])) { $qb->setMaxResults($forceOptions['limit']); unset($forceOptions['limit']); } if (isset($forceOptions['sort'])) { $order = $forceOptions['sort'][1] ?? 'asc'; $qb->orderBy($forceOptions['sort'][0], $order); unset($forceOptions['sort']); } $filters = $this->sessionFiltersContainer->clone(); $filters->override($forceOptions); if (null !== $filters->getDateRange()) { [$prevStartDate, $prevEndDate] = $this->getPrevDateRangeFromDate( $filters->getDateRange()->getDateStart(), $filters->getDateRange()->getDateEnd() ); } if (false === $previous && null !== $filters->getDateRange()?->getDateStart() && !$qb->getParameter( 'dateStart' )) { $qb->andWhere('c.dateRealisation >= :dateStart') ->setParameter('dateStart', $filters->getDateRange()->getDateStart()); } if (false === $previous && null !== $filters->getDateRange()?->getDateEnd() && !$qb->getParameter('dateEnd')) { $qb->andWhere('c.dateRealisation < :dateEnd') ->setParameter('dateEnd', $filters->getDateRange()->getDateEnd()); } if (true === $previous && null !== $prevStartDate && !$qb->getParameter('dateStart')) { $qb->andWhere('c.dateRealisation >= :dateStart') ->setParameter('dateStart', $prevStartDate); } if (true === $previous && null !== $prevEndDate && !$qb->getParameter('dateEnd')) { $qb->andWhere('c.dateRealisation < :dateEnd') ->setParameter('dateEnd', $prevEndDate); } if (null !== $filters->getSolution() && !$qb->getParameter('solution')) { $qb->andWhere('c.solution = :solution') ->setParameter('solution', $filters->getSolution()); } if ($filters instanceof SupervisorSessionFilters) { $this->addSupervisorOptions($qb, $filters); } if ($filters instanceof OrganizationSessionFilters) { $this->addOrganizationOptions($qb, $filters); } return $qb; } private function addSupervisorOptions(QueryBuilder $qb, SupervisorSessionFilters $filters): void { if (null !== $filters->getCity()) { $qb->andWhere('a.ville LIKE :city') ->setParameter('city', $filters->getCity()); } if (null !== $filters->getSector()) { $qb ->andWhere('a.manager = :sector') ->setParameter('sector', $filters->getSector()); } if (null !== $filters->getProvider()) { $aliases = $qb->getAllAliases(); if (!in_array('p', $aliases)) { $qb->leftJoin('a.prestataires', 'p'); } $qb ->andWhere('p.id IN (:providers)') ->setParameter('providers', [$filters->getProvider()->getId()]); } if (null !== $filters->getAddress()) { if ($filters->getAddress() instanceof Adresse) { $qb->andWhere('a = :address') ->setParameter('address', $filters->getAddress()); } else { $qb->andWhere('CONCAT(a.numero, \' \', a.voie) LIKE :address') ->setParameter('address', $filters->getAddress()); } } if (null !== $filters->getElevator()) { $qb->andWhere('a.numeroAscenseur LIKE :elevator') ->setParameter('elevator', $filters->getElevator()); } if (null !== $filters->getAgent()) { $aliases = $qb->getAllAliases(); if (!in_array('ag', $aliases)) { $qb ->leftJoin('c.agent', 'ag'); } $qb ->andWhere('ag.id = :agent') ->setParameter('agent', $filters->getAgent()); } } private function addOrganizationOptions(QueryBuilder $qb, OrganizationSessionFilters $filters): void { // OrganizationSessionFilters extends SupervisorSessionFilters, so apply those filters too $this->addSupervisorOptions($qb, $filters); if (null !== $filters->getAgency()) { $qb->andWhere('a.agency IN (:agency)') ->setParameter('agency', $filters->getAgency()->getId()); } } private function leftJoinControlsWithOptions(QueryBuilder $qb, string $alias, ?bool $previous = false): QueryBuilder { $filters = $this->sessionFiltersContainer->getCurrent(); $dateControlsCondition = $qb->expr()->andX( $qb->expr()->gte('c.dateRealisation', ':dateStart'), $qb->expr()->lte('c.dateRealisation', ':dateEnd'), ); $solutionCondition = $qb->expr()->andX( $qb->expr()->eq('c.solution', ':solution'), $dateControlsCondition ); $controlsCondition = $qb->expr()->andX( $qb->expr()->eq('c.valide', ':valid'), $solutionCondition ); $qb ->leftJoin($alias, 'c', Join::WITH, $controlsCondition) ->setParameter('solution', $filters->getSolution()) ->setParameter('valid', true); if (false === $previous) { $qb ->setParameter('dateStart', $filters->getDateRange()->getDateStart()) ->setParameter('dateEnd', $filters->getDateRange()->getDateEnd()); } else { $previousDateRange = $this->getPrevDateRangeFromDate( $filters->getDateRange()->getDateStart(), $filters->getDateRange()->getDateEnd() ); $qb ->setParameter('dateStart', $previousDateRange[0]) ->setParameter('dateEnd', $previousDateRange[1]); } return $qb; } /** * @return array{\DateTimeInterface, \DateTimeInterface} */ private function getPrevDateRangeFromDate(\DateTimeInterface $startDate, \DateTimeInterface $endDate): array { $prevStartDate = clone $startDate; $prevEndDate = clone $startDate; $interval = $startDate->diff($endDate); return [$prevStartDate->sub($interval), $prevEndDate]; } }
Save File
Cancel