src/Repository/Partner/PartnerRepository.php line 26

Open in your IDE?
  1. <?php
  2. namespace App\Repository\Partner;
  3. use App\DBAL\Types\Partner\PartnerReminderType;
  4. use App\Entity\__Contact\contact\Contact;
  5. use App\Entity\Cruise\CabinCategory\CabinType;
  6. use App\Entity\Cruise\Company\Company;
  7. use App\Entity\ParameterCodes;
  8. use App\Entity\Partner\Partner;
  9. use Croisiland\CommonBundle\Repository\AbstractPartnerRepository;
  10. use Doctrine\Common\Collections\Collection;
  11. use Doctrine\ORM\Query\Expr\Join;
  12. use Doctrine\ORM\QueryBuilder;
  13. use Doctrine\Persistence\ManagerRegistry;
  14. use Exception;
  15. /**
  16.  * @method Partner|null find($id, $lockMode = null, $lockVersion = null)
  17.  * @method Partner|null findOneBy(array $criteria, array $orderBy = null)
  18.  * @method Partner[]    findAll()
  19.  * @method Partner[]    findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
  20.  */
  21. class PartnerRepository extends AbstractPartnerRepository
  22. {
  23.     public function __construct(ManagerRegistry $registry)
  24.     {
  25.         parent::__construct($registryPartner::class);
  26.     }
  27.     public function findPartnersQueryBuilderByContactsAndCompanyAndCabinType(array $contactsCompany $companyCabinType $cabinType): QueryBuilder
  28.     {
  29.         $qb $this->createQueryBuilder('p');
  30.         return $qb
  31.             ->innerJoin('p.partnerByContacts''pbc'Join::WITH$qb->expr()->andX(
  32.                 $qb->expr()->eq('pbc.isActive'':isPartnerByContactActive'),
  33.                 $qb->expr()->in('pbc.contact'':contacts')
  34.             ))
  35.             ->innerJoin('p.partnerCompanyDiscounts''pcd'Join::WITH$qb->expr()->andX(
  36.                 $qb->expr()->orX(
  37.                     $qb->expr()->eq('pcd.cabinType'':cabinType'),
  38.                     $qb->expr()->isNull('pcd.cabinType')
  39.                 ),
  40.                 $qb->expr()->eq('pcd.company'':company')
  41.             ))
  42.             ->where($qb->expr()->eq('p.active'1))
  43.             ->setParameters([
  44.                 'isPartnerByContactActive' => true,
  45.                 'contacts' => $contacts,
  46.                 'company' => $company,
  47.                 'cabinType' => $cabinType,
  48.             ])
  49.             ->orderBy('p.name''ASC');
  50.     }
  51.     /**
  52.      * @return QueryBuilder Returns an array of Partner objects
  53.      */
  54.     public function findPartnerActiveQb(): QueryBuilder
  55.     {
  56.         $qb $this->createQueryBuilder('p');
  57.         return $qb
  58.             ->andWhere($qb->expr()->eq('p.active'1))
  59.             ->orderBy('p.name''ASC');
  60.     }
  61.     /**
  62.      * @return Partner[] Returns an array of Partner objects
  63.      */
  64.     public function findPartnerActive(): array
  65.     {
  66.         $qb $this->createQueryBuilder('p');
  67.         return $qb
  68.             ->andWhere($qb->expr()->eq('p.active'1))
  69.             ->orderBy('p.name''ASC')
  70.             ->getQuery()
  71.             ->getResult()
  72.         ;
  73.     }
  74.     /**
  75.      * @return Partner[] Returns an array of Partner objects
  76.      */
  77.     public function findIn(array $ids): array
  78.     {
  79.         $qb $this->createQueryBuilder('p');
  80.         return $qb
  81.             ->where($qb->expr()->in('p.id'':ids'))
  82.             ->setParameter('ids'$ids)
  83.             ->getQuery()
  84.             ->getResult()
  85.             ;
  86.     }
  87.     public function findPartnersByContact(Contact $contact): array
  88.     {
  89.         $qb $this->createQueryBuilder('p');
  90.         return $qb
  91.             ->leftJoin('p.partnerByContacts''pbc')
  92.             ->andWhere($qb->expr()->eq('p.active'1))
  93.             ->andWhere($qb->expr()->eq('pbc.isActive'':isContactActive'))
  94.             ->andWhere($qb->expr()->eq('pbc.contact'':contact'))
  95.             ->setParameter('isContactActive'1)
  96.             ->setParameter('contact'$contact)
  97.             ->orderBy('p.name''ASC')
  98.             ->getQuery()
  99.             ->getResult()
  100.         ;
  101.     }
  102.     /**
  103.      * Partners list for add partner contact link in contact page
  104.      *
  105.      * @param Contact $contact
  106.      * @return QueryBuilder
  107.      */
  108.     public function findPartnersForPartnerContactSelectionList(Contact $contact): QueryBuilder
  109.     {
  110.         $qb $this->createQueryBuilder('p');
  111.         return $qb
  112.             ->leftJoin('p.partnerByContacts''pbc'Join::WITH$qb->expr()->eq("pbc.contact"":contact"))
  113.             ->andWhere($qb->expr()->eq("p.active"1))
  114.             ->andWhere($qb->expr()->isNull('pbc'))
  115.             ->groupBy('p.id')
  116.             ->orderBy('p.name''ASC')
  117.             ->setParameter('contact'$contact);
  118.     }
  119.     public function getFormQueryBuilder(): QueryBuilder
  120.     {
  121.         $qb $this->createQueryBuilder('p');
  122.         return $qb
  123.             ->addOrderBy('p.name''ASC');
  124.     }
  125.     /**
  126.      * @return array
  127.      */
  128.     public function getDistinctYears(): array
  129.     {
  130.         $qb $this->createQueryBuilder('p');
  131.         return $qb->select('DISTINCT YEAR(p.createdAt) as year')
  132.             ->orderBy('year''DESC')
  133.             ->getQuery()
  134.             ->getResult();
  135.     }
  136.     /*********************************** Recap ************************************************************************/
  137.     /**
  138.      * @param QueryBuilder $bookingRecapFiltersQueryBuilder Voir fonction getRecapBaseQueryBuilderForFilters du BookingRepository
  139.      */
  140.     public function getRecapBaseQueryBuilder(QueryBuilder $bookingRecapFiltersQueryBuilder): QueryBuilder
  141.     {
  142.         $bookingRecapFiltersQueryBuilder
  143.             ->andWhere($bookingRecapFiltersQueryBuilder->expr()->eq('filter_bpt.id''bpt.id'))
  144.         ;
  145.         return $this->createQueryBuilder('p')
  146.             ->select('p.name as partner')
  147.             ->leftJoin('p.bookingPartnerTurnovers''bpt')
  148.             ->leftJoin('bpt.booking''b')
  149.             ->where('b.id IN ('.$bookingRecapFiltersQueryBuilder->getQuery()->getDQL().')')
  150.             ->groupBy('p.id')
  151.             ->addOrderBy('p.name''ASC');
  152.     }
  153.     public function findAllToRemind(): array
  154.     {
  155.         $queryBuilder $this->createQueryBuilder('p')
  156.             ->where('p.reminder = :reminder')
  157.             ->setParameter('reminder'PartnerReminderType::REMIND)
  158.         ;
  159.         return $queryBuilder
  160.             ->getQuery()
  161.             ->getResult();
  162.     }
  163.     public function getFilterGridQueryBuilder(): QueryBuilder
  164.     {
  165.         $qb $this->createQueryBuilder('p');
  166.         return $qb
  167.             ->where($qb->expr()->eq('p.active'1))
  168.             ->orderBy('p.name''ASC');
  169.     }
  170.     /*********************************** Accounting *******************************************************************/
  171.     /**
  172.      * @throws Exception
  173.      */
  174.     public function getAccountingPartnersQB(string $type, ?QueryBuilder $qb nullstring $partnerAlias 'p'): QueryBuilder
  175.     {
  176.         switch ($type) {
  177.             case "allowance":
  178.                 $field 'allowancePercentage';
  179.                 break;
  180.             case "participation":
  181.                 $field 'additionalRate';
  182.                 break;
  183.             default:
  184.                 throw new Exception('Invalid argument in "'.__METHOD__.'" method from '.get_class($this).'. "allowance" or "participation" have to be set in type parameter.');
  185.         }
  186.         if ($qb === null) {
  187.             $qb $this->createQueryBuilder($partnerAlias);
  188.         }
  189.         return $qb
  190.             ->distinct()
  191.             ->innerJoin($partnerAlias.'.partnerCompanyDiscounts''pcd')
  192.             ->andWhere($qb->expr()->isNotNull('pcd.'.$field))
  193.             ->groupBy($partnerAlias.'.id');
  194.     }
  195.     /**
  196.      * @return array|Partner[]
  197.      * @throws Exception
  198.      */
  199.     public function getAccountingPartners(string $typestring $partnerAlias 'p'): array
  200.     {
  201.         return $this->getAccountingPartnersQB($typenull$partnerAlias)
  202.             ->orderBy($partnerAlias.'.name')
  203.             ->getQuery()
  204.             ->getResult();
  205.     }
  206. }