src/Repository/ProspectOnStoreStatusRepository.php line 26

Open in your IDE?
  1. <?php
  2. namespace App\Repository;
  3. use App\Entity\Administrator;
  4. use App\Entity\CentralPurchasing;
  5. use App\Entity\Enum\ProspectOnStoreStatusEnum;
  6. use App\Entity\Enum\ProspectOnStoreCallbackReminderStateEnum;
  7. use App\Entity\Enum\QualificationStateEnum;
  8. use App\Entity\ProspectOnStoreStatus;
  9. use App\Entity\User;
  10. use DateTime;
  11. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  12. use Doctrine\Persistence\ManagerRegistry;
  13. use Doctrine\ORM\Query\Expr\Join;
  14. use Doctrine\ORM\QueryBuilder;
  15. /**
  16.  * @method ProspectOnStoreStatus|null find($id, $lockMode = null, $lockVersion = null)
  17.  * @method ProspectOnStoreStatus|null findOneBy(array $criteria, array $orderBy = null)
  18.  * @method ProspectOnStoreStatus[]    findAll()
  19.  * @method ProspectOnStoreStatus[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  20.  */
  21. class ProspectOnStoreStatusRepository extends ServiceEntityRepository
  22. {
  23.     public function __construct(ManagerRegistry $registry)
  24.     {
  25.         parent::__construct($registryProspectOnStoreStatus::class);
  26.     }
  27.     /**
  28.      * @deprecated
  29.      * Find prospectOnStoreStatus without prospect on store (to migrate)
  30.       * @return ProspectOnStoreStatus[] Returns an array of ProspectOnStoreStatus objects
  31.       */
  32.     public function findProspectOnStoreStatusWithoutProspectOnStore($limit=10)
  33.     {
  34.         return $this->createQueryBuilder('pg')
  35.             ->addSelect('p')
  36.             ->addSelect('pos')
  37.             ->join('p.prospectsOnStore''pos')
  38.             ->orderBy('pg.id''DESC')
  39.             ->setMaxResults($limit)
  40.             ->getQuery()
  41.             ->getResult()
  42.         ;
  43.     }
  44.     /**
  45.      * Return QB of the Prospect (admin)
  46.      * @param User $user
  47.      * @return \Doctrine\ORM\QueryBuilder
  48.      */
  49.     public function findQBAllWithJoin(User $user null)
  50.     {
  51.         $qb $this->createQueryBuilder('pg')
  52.             ->leftJoin('pg.prospectOnStore''pos')->addSelect('pos')
  53.             ->leftJoin('pos.store''s')->addSelect('s')
  54.             ->leftJoin('s.administrator''admin')
  55.         ;
  56.         //filter for user
  57.         if ($user) {
  58.             $qb->join('s.administrator''a');
  59.             $qb->andWhere('a.user = :user');
  60.             $qb->setParameter('user'$user);
  61.         }
  62.         return $qb;
  63.     }
  64.     /**
  65.      * Return nb of Appointment offered by a centralPurchasing
  66.      * @param CentralPurchasing $centralPurchasing
  67.      * @return mixed
  68.      */
  69.     public function findNbAppointmentOfferedByCentralPurchasing(CentralPurchasing $centralPurchasing){
  70.         $qb $this->createQueryBuilder('pg');
  71.         $qb
  72.             ->addSelect('count(pg) as nb_apt')
  73.             ->addSelect('s.id as store_id')
  74.             ->addSelect('ad.id as admin_id')
  75.             ->innerJoin('pg.prospectOnStore''pos')
  76.             ->innerJoin('pos.cost''cc'Join::WITH'cc.centralPurchasing = :centralPurchasing')
  77.             ->innerJoin('pos.store''s')
  78.             ->innerJoin('s.administrator''ad')
  79.             ->andWhere('pg.status = :grade')
  80.             ->andWhere('cc.centralPurchasing = :centralPurchasing')
  81.             ->setParameter('centralPurchasing'$centralPurchasing)
  82.             ->setParameter('grade'ProspectOnStoreStatusEnum::APPOINTMENT_MADE)
  83.             ->groupBy('s.id')
  84.         ;
  85.         $result $qb->getQuery()->getArrayResult();
  86.         return $result;
  87.     }
  88.     /**
  89.      * Return nb of ProspectOnStoreStatus 'RDV' group by store for an administrator
  90.      * @param Administrator $administrator
  91.      * @param DateTime|null $startDate
  92.      * @param DateTime|null $endDate
  93.      * @return array
  94.      */
  95.     public function findNbAppointmentByStoreForAdministrator(Administrator $administratorDateTime $startDate=nullDateTime $endDate=null): array
  96.     {
  97.         $qb $this->createQueryBuilder('pg');
  98.         $qb
  99.             ->addSelect('count(distinct pg.prospectOnStore) as nb_rdv')
  100.             ->addSelect('s.id as store_id')
  101.             ->innerJoin('pg.prospectOnStore''pos')
  102.             ->innerJoin('pos.store''s')
  103.             ->innerJoin('pos.prospect''p')
  104.             ->innerJoin('s.administrator''ad')
  105.             ->andWhere('s.administrator = :admin')
  106.             ->setParameter('admin'$administrator)
  107.             ->andWhere('pg.status = :grade')->setParameter('grade'ProspectOnStoreStatusEnum::APPOINTMENT_MADE)
  108.             ->groupBy('store_id')
  109.             ->orderBy('store_id');
  110.         $this->addValidOrQualifiedValidCondition($qb);
  111.         $this->addProspectTimeWindow($qb$startDate$endDate);
  112.         return $qb->getQuery()->getArrayResult();
  113.     }
  114.     /**
  115.      * Return nb of ProspectOnStoreStatus 'RDV' for all stores for an administrator
  116.      * @param Administrator $administrator
  117.      * @return int
  118.      */
  119.     public function findNbAppointmentForAllStoresForAdministrator(Administrator $administratorDateTime $startDate=nullDateTime $endDate=null)
  120.     {
  121.         $qb $this->createQueryBuilder('pg');
  122.         $qb
  123.             ->select('count(distinct pg.prospectOnStore) as nb_rdv')
  124.             //->addSelect('s.id as store_id')
  125.             ->innerJoin('pg.prospectOnStore''pos')
  126.             ->innerJoin('pos.store''s')
  127.             ->innerJoin('pos.prospect''p')
  128.             ->innerJoin('s.administrator''ad')
  129.             ->andWhere('s.administrator = :admin')
  130.             ->setParameter('admin'$administrator)
  131.             ->andWhere('pg.status = :grade')->setParameter('grade'ProspectOnStoreStatusEnum::APPOINTMENT_MADE)
  132.             //->orderBy('store_id')
  133.         ;
  134.         $this->addValidOrQualifiedValidCondition($qb);
  135.         $this->addProspectTimeWindow($qb$startDate$endDate);
  136.         return $qb->getQuery()->getSingleScalarResult();
  137.     }
  138.     /**
  139.      * add conditions for POS on date
  140.      * alias must existed: pos (ProspectOnStore)
  141.      * @param QueryBuilder $qb
  142.      */
  143.     private function addProspectTimeWindow(QueryBuilder $qbDateTime $startDate=nullDateTime $endDate=null){
  144.         if(!is_null($startDate) && !is_null($endDate)){
  145.             $qb->andWhere('pos.created between :start and :end')
  146.                 ->setParameter('start'$startDate)
  147.                 ->setParameter('end'$endDate);
  148.         }
  149.     }
  150.     /**
  151.      * add conditions for POS to be valid. No qualification or qualification valid)
  152.      * alias must existed: pq (qualification)
  153.      * @param QueryBuilder $qb
  154.      */
  155.     private function addValidOrQualifiedValidCondition(QueryBuilder $qb){
  156.         $qb->andWhere('pos.delivered = true');
  157.     }
  158.     /**
  159.      * Find ProspectOnStoreStatus with callback reminder email to be sent
  160.      * @return mixed
  161.      */
  162.     public function findWithCallbackReminderToSend(int $limit=10)
  163.     {
  164.         $tomorrow = new DateTime("now + 15 minutes ");
  165.         $qb $this->createQueryBuilder('pg')
  166.             ->andWhere('pg.callbackReminderState = :state')
  167.             ->setParameter('state'ProspectOnStoreCallbackReminderStateEnum::SCHEDULE)
  168.             ->andWhere('pg.callbackReminderEmail is not null')
  169.             ->andWhere('pg.dateCallback < :date')
  170.             ->setParameter('date'$tomorrow)
  171.             ->setMaxResults($limit);
  172.         ;
  173.         return $qb->getQuery()->getResult();
  174.     }
  175. }