← Back
Editing: ControleRepository.php
<?php namespace App\Repository; use App\Entity\Adresse; use App\Entity\Agency; use App\Entity\Controle; use App\Entity\Organization; use App\Entity\Prestataire; use App\Service\SolutionService; use App\Service\Utils; use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository; use Doctrine\Common\Collections\Collection; use Doctrine\ORM\NonUniqueResultException; use Doctrine\ORM\NoResultException; use Doctrine\ORM\QueryBuilder; use Doctrine\Persistence\ManagerRegistry; use Symfony\Component\Form\FormInterface; use Symfony\Component\Security\Core\User\UserInterface; class ControleRepository extends ServiceEntityRepository { use OptionsTrait; public function __construct( ManagerRegistry $registry, private readonly Utils $utils, private readonly SolutionService $solution ) { parent::__construct($registry, Controle::class); } public function getQueryByAgencies(array $agenciesId): QueryBuilder { $qb = $this->createQueryBuilder('c') ->leftJoin('c.adresse', 'a') ->where('a.agency IN ('.implode(',', $agenciesId).')') ->andWhere('c.valide = :valid') ->setParameter('valid', true); return $this->addOptions($qb); } /** * @throws \Exception */ public function getControlesQueryBuilder(UserInterface $manager, ?FormInterface $filters = null): QueryBuilder { $qb = $this->createQueryBuilder('c'); $qb ->leftJoin('c.agent', 'a') ->join('c.adresse', 'ad', 'WITH', 'ad.solution = :solution') ->where('c.valide = :valid') ->andWhere($qb->expr()->orX('a.manager = :manager', 'c.agent = :manager', 'ad.manager = :manager')) ->andWhere('c.solution = :solution') ->orderBy('c.dateRealisation', 'desc') ->setParameter('valid', true) ->setParameter('manager', $manager) ->setParameter('solution', $this->solution->getCurrent()); if ($filters && $filters->getData()) { $data = $filters->getData(); if ($data['dateRealisation']) { $dates = preg_replace( '#^(\d+)/(\d+)/(\d+) - (\d+)/(\d+)/(\d+)$#', '$3-$2-$1 - $6-$5-$4', $data['dateRealisation'] ); $dates = explode(' - ', $dates); $from = new \DateTime($dates[0]); $to = new \DateTime($dates[1]); $to->add(new \DateInterval('P1D')); $qb->andWhere( $qb->expr()->between('c.dateRealisation', ':from', ':to') ) ->setParameter('from', $from) ->setParameter('to', $to); } if ($data['isContradictory']) { $qb->andWhere('c.isContradictory = :isContradictory') ->setParameter('isContradictory', $data['isContradictory']); } if ($data['address']) { $qb->andWhere('c.adresse = :address') ->setParameter('address', $data['address']); } if ($data['agent']) { $qb->andWhere('c.agent = :agent') ->setParameter('agent', $data['agent']); } if ($data['isTenant']) { $qb->andWhere('a.roles LIKE :roleTenant') ->setParameter('roleTenant', '%ROLE_TENANT%'); } } return $qb; } /** * @param int[] $agencies */ public function incidenceByAgenciesByMonth( array $agencies = [], ?UserInterface $user = null, ?Adresse $adresse = null, bool $previous = false, array $options = [] ): array { $qb = $this->createQueryBuilder('c') ->select('COUNT(al.id) / COUNT(c) as incidence') ->addSelect('DATE_FORMAT(c.dateRealisation, \'%Y-%m\') as month') ->leftJoin('c.adresse', 'a') ->leftJoin('c.alertes', 'al') ->andWhere('c.valide = :valide') ->setParameter('valide', true) ->groupBy('month'); if (!empty($agencies)) { $qb->andWhere('a.agency IN ('.implode(',', $agencies).')'); } if (null !== $adresse) { $qb->andWhere('a = :address') ->setParameter('address', $adresse); } if ($user && in_array('ROLE_MANAGER', $user->getRoles())) { $qb->andWhere('a.manager = :manager'); $qb->setParameter('manager', $user); } if ($user && in_array('ROLE_AGENT', $user->getRoles())) { $qb->andWhere('c.agent = :agent'); $qb->setParameter('agent', $user); } $qb = $this->addOptions($qb, $previous, $options); return $qb->getQuery()->getResult(); } /** * @return array<array-key, array{nbControls: int, month: string, nbAddresses: int}> */ public function countControlesByAgenciesByMonth( array $agenciesId, bool $groupProvider = true, bool $previous = false, ?Adresse $address = null, array $options = [] ): array { $qb = $this->createQueryBuilder('c') ->select('COUNT(c) as nbControls') ->addSelect('DATE_FORMAT(c.dateRealisation, \'%Y-%m\') as month') ->addSelect('COUNT(DISTINCT(a)) as nbAddresses') ->leftJoin('c.adresse', 'a') ->where('a.agency IN ('.implode(',', $agenciesId).')') ->andWhere('c.valide = 1') ->groupBy('month'); if ($groupProvider) { $qb ->addSelect('p.id as customId') ->addSelect('p.nom as name') ->leftJoin('a.prestataires', 'p') ->addGroupBy('p'); } if ($address instanceof Adresse) { $qb ->andWhere('c.adresse = :address') ->setParameter('address', $address); } $qb = $this->addOptions($qb, $previous, $options); return $qb->getQuery()->getResult(); } public function getSupervisorAverageNoteByAgencyByMonth( ?Organization $organization = null, ?Agency $agency = null, ?Adresse $address = null ): array { $qb = $this->createQueryBuilder('c') ->select('AVG(c.averageNote) as avgNote') ->addSelect('DATE_FORMAT(c.dateRealisation, \'%Y-%m\') as month') ->join('c.adresse', 'a') ->where('c.valide = 1') ->orderBy('c.dateRealisation'); if (null !== $agency) { $qb->andWhere('a.agency = :agency') ->setParameter('agency', $agency); } if (null !== $organization) { $qb ->join('a.agency', 'ag') ->andWhere('ag.organization = :organization') ->setParameter('organization', $organization); } if (null !== $address) { $qb->andWhere('a = :address') ->setParameter('address', $address); } $qb = $this->addOptions($qb); $qb->groupBy('month'); return $qb ->getQuery() ->getResult(); } public function fetchSupervisorDataByAgencyByMonth(Agency $agency): array { $qb = $this->createQueryBuilder('c'); $qb ->select('AVG(c.averageNote) as avgNote') ->addSelect('COUNT(c) as cntControles') ->addSelect('COUNT(al.id) as cntAlertes') ->addSelect('DATE_FORMAT(c.dateRealisation, \'%Y-%m\') as month') ->join('c.adresse', 'a') ->leftJoin('c.alertes', 'al') ->where('a.agency = :agency') ->andWhere('c.valide = 1') ->orderBy('c.dateRealisation') ->setParameter('agency', $agency); $qb = $this->addOptions($qb); $qb->groupBy('month'); return $qb ->getQuery() ->getResult(); } public function fetchOrganizationDataByAgencyByMonth(array $agenciesId): array { $qb = $this->createQueryBuilder('c') ->select('AVG(c.averageNote) as avgNote') ->addSelect('COUNT(c) as cntControles') ->addSelect('COUNT(al.id) as cntAlertes') ->addSelect('DATE_FORMAT(c.dateRealisation, \'%Y-%m\') as month') ->join('c.adresse', 'a') ->leftJoin('c.alertes', 'al') ->where('a.agency IN ('.implode(',', $agenciesId).')') ->andWhere('c.valide = 1') ->orderBy('c.dateRealisation'); $qb = $this->addOptions($qb); $qb->groupBy('month'); return $qb ->getQuery() ->getResult(); } /** * @return Controle[] */ public function findPrestaAlerts(Prestataire $prestataire): array { return $this->createQueryBuilder('c') ->leftJoin('c.adresse', 'ad') ->leftJoin('c.alertes', 'al') ->leftJoin('ad.prestataires', 'p') ->andWhere('p = :prestataire') ->andWhere('COUNT(c.id) > 0') ->andWhere('al.prestataire = :prestataire') ->setParameter('prestataire', $prestataire) ->getQuery() ->getResult(); } public function getLastControlDoneByAdresse(Adresse $address): Collection { return $this->createQueryBuilder('c') ->where('c.adresse = :adress') ->andWhere('c.dateRealisation is not null') ->setParameter('adresse', $address) ->orderBy('c.dateRealisation', 'DESC') ->setMaxResults(1) ->getQuery() ->getResult(); } public function getControlsByAgenciesByDay(array $agenciesId): array { $qb = $this->createQueryBuilder('c') ->select('COUNT(c.id) as cnt') ->addSelect('DAYOFWEEK(c.dateRealisation) as day') ->leftJoin('c.adresse', 'a') ->where('c.valide = :valid') ->andWhere('a.agency IN ('.implode(',', $agenciesId).')') ->groupBy('day') ->orderBy('WEEKDAY(c.dateRealisation)') ->setParameter('valid', true); $qb = $this->addOptions($qb); return $qb->getQuery()->getResult(); } public function getControlsTimeByAgenciesByMonth(array $agenciesId, bool $previous = false): array { $qb = $this->createQueryBuilder('c') ->select('AVG(TIMEDIFF(c.dateRealisation, c.createdAt)) as doneTime') ->addSelect('DATE_FORMAT(c.dateRealisation, \'%Y-%m\') as month') ->leftJoin('c.adresse', 'a') ->where('a.agency IN ('.implode(',', $agenciesId).')') ->andWhere('c.valide = :valid') ->groupBy('month') ->setParameter('valid', true); $qb = $this->addOptions($qb, $previous); return $qb->getQuery()->getResult(); } /** * @return array<array-key, array{averageNote: float, numero: string, voie: string, codePostal: string, ville: string}> */ public function getAverageNoteByAgencies(array $agenciesId, bool $previous = false, array $options = []) { $qb = $this->createQueryBuilder('c') ->select('AVG(c.averageNote) as averageNote, a.numero, a.voie, a.codePostal, a.ville') ->leftJoin('c.adresse', 'a') ->where('a.agency IN ('.implode(',', $agenciesId).')') ->andWhere('c.averageNote > 0') ->groupBy('c.adresse') ->orderBy('averageNote', 'ASC') ->setMaxResults(5); $qb = $this->addOptions($qb, $previous, $options); return $qb->getQuery()->getResult(); } /** * @return array<array-key, array{averageNote: float, numero: string, voie: string, codePostal: string, ville: string}> */ public function getAverageNoteByManagerOrAgent(UserInterface $user, array $options = []): array { $qb = $this->createQueryBuilder('c') ->select('AVG(c.averageNote) as averageNote, a.numero, a.voie, a.codePostal, a.ville') ->leftJoin('c.adresse', 'a'); if (in_array('ROLE_MANAGER', $user->getRoles())) { $qb ->where('a.manager = :manager') ->setParameter('manager', $user); } if (in_array('ROLE_AGENT', $user->getRoles())) { $qb ->where('c.agent = :agent') ->setParameter('agent', $user); } $qb ->andWhere('c.averageNote > 0') ->groupBy('c.adresse') ->orderBy('averageNote', 'ASC') ->setMaxResults(5); $qb = $this->addOptions($qb, false, $options); return $qb->getQuery()->getResult(); } /** * @return array<array-key, array{avgNote: float, month: string}> */ public function getAverageNoteByAddress(?Adresse $address = null): array { $qb = $this->createQueryBuilder('c'); $qb ->select('AVG(c.averageNote) as avgNote') ->addSelect('DATE_FORMAT(c.dateRealisation, \'%Y-%m\') as month') ->join('c.adresse', 'a') ->andWhere('c.valide = 1') ->orderBy('c.dateRealisation'); if (null !== $address) { $qb->andWhere('a = :address') ->setParameter('address', $address); } $qb = $this->addOptions($qb); $qb->groupBy('month'); return $qb ->getQuery() ->getResult(); } /** * @return ?array{avgNote: float} * * @throws NonUniqueResultException */ public function getTotalAverageNoteByAddress(Adresse $adresse): ?array { $qb = $this->createQueryBuilder('c'); $qb ->select('AVG(c.averageNote) as avgNote') ->join('c.adresse', 'a') ->andWhere('c.valide = 1') ->andWhere('a = :address') ->setParameter('address', $adresse) ->orderBy('c.dateRealisation'); $qb = $this->addOptions($qb); $qb->groupBy('c.adresse'); return $qb ->getQuery() ->getOneOrNullResult(); } /** * @throws NoResultException * @throws NonUniqueResultException * @throws \Exception */ public function averageNoteByManager( UserInterface $manager, ?Adresse $adresse = null, array $options = [] ) { $qb = $this->createQueryBuilder('c') ->select('AVG(c.averageNote)') ->leftJoin('c.adresse', 'ad') ->where('ad.manager = :manager') ->andWhere('c.valide = 1') ->setParameter('manager', $manager); if ($adresse) { $qb->andWhere('ad = :adresse'); $qb->setParameter('adresse', $adresse); } $this->addOptions( qb: $qb, forceOptions: $options ); return $qb ->getQuery() ->getSingleScalarResult(); } /** * @throws \Exception */ public function averageNoteByAgenciesByMonth( array $agenciesId, ?Adresse $address = null, bool $previous = false, array $options = [] ): array { $qb = $this->createQueryBuilder('c') ->select('AVG(c.averageNote) as note') ->addSelect('DATE_FORMAT(c.dateRealisation, \'%Y-%m\') as month') ->leftJoin('c.adresse', 'a') ->where('a.agency IN ('.implode(',', $agenciesId).')') ->andWhere('c.valide = :valid') ->setParameter('valid', true) ->groupBy('month'); if (null !== $address) { $qb->andWhere('a = :address') ->setParameter('address', $address); } $qb = $this->addOptions($qb, $previous, $options); return $qb ->getQuery() ->getResult(); } }
Save File
Cancel