src/Repository/RDVRepository.php line 414

Open in your IDE?
  1. <?php
  2. namespace App\Repository;
  3. use App\Entity\Client;
  4. use App\Entity\Company;
  5. use App\Entity\Contract;
  6. use App\Entity\Intervenant;
  7. use App\Entity\Product;
  8. use App\Entity\RDV;
  9. use App\Entity\RDVProduct;
  10. use App\Entity\Salon;
  11. use App\Entity\Site;
  12. use App\Entity\User;
  13. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
  14. use Doctrine\Persistence\ManagerRegistry;
  15. use Symfony\Bridge\Doctrine\RegistryInterface;
  16. /**
  17.  * @method RDV|null find($id, $lockMode = null, $lockVersion = null)
  18.  * @method RDV|null findOneBy(array $criteria, array $orderBy = null)
  19.  * @method RDV[]    findAll()
  20.  * @method RDV[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  21.  */
  22. class RDVRepository extends ServiceEntityRepository
  23. {
  24.     public function __construct(ManagerRegistry $registry)
  25.     {
  26.         parent::__construct($registryRDV::class);
  27.     }
  28.     public function countRDVsBySalonAndDate(Salon $salon\DateTime $date)
  29.     {
  30.         $startOfDay $date->setTime(000);
  31.         $endOfDay = clone $startOfDay;
  32.         $endOfDay->setTime(235959);
  33.         return $this->createQueryBuilder('r')
  34.             ->innerJoin('r.salon''s')
  35.             ->where('s.id = :salon')
  36.             ->andWhere('r.start BETWEEN :start AND :end')
  37.             ->andWhere('r.status != :cancel')
  38.             ->setParameter('salon'$salon->getId())
  39.             ->setParameter('cancel'RDV::STATUS_ANNULER)
  40.             ->setParameter('start'$startOfDay)
  41.             ->setParameter('end'$endOfDay)
  42.             ->getQuery()->getResult();
  43.     }
  44.     /**
  45.      * @param Site $site
  46.      * @return mixed
  47.      */
  48.     public function findForFusion()
  49.     {
  50.         return $this->createQueryBuilder('r')
  51.             //&& $rdv->getStatus() === RDV::STATUS_PLANIFIER && $rdv2->getStatus() === RDV::STATUS_PLANIFIER
  52.             ->where('r.status IN (:status)')
  53.             ->setParameter('status', [RDV::STATUS_PLANIFIERRDV::STATUS_REPLANIFIER])
  54.             ->getQuery()->getResult();
  55.     }
  56.     /**
  57.      * @param Site $site
  58.      * @return mixed
  59.      */
  60.     public function findForPlanning()
  61.     {
  62.         $date = (new \DateTime('now'))->modify('+3 day')->format('Y-m-d 23:59:59');
  63.         $dateMinus = (new \DateTime('now'))->modify('-3 day')->format('Y-m-d 00:00:00');
  64.         return $this->createQueryBuilder('r')
  65.             //&& $rdv->getStatus() === RDV::STATUS_PLANIFIER && $rdv2->getStatus() === RDV::STATUS_PLANIFIER
  66.             ->where('r.start <= :date')
  67.             ->andWhere('r.start >= :dateMinus')
  68.             ->setParameter('date'$date)
  69.             ->setParameter('dateMinus'$dateMinus)
  70.             ->getQuery()->getResult();
  71.     }
  72.     public function findForExport($dateDebut null$dateFin null)
  73.     {
  74. // Define the date 6 months ago from the current date
  75.         $dateMinus = (new \DateTime('now'))->modify('-6 months')->format('Y-m-d 00:00:00');
  76.         if($dateDebut){
  77.             $dateMinus $dateDebut;
  78.         }
  79. // Define the date 6 months in the future from the current date
  80.         $datePlus = (new \DateTime('now'))->modify('+6 months')->format('Y-m-d 23:59:59');
  81.         if($dateFin){
  82.             $datePlus $dateFin;
  83.         }
  84.         return $this->createQueryBuilder('r')
  85.             ->where('r.start >= :dateMinus')
  86.             ->andWhere('r.start <= :datePlus')
  87.             ->orderBy('r.id','desc')
  88.             ->setParameter('dateMinus'$dateMinus)
  89.             ->setParameter('datePlus'$datePlus)
  90.             ->getQuery()
  91.             ->getResult();
  92.     }
  93.     /**
  94.      * @param Site $site
  95.      * @return mixed
  96.      */
  97.     public function findForTomorrow()
  98.     {
  99.         $tomorrow = (new \DateTime())->modify('+1 day')->format('Y-m-d 00:00:00');
  100.         $tomorrowEnd = (new \DateTime())->modify('+1 day')->format('Y-m-d 23:59:59');
  101.         $status = [RDV::STATUS_PLANIFIERRDV::STATUS_REPLANIFIER];
  102.         return $this->createQueryBuilder('r')
  103.             ->where('r.start >= :date')
  104.             ->andWhere('r.start <= :dateEnd')
  105.             ->andWhere('r.status IN (:status)')
  106.             ->setParameter('date'$tomorrow)
  107.             ->setParameter('dateEnd'$tomorrowEnd)
  108.             ->setParameter('status'$status)
  109.             ->getQuery()->getResult();
  110.     }
  111.     /**
  112.      * @param Site $site
  113.      * @return mixed
  114.      */
  115.     public function findBySite($site)
  116.     {
  117.         return $this->createQueryBuilder('r')
  118.             ->leftJoin('r.salon''s')
  119.             ->innerJoin('s.site''site')
  120.             ->where('s.site = :site')
  121.             ->setParameter('site'$site)
  122.             ->getQuery()->getResult();
  123.     }
  124.     /**
  125.      * @param Site $site
  126.      * @return mixed
  127.      */
  128.     public function findFromToday()
  129.     {
  130.         return $this->createQueryBuilder('r')
  131.             ->where('r.start > :date')
  132.             ->setParameter('date', new  \DateTime())
  133.             ->orderBy('r.start')
  134.             ->setMaxResults(100)
  135.             ->getQuery()->getResult();
  136.     }
  137.     public function findByCompany($company)
  138.     {
  139.         return $this->createQueryBuilder('r')
  140.             ->innerJoin('r.intervenant''i')
  141.             ->innerJoin('i.workContract''work')
  142.             ->where('work.company = :company')
  143.             ->setParameter('company'$company)
  144.             ->getQuery()->getResult();
  145.     }
  146.     public function replanifierIntervenant(Intervenant  $intervenant$date)
  147.     {
  148.         return $this->createQueryBuilder('r')
  149.             ->innerJoin('r.intervenant''i')
  150.             ->where('r.intervenant = :intervenant')
  151.             ->andWhere('DATE_DIFF(r.start, :date) = 0')
  152.             ->andWhere('r.status = :status OR r.status = :statusRepla')
  153.             ->setParameter('date'$date)
  154.             ->setParameter('status'RDV::STATUS_PLANIFIER)
  155.             ->setParameter('statusRepla'RDV::STATUS_REPLANIFIER)
  156.             ->setParameter('intervenant'$intervenant)
  157.             ->getQuery()->getResult();
  158.     }
  159.     public function replanifierDate(Intervenant  $intervenantSalon  $salon$date)
  160.     {
  161.         return $this->createQueryBuilder('r')
  162.             ->innerJoin('r.intervenant''i')
  163.             ->where('r.intervenant = :intervenant')
  164.             ->andWhere('DATE_DIFF(r.start, :date) = 0')
  165.             ->andWhere('r.salon = :salon')
  166.             ->andWhere('r.status = :status OR r.status = :statusRepla')
  167.             ->setParameter('date'$date)
  168.             ->setParameter('status'RDV::STATUS_PLANIFIER)
  169.             ->setParameter('salon'$salon)
  170.             ->setParameter('statusRepla'RDV::STATUS_REPLANIFIER)
  171.             ->setParameter('intervenant'$intervenant)
  172.             ->getQuery()->getResult();
  173.     }
  174.     public function findOneByClientAndToken($client)
  175.     {
  176.         return $this->createQueryBuilder('r')
  177.             ->where('r.client = :client')
  178.             ->andWhere('r.orderId IS NOT NULL')
  179.             ->andWhere('r.status = :status')
  180.             ->andWhere('r.isPlatform = 1')
  181.             ->orderBy('r.id','DESC')
  182.             ->setParameter('client'$client->getId())
  183.             ->setParameter('status'RDV::STATUS_FACTURER)
  184.             ->setMaxResults(1// Set maximum number of results to 1
  185.             ->getQuery()
  186.             ->getOneOrNullResult();
  187.     }
  188.     public function findByFilter(
  189.         $intervenant null,
  190.         $site null,
  191.         $client null,
  192.         $start null,
  193.         $end null,
  194.         $status null,
  195.         $clientId null,
  196.         $user null,
  197.         $salon null
  198.     ) {
  199.         $qr $this->createQueryBuilder('r')
  200.             ->leftJoin('r.intervenant''i')
  201.             ->leftJoin('r.client''c')
  202.             ->leftJoin('c.site''s');
  203.         $filter false;
  204.         if ($intervenant) {
  205.             $qr->andWhere('i.id = :intervenant');
  206.             $qr->setParameter('intervenant'$intervenant);
  207.             $filter true;
  208.         }
  209.         if ($site) {
  210.             $qr->andWhere('s.id = :site');
  211.             $qr->setParameter('site'$site);
  212.             $filter true;
  213.         }
  214.         if ($salon) {
  215.             $qr->andWhere('r.salon = :salon');
  216.             $qr->setParameter('salon'$salon->getId());
  217.             $filter true;
  218.         }
  219.         if ($client) {
  220.             $searchTermArray explode(' '$client);
  221.             foreach ($searchTermArray as $searchItem){
  222.                 $qr->andWhere('c.firstname LIKE :firstname OR c.lastname LIKE :lastname');
  223.                 $qr->setParameter('firstname''%' $searchItem'%');
  224.                 $qr->setParameter('lastname''%' $searchItem '%');
  225.             }
  226. //            $qr->andWhere('c.firstname LIKE :client OR c.lastname LIKE :client OR CONCAT(c.firstname,\' \',c.lastname) LIKE :client');
  227. //            $qr->setParameter('client', '%' . $client . '%');
  228.             $filter true;
  229.         }
  230.         if ($clientId) {
  231.             $qr->andWhere('c.id = :clientId');
  232.             $qr->setParameter('clientId'$clientId);
  233.             $filter true;
  234.         }
  235.         if ($status) {
  236.             //$statusString = implode(',', $status);
  237.             $qr->andWhere('r.status IN (:status)');
  238.             $qr->setParameter('status'$status);
  239.             $filter true;
  240.         }
  241.         $date = new  \DateTime();
  242.         if ($start) {
  243.             $date \DateTime::createFromFormat('Y-m-d'$start);
  244.             if ($date instanceof \DateTime) {
  245.                 $date->setTime(000);
  246.             } else {
  247.                 $date = new  \DateTime();
  248.             }
  249.         }
  250.         $qr->andWhere('r.start >= :date')
  251.             ->setParameter('date'$date->format('Y-m-d H:i:s'))
  252.             ->orderBy('r.start');
  253.         if ($end) {
  254.             $date \DateTime::createFromFormat('Y-m-d'$end);
  255.             $date->setTime(235959);
  256.             $qr->andWhere('r.start <= :end');
  257.             $qr->setParameter('end'$date->format('Y-m-d H:i:s'));
  258.         }
  259.         if ($user && $user->hasRole(User::ROLE_COIFFEUR)) {
  260.             $qr->andWhere('i.user = :user');
  261.             $qr->setParameter('user'$user);
  262.             $filter true;
  263.         }
  264.         if (!$filter) {
  265.             $qr->setMaxResults(100);
  266.         }
  267.         return $qr->getQuery()->getResult();
  268.     }
  269.     public function findByFilterCoiffeuse(
  270.         $intervenant null,
  271.         $site null,
  272.         $client null,
  273.         $start null,
  274.         $end null,
  275.         $status null,
  276.         $clientId null,
  277.         $user null,
  278.         $salon null
  279.     ) {
  280.         $qr $this->createQueryBuilder('r')
  281.             ->select('r.id, c.roomNumber AS roomNumber, r.start, r.priorite, r.status, c.lastname AS lastname,r.comment, c.firstname AS firstname, c.id as client_id, rec.nbSemaine')
  282.             ->leftJoin('r.intervenant''i')
  283.             ->leftJoin('r.client''c')
  284.             ->leftJoin('c.site''s')
  285.             ->leftJoin('r.recurrenceRdvs''rec');
  286.         $filter false;
  287.         if ($intervenant) {
  288.             $qr->andWhere('i.id = :intervenant');
  289.             $qr->setParameter('intervenant'$intervenant);
  290.             $filter true;
  291.         }
  292.         if ($salon) {
  293.             $qr->andWhere('r.salon = :salon');
  294.             $qr->setParameter('salon'$salon->getId());
  295.             $filter true;
  296.         }
  297.         if ($site) {
  298.             $qr->andWhere('s.id = :site');
  299.             $qr->setParameter('site'$site);
  300.             $filter true;
  301.         }
  302.         if ($client) {
  303.             $qr->andWhere('c.firstname LIKE :client OR c.lastname LIKE :client OR CONCAT(c.firstname,\' \',c.lastname) LIKE :client');
  304.             $qr->setParameter('client''%' $client '%');
  305.             $filter true;
  306.         }
  307.         if ($clientId) {
  308.             $qr->andWhere('c.id = :clientId');
  309.             $qr->setParameter('clientId'$clientId);
  310.             $filter true;
  311.         }
  312.         if ($status) {
  313.             $qr->andWhere('r.status IN (:status)');
  314.             $qr->setParameter('status'$status);
  315.         }
  316.         $date = new  \DateTime();
  317.         if ($start) {
  318.             $date \DateTime::createFromFormat('Y-m-d'$start);
  319.             if ($date instanceof \DateTime) {
  320.                 $date->setTime(000);
  321.             } else {
  322.                 $date = new  \DateTime();
  323.             }
  324.         }
  325.         $qr->andWhere('r.start >= :date')
  326.             ->setParameter('date'$date->format('Y-m-d H:i:s'))
  327.             ->orderBy('r.start');
  328.         if ($end) {
  329.             $date \DateTime::createFromFormat('Y-m-d'$end);
  330.             $date->setTime(235959);
  331.             $qr->andWhere('r.start <= :end');
  332.             $qr->setParameter('end'$date->format('Y-m-d H:i:s'));
  333.         }
  334.         if ($user && $user->hasRole(User::ROLE_COIFFEUR)) {
  335.             $qr->andWhere('i.user = :user');
  336.             $qr->setParameter('user'$user);
  337.         }
  338.         $qr->andWhere('s.id != 146');
  339.         if (!$filter) {
  340.             $qr->setMaxResults(50);
  341.         }
  342.         return $qr->getQuery()->getResult();
  343.     }
  344.     /**
  345.      * @param null $start
  346.      * @param null $end
  347.      * @return mixed
  348.      */
  349.     public function findForBilling($start null$end null$status$company$site)
  350.     {
  351.         $qr $this->createQueryBuilder('r')
  352.             ->select('r.id''r.start''r.end''c.id as client_id''s.id as site_id')
  353.             ->leftJoin('r.intervenant''i')
  354.             ->leftJoin('r.client''c')
  355.             ->leftJoin('c.billingInfos''bi')
  356.             ->leftJoin('c.site''s');
  357.         if ($start) {
  358.             $date \DateTime::createFromFormat('Y-m-d'$start);
  359.             if ($date instanceof \DateTime) {
  360.                 $date->setTime(000);
  361.             }
  362.             $qr->andWhere('r.start >= :start');
  363.             $qr->setParameter('start'$date);
  364.         }
  365.         if ($end) {
  366.             $date2 \DateTime::createFromFormat('Y-m-d'$end);
  367.             if ($date2 instanceof \DateTime) {
  368.                 $date2->setTime(235959);
  369.             }
  370.             $qr->andWhere('r.end <= :end');
  371.             $qr->setParameter('end'$date2);
  372.         }
  373.         if ($company) {
  374.             $qr->andWhere('bi.company = :company'); // company of client
  375.             $qr->setParameter('company'$company->getId());
  376.         }
  377.         if ($site) {
  378.             $qr->andWhere('s.id = :site');
  379.             $qr->setParameter('site'$site->getId());
  380.         }
  381.         $qr->andWhere('r.status = :status');
  382.         $qr->setParameter('status'$status);
  383.         //$qr->groupBy('r.client');
  384.         return $qr->getQuery()->getArrayResult();
  385.     }
  386.     public function findForReplanification($rdvs)
  387.     {
  388.         $qr $this->createQueryBuilder('r')
  389.             ->where('r.id IN (:rdvs)');
  390.         $qr->setParameter('rdvs'$rdvs)
  391.             //->where('r.status = :status')
  392.             //            ->andWhere('r.start >= :start')
  393.             //            ->andWhere('r.start <= :end')
  394.             //            ->setParameter('start', $start)
  395.             //            ->setParameter('end', $end)
  396.             //            ->setParameter('status', RDV::STATUS_PLANIFIER)
  397.         ;
  398.         //$qr->groupBy('r.client');
  399.         return $qr->getQuery()->getResult();
  400.     }
  401.     public function     findForReplanificationByContract($clientContrats$date$salon)
  402.     {
  403.         $qr $this->createQueryBuilder('r')
  404.             ->where('r.contract IN (:contract)')
  405.             ->andWhere('r.status = :status')
  406.             ->andWhere('r.salon = :salon')
  407.             ->andWhere('r.start > :date')
  408.             ->orderBy('r.start')
  409.             ->setParameter('contract'$clientContrats)
  410.             ->setParameter('salon'$salon->getId())
  411.             ->setParameter('date'$date->format('Y-m-d'))
  412.             ->setParameter('status'RDV::STATUS_PLANIFIER);
  413.         //$qr->groupBy('r.client');
  414.         return $qr->getQuery()->getResult();
  415.     }
  416.     public function     findForReplanificationNewRecurence(Client  $client$date$salon)
  417.     {
  418.         $qr $this->createQueryBuilder('r')
  419.             ->where('r.newRecurrence = true')
  420.             ->andWhere('r.status = :status')
  421.             ->andWhere('r.client = :client')
  422.             ->andWhere('r.salon = :salon')
  423.             ->andWhere('r.start > :date')
  424.             ->orderBy('r.start')
  425.             ->setParameter('client'$client->getId())
  426.             ->setParameter('salon'$salon->getId())
  427.             ->setParameter('date'$date->format('Y-m-d'))
  428.             ->setParameter('status'RDV::STATUS_PLANIFIER);
  429.         //$qr->groupBy('r.client');
  430.         return $qr->getQuery()->getResult();
  431.     }
  432.     public function findForIntervenantReplanification(Intervenant $intervenant\DateTime $date$site)
  433.     {
  434.         $date->setTime(000);
  435.         $qr $this->createQueryBuilder('r')
  436.             ->innerJoin('r.salon''sa')
  437.             ->innerJoin('sa.site''s')
  438.             ->where('r.intervenant = :intervenant')
  439.             ->andWhere('r.status IN (:status)')
  440.             ->andWhere('r.start >= :date');
  441.         if ($site) {
  442.             $qr->andWhere('s.id = :site')->setParameter('site'$site->getId());
  443.         }
  444.         $qr->setParameter('intervenant'$intervenant->getId())
  445.             ->setParameter('date'$date->format('Y-m-d'))
  446.             ->setParameter('status', [RDV::STATUS_PLANIFIERRDV::STATUS_REPLANIFIER]);
  447.         //$qr->groupBy('r.client');
  448.         return $qr->getQuery()->getResult();
  449.     }
  450.     public function findForRdvByStatus()
  451.     {
  452.         return $this->createQueryBuilder('r')
  453.             ->andWhere('r.paymentLink IS NOT NULL')
  454.             ->andWhere('r.status = :status')
  455.             ->setParameter('status'RDV::STATUS_NON_PAYE)
  456.             ->getQuery()
  457.             ->getResult();
  458.     }
  459.     public function findForRdvWithSalonAndStatus($salon)
  460.     {
  461.         return $this->createQueryBuilder('r')
  462.             ->where('r.salon = :salon')
  463.             ->andWhere('r.status != :status')
  464.             ->setParameter('status'RDV::STATUS_ANNULER)
  465.             ->setParameter('salon'$salon)
  466.             ->getQuery()
  467.             ->getResult();
  468.     }
  469.     public function findRdvWithLinkId($linkId)
  470.     {
  471.         return $this->createQueryBuilder('r')
  472.             ->where('r.paymentLink LIKE :linkId')
  473.             ->setParameter('linkId''%/' $linkId)
  474.             ->getQuery()
  475.             ->getOneOrNullResult();
  476.     }
  477.     public function getRDVsByClient(Client $client)
  478.     {
  479.         $subQuery $this->createQueryBuilder('r')
  480.         ->select('r.id');
  481.         $subQuery->leftJoin('r.client''c');
  482.         $subQuery->andWhere('c.id = :clientId')
  483.         ->setParameter('clientId'$client->getId());
  484.         return $subQuery->getQuery()->getArrayResult();
  485.     }
  486.     public function getLastRDVsByClient(Client $client)
  487.     {
  488.         $planifie RDV::STATUS_VALIDATED;
  489.         $facturer RDV::STATUS_FACTURER;
  490.         // Create the QueryBuilder instance to construct the query
  491.         $qb $this->createQueryBuilder('r')
  492.             ->select('r'// select full RDV entities, adjust as needed
  493.             ->leftJoin('r.client''c')
  494.             ->andWhere('c.id = :clientId')
  495.             ->andWhere("r.status = :facturer OR r.status = :plan")
  496.             ->setParameter('facturer'$facturer)
  497.             ->setParameter('plan'$planifie)
  498.             ->setParameter('clientId'$client->getId())
  499.             ->orderBy('r.id''DESC'// assuming 'date' is the field to sort by
  500.             ->setMaxResults(1); // limit the result to get only the most recent one
  501.         // Execute the query and return the result
  502.         return $qb->getQuery()->getOneOrNullResult(); // Use getOneOrNullResult() to get a single result or null if none found
  503.     }
  504.     public function deleteRDVsByClient(Client $client)
  505.     {
  506.         $subQuery $this->createQueryBuilder('r')
  507.         ->select('r.id');
  508.         $subQuery->leftJoin('r.client''c');
  509.         $subQuery->andWhere('c.id = :clientId')
  510.         ->setParameter('clientId'$client->getId());
  511.         // Create the DELETE statement with the subquery in the WHERE clause
  512.         $qb $this->createQueryBuilder('rdv');
  513.         $qb->delete()
  514.             ->where($qb->expr()->in('rdv.id'$subQuery->getDQL()))
  515.             ->setParameter('clientId'$client->getId());
  516.         // Execute the DELETE statement
  517.         $qb->getQuery()->execute();
  518.     }
  519.     public function findByIdIntervenantAndDate$intervenantId=null$start=null,$end=null)
  520.     {
  521.         $q $this->createQueryBuilder('r')
  522.             ->innerJoin('r.intervenant''i')
  523.             ->where('i.id = :intervenant')
  524.             ->setParameter('intervenant'$intervenantId);
  525.             $date \DateTime::createFromFormat('Y-m-d'$start);
  526.             $date->setTime(000);
  527.             $q->andWhere('r.start >= :start')
  528.             ->setParameter('start'$date->format('Y-m-d H:i:s'));
  529.         if ($end) {
  530.             $date \DateTime::createFromFormat('Y-m-d'$end);
  531.             $date->setTime(235959);
  532.             $q->andWhere('r.start <= :end');
  533.             $q->setParameter('end'$date->format('Y-m-d H:i:s'));
  534.         }
  535.         return $q->getQuery()->getResult();
  536.     }
  537.     public function findFromTodayByStatusPlan(Client $client) {
  538.         return $this->createQueryBuilder('r')
  539.             ->where('r.start > :date')
  540.             ->andWhere('r.client = :client')
  541.             ->andWhere('r.status = :plan OR r.status = :replan')
  542.             ->setParameter('date', new  \DateTime())
  543.             ->setParameter('client'$client->getId())
  544.             ->setParameter('plan'RDV::STATUS_PLANIFIER)
  545.             ->setParameter('replan'RDV::STATUS_REPLANIFIER)
  546.             ->getQuery()->getResult();
  547.     }
  548. }