<?php
namespace App\Repository\Partner;
use App\Entity\Cruise\CabinCategory\CabinCategoryType;
use App\Entity\Cruise\CabinCategory\CabinType;
use App\Entity\Cruise\Company\Company;
use App\Entity\Partner\Partner;
use App\Entity\Partner\PartnerCompanyDiscount;
use DateTime;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\NonUniqueResultException;
use Doctrine\ORM\Query\Expr\Join;
use Doctrine\ORM\QueryBuilder;
use Doctrine\Persistence\ManagerRegistry;
/**
* @method PartnerCompanyDiscount|null find($id, $lockMode = null, $lockVersion = null)
* @method PartnerCompanyDiscount|null findOneBy(array $criteria, array $orderBy = null)
* @method PartnerCompanyDiscount[] findAll()
* @method PartnerCompanyDiscount[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class PartnerCompanyDiscountRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, PartnerCompanyDiscount::class);
}
public function findDistinctCompanyNamesByPartner(Partner $partner): array
{
$result = $this->createQueryBuilder('pcd')
->select('c.name')
->innerJoin(Company::class, 'c', Join::WITH, 'c.id = pcd.company')
->where('pcd.partner = :partner')
->setParameter('partner', $partner)
->groupBy('c.name')
->getQuery()
->getScalarResult();
return array_column($result, 'name');
}
public function findDistinctCabinTypeNamesByPartner(Partner $partner): array
{
$result = $this->createQueryBuilder('pcd')
->select('ct.name')
->innerJoin(CabinCategoryType::class, 'cct', Join::WITH, 'cct.id = pcd.cabinCategoryType')
->innerJoin(CabinType::class, 'ct', Join::WITH, 'ct.id = cct.cabinType')
->where('pcd.partner = :partner')
->setParameter('partner', $partner)
->groupBy('ct.name')
->getQuery()
->getScalarResult();
return array_column($result, 'name');
}
public function findDiscountAndCabinTypeByPartner(Partner $partner): array
{
return $this->createQueryBuilder('pcd')
->select('ct.name as cabintypeName, cct.name as cabinCategoryTypeName, c.name as companyName, pcd.rate')
->innerJoin(CabinCategoryType::class, 'cct', Join::WITH, 'cct.id = pcd.cabinCategoryType')
->innerJoin(CabinType::class, 'ct', Join::WITH, 'ct.id = cct.cabinType')
->innerJoin(Company::class, 'c', Join::WITH, 'c.id = pcd.company')
->where('pcd.partner = :partner')
->setParameter('partner', $partner)
->getQuery()
->getScalarResult();
}
/**
* @throws NonUniqueResultException
*/
public function findDiscountByPartnerAndCompanyAndCabinType(Partner $partner, CabinType $cabinType, Company $company): ?PartnerCompanyDiscount
{
return $this->createQueryBuilder('pcd')
->where('pcd.partner = :partner')
->andWhere('pcd.company = :company')
->andWhere('pcd.cabinType = :cabinType')
->setParameters([
'partner' => $partner,
'company' => $company,
'cabinType' => $cabinType,
])
->getQuery()
->getOneOrNullResult();
}
/**
* @throws NonUniqueResultException
*/
public function findByPartnerAndCompanyAndCabinTypeAtDate(Partner $partner, Company $company, CabinType $cabinType, DateTime $date): ?PartnerCompanyDiscount
{
$qb = $this->createQueryBuilder('pcd');
return $qb->where($qb->expr()->eq('pcd.partner', ':partner'))
->andWhere($qb->expr()->eq('pcd.company', ':company'))
->andWhere($qb->expr()->eq('pcd.cabinType', ':cabinType'))
->andWhere($qb->expr()->andX(
$qb->expr()->orX(
$qb->expr()->lte('pcd.startsAt', ':date'),
$qb->expr()->isNull('pcd.startsAt')
),
$qb->expr()->orX(
$qb->expr()->gte('pcd.endsAt', ':date'),
$qb->expr()->isNull('pcd.endsAt')
)
))
->setParameter('partner', $partner)
->setParameter('company', $company)
->setParameter('cabinType', $cabinType)
->setParameter('date', $date->format('Y-m-d'))
->orderBy('pcd.id', 'DESC')
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
}
/**
* @throws NonUniqueResultException
*/
public function findDefaultByPartnerAndCompanyAndCabinType(Partner $partner, Company $company, CabinType $cabinType): ?PartnerCompanyDiscount
{
$qb = $this->createQueryBuilder('pcd');
return $qb->where($qb->expr()->eq('pcd.partner', ':partner'))
->andWhere($qb->expr()->eq('pcd.company', ':company'))
->andWhere($qb->expr()->eq('pcd.cabinType', ':cabinType'))
->andWhere($qb->expr()->eq('pcd.isDefault', ':isDefault'))
->andWhere($qb->expr()->eq('pcd.isArchived', ':isArchived'))
->setParameter('partner', $partner)
->setParameter('company', $company)
->setParameter('cabinType', $cabinType)
->setParameter('isDefault', true)
->setParameter('isArchived', false)
->orderBy('pcd.id', 'DESC')
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
}
/**
* @throws NonUniqueResultException
*/
public function findByPartnerAndCompanyAtDate(Partner $partner, Company $company, DateTime $date): ?PartnerCompanyDiscount
{
$qb = $this->createQueryBuilder('pcd');
return $qb->where($qb->expr()->eq('pcd.partner', ':partner'))
->andWhere($qb->expr()->eq('pcd.company', ':company'))
->andWhere($qb->expr()->isNull('pcd.cabinType'))
->andWhere($qb->expr()->andX(
$qb->expr()->orX(
$qb->expr()->lte('pcd.startsAt', ':date'),
$qb->expr()->isNull('pcd.startsAt')
),
$qb->expr()->orX(
$qb->expr()->gte('pcd.endsAt', ':date'),
$qb->expr()->isNull('pcd.endsAt')
)
))
->setParameter('partner', $partner)
->setParameter('company', $company)
->setParameter('date', $date->format('Y-m-d'))
->orderBy('pcd.id', 'DESC')
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
}
/**
* @throws NonUniqueResultException
*/
public function findDefaultByPartnerAndCompany(Partner $partner, Company $company): ?PartnerCompanyDiscount
{
$qb = $this->createQueryBuilder('pcd');
return $qb->where($qb->expr()->eq('pcd.partner', ':partner'))
->andWhere($qb->expr()->eq('pcd.company', ':company'))
->andWhere($qb->expr()->isNull('pcd.cabinType'))
->andWhere($qb->expr()->eq('pcd.isDefault', ':isDefault'))
->andWhere($qb->expr()->eq('pcd.isArchived', ':isArchived'))
->setParameter('partner', $partner)
->setParameter('company', $company)
->setParameter('isDefault', true)
->setParameter('isArchived', false)
->orderBy('pcd.id', 'DESC')
->setMaxResults(1)
->getQuery()
->getOneOrNullResult();
}
public function findWithActivePartnerAndWebsite(): array
{
$qb = $this->createQueryBuilder('pcd');
return $qb
->join('pcd.partner', 'p')
->where($qb->expr()->eq('p.isActive', true))
->andWhere($qb->expr()->eq('p.withWebsite', true))
->getQuery()
->getResult()
;
}
/**
* @return QueryBuilder
*/
public function getQueryBuilderForGrid(): QueryBuilder
{
$qb = $this->createQueryBuilder('pcd');
return $qb
->join('pcd.partner', 'p')
->orderBy('p.name', 'ASC');
}
}