<?php
/*
* This file is part of the Sylius package.
*
* (c) Paweł Jędrzejewski
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
declare(strict_types=1);
namespace Sylius\Bundle\CoreBundle\Doctrine\ORM;
use Doctrine\ORM\QueryBuilder;
use Sylius\Bundle\ResourceBundle\Doctrine\ORM\EntityRepository;
class TurnRepository extends EntityRepository
{
public function getEvents(\DateTimeInterface $start, \DateTimeInterface $end, string $url, array $filters = null, string $urlHc = null): array
{
$query = $this->createQueryBuilder('o')
->select("
CONCAT(
CASE WHEN c.id IS NULL THEN '' ELSE CONCAT('<a class=\"ui label circular teal float-right hidden\" href=\"".$urlHc."?id=',c.id, '\"><i class=\"icon address book outline\"></i></a>') END,
CASE WHEN pay.state = 'STATE_NEW' THEN '<a class=\"ui red circular label\">-</a>' WHEN pay.state = 'STATE_COMPLETED' THEN '<a class=\"ui green circular label\">P</a>' WHEN pay.state = 'STATE_OVERPAYMENT' THEN '<a class=\"ui purple circular label\">S</a>' WHEN pay.state = 'STATE_INCOMPLETE' THEN '<a class=\"ui yellow circular label\">S</a>' WHEN pay.state = 'STATE_BONUS' THEN '<a class=\"ui pink circular label\">B</a>' WHEN pay.state IS NULL THEN '' ELSE '<a class=\"ui red circular label\">-</a>'
END,
CASE WHEN pay.state IS NOT NULL THEN '' WHEN o.payStatus = 'PAY_COMPLETED' THEN '<a class=\"ui green circular label\">P</a>' WHEN o.payStatus = 'PAY_INCOMPLETE' THEN '<a class=\"ui yellow circular label\">S</a>' ELSE '<a class=\"ui gray circular label\">-</a>' END,
CASE WHEN o.turnStatus = 'STATUS_NEW' THEN '<a class=\"ui yellow circular label\">-</a>' WHEN o.turnStatus = 'STATUS_CANCELLED' THEN '<a class=\"ui red circular label\">X</a>' WHEN o.turnStatus = 'STATUS_RESCHEDULE' THEN '<a class=\"ui blue circular label\">R</a>' ELSE '<a class=\"ui green circular label\">C</a>' END,
CASE WHEN o.finalStatus = 'FINAL_NOT_ATTENDANCE' THEN '<a class=\"ui red circular label\">-</a>' WHEN o.finalStatus = 'FINAL_ATTENDANCE' THEN '<a class=\"ui green circular label\">A</a>' ELSE '' END,
'</br>',
CASE WHEN c.id IS NULL THEN CONCAT(CASE WHEN o.lastname IS NULL THEN '' ELSE o.lastname END, ' ', CASE WHEN o.name IS NULL THEN '' ELSE o.name END) ELSE CONCAT(c.lastName, ' ', c.firstName) END,
'<br>T',
o.id,
'<div class=\"cal-ext-cont\">',
CASE WHEN p.name IS NULL THEN '' ELSE CONCAT('Profesional: ', p.lastname, ' ', p.name) END,
CASE WHEN pr.name IS NULL THEN '' ELSE CONCAT('<br/>Sala: ', pr.name) END,
CASE WHEN GROUP_CONCAT(taxont.name, ' ') IS NULL THEN ' ' ELSE CONCAT('<br>Tipos: ', GROUP_CONCAT(taxont.name, ' ')) END,
CASE WHEN o.description IS NULL THEN '' ELSE CONCAT('</br> Descripción: ', o.description) END,
'</div>'
) AS title,
DATE_FORMAT(o.start, '%Y-%m-%dT%H:%i:%s') AS start,
DATE_FORMAT(o.end, '%Y-%m-%dT%H:%i:%s') AS end,
p.color as color,
CASE WHEN pr.color IS NULL THEN p.color WHEN pr.color = '#FFFFFF' THEN p.color ELSE pr.color END as borderColor,
o.id as id,
CONCAT('".$url."', o.id, '/edit') AS url
")
// CASE WHEN o.payStatus = 'PAY_NEW' THEN '#d15b61' ELSE '#21ba45' END as color,
// CASE WHEN o.turnStatus = 'STATUS_NEW' THEN '#d15b61' WHEN o.turnStatus = 'STATUS_CANCELLED' THEN '#000000' ELSE '#21ba45' END as borderColor,
->leftJoin('o.customer', 'c')
->leftJoin('o.professional', 'p')
->leftJoin('o.room', 'pr')
->leftJoin('o.payCustomer', 'pc')
->leftJoin('o.turnTaxons', 'tt')
->leftJoin('tt.taxon', 'taxon')
->leftJoin('taxon.translations', 'taxont')
->leftJoin('pc.pay', 'pay')
->andWhere('o.start >= :start')
->andWhere('o.start <= :end')
->andWhere('o.enabled = :enabled')
->setParameter('start', $start)
->setParameter('end', $end)
->setParameter('enabled', true)
->addGroupBy('o.id')
;
if($filters && $filters['professional']){
$query->andWhere('p.id = :professional')
->setParameter(':professional', $filters['professional']);
}
if($filters && $filters['room']){
$query->andWhere('pr.id = :room')
->setParameter(':room', $filters['room']);
}
if($filters && $filters['payStatus']){
if($filters['payStatus'] == 'NULL'){
$query->andWhere('pay IS NULL');
}else{
$query->andWhere('pay.state = :payStatus')
->setParameter(':payStatus', $filters['payStatus']);
}
}
if($filters && $filters['turnStatus']){
$query->andWhere('o.turnStatus = :turnStatus')
->setParameter(':turnStatus', $filters['turnStatus']);
}else{
// filtra por defecto los cancelados y los a reprogramar
$query->andWhere('o.turnStatus != :notCanceled')
->andWhere('o.turnStatus != :notReschedule')
->setParameter('notCanceled', 'STATUS_CANCELLED')
->setParameter('notReschedule', 'STATUS_RESCHEDULE');
}
if($filters && $filters['finalStatus']){
$query->andWhere('o.finalStatus = :finalStatus')
->setParameter(':finalStatus', $filters['finalStatus']);
}
if($filters && $filters['id']){
$query->andWhere('o.id LIKE :id')
->setParameter(':id', '%' .$filters['id']. '%');
}
if($filters && $filters['taxon']){
$query->andWhere('taxont.name LIKE :taxon')
->setParameter(':taxon', '%' .$filters['taxon']. '%');
}
if($filters && $filters['customer']){
$searchArray = explode(' ', $filters['customer']);
if($searchArray && count($searchArray)){
foreach ($searchArray as $key => $subSearch) {
$query = $query->andWhere("CONCAT('T',o.id) LIKE :search".$key." OR (CONCAT(c.lastName, ' ', c.firstName) LIKE :search".$key." OR CONCAT(CASE WHEN o.lastname IS NULL THEN '' ELSE o.lastname END, ' ', o.name) LIKE :search". $key .")")
->setParameter(':search'.$key, '%' . $subSearch . '%')
;
}
}
}
$query = $query->addOrderBy("o.start", "DESC")->getQuery()->getResult();
return (array) $query;
}
public function updateEventEditable(int $id, \DateTime $start, \DateTime $end)
{
$query = $this->createQueryBuilder('o')
->update()
->set('o.start', ':start')
->setParameter(':start', $start)
->set('o.end', ':end')
->setParameter(':end', $end)
->where('o.id = :id')
->setParameter('id', $id)
->getQuery()
->execute()
;
}
public function createListQueryBuilder($sorting = null): QueryBuilder
{
$qb = $this->createQueryBuilder('o')
->addSelect('o.id as id, CASE WHEN o.customer IS NULL THEN CONCAT(CASE WHEN o.lastname IS NULL THEN \'\' ELSE CONCAT(o.lastname, \' \') END, o.name) ELSE CONCAT(c.lastName, \' \', c.firstName) END as name, r.name as room, CONCAT(p.lastname, \' \', p.name) as professional, o.start as start, o.duration as duration, o.turnStatus as turnStatus, o.finalStatus as finalStatus,
CASE WHEN pc.id IS NULL THEN o.payStatus ELSE pay.state END as payState,
c.id as customerId, pc.id as payCustomerId, o.reschedule, o.enabled as enabled')
->leftJoin('o.customer', 'c')
->leftJoin('o.room', 'r')
->leftJoin('o.professional', 'p')
->leftJoin('o.payCustomer', 'pc')
->leftJoin('o.turnTaxons', 'tt')
->leftJoin('tt.taxon', 'taxon')
->leftJoin('taxon.translations', 'taxont')
->leftJoin('pc.pay', 'pay')
;
if($sorting && is_array($sorting) && array_key_exists('name', $sorting)){
$qb->orderBy('name', $sorting['name']);
}
return $qb;
}
public function getWithMainTaxon(): array
{
$qb = $this->createQueryBuilder('o')
->andWhere('o.mainTaxon IS NOT NULL')
->addOrderBy('o.createdAt', 'DESC')
;
return $qb->getQuery()->getResult();
}
public function findLatest(int $count): array
{
return $this->createQueryBuilder('o')
->addOrderBy('o.createdAt', 'DESC')
->setMaxResults($count)
->getQuery()
->getResult()
;
}
public function findNexts(int $count): array
{
return $this->createQueryBuilder('o')
->addOrderBy('o.createdAt', 'ASC')
->andWhere('o.start >= :start')
->setParameter('start', new \DateTime())
->setMaxResults($count)
->getQuery()
->getResult()
;
}
}