<?php
namespace App\MDS\GreenPatioBundle\Controller;
use App\Entity\User;
use App\Entity\WidgetNotes;
use App\Form\WidgetNotesType;
use App\MDS\GreenPatioBundle\Entity\CvrReservationInvoice;
use App\MDS\GreenPatioBundle\Entity\BlvReservationInvoice;
use App\MDS\GreenPatioBundle\Entity\Reservation;
use App\MDS\GreenPatioBundle\Entity\ReservationInvoice;
use App\MDS\GreenPatioBundle\Entity\ReservationLoungeSimple;
use App\MDS\GreenPatioBundle\Entity\ReservationPaymentsClient;
use App\Service\AlertService;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\HttpFoundation\JsonResponse;
use Psr\Log\LoggerInterface;
use DateTime;
use DatePeriod;
use DateInterval;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
// Controlador para el calendario UNIFICADO de las salas de Green Patio y Covarrubias (excluyendo las visitas)
class CvrGPReservationsCalendarController extends AbstractController
{
private EntityManagerInterface $em;
public function __construct(EntityManagerInterface $em) {
$this->em = $em;
}
/**
* @Route("/gp-cvr/calendar", name="gp_cvr_calendar")
*/
public function calendarCvrGpReservationsAction(Request $request, AlertService $alertService) {
$session = new Session();
$token=$session->get('tokenGoogleCalendar');
if (!is_null($token)) {
$this->googleCalendar->setAccessToken($token);
$connectGoogle = "1";
}else{
$connectGoogle = "0";
}
$user_logueado = $this->get('security.token_storage')->getToken()->getUser();
$user_id = $user_logueado->getId();
$wnotes = new WidgetNotes();
$wnotes->setDateAt(new \DateTime("now"));
$form = $this->createWidgetNotesCreateForm($wnotes);
$alertService->loadGpAlerts($user_logueado);
return $this->render('MDS/GreenPatioBundle/reservations/calendar-gp-cvr-reservations.html.twig',
array(
'form' => $form->createView(),
'user'=> $user_id,
'connectGoogle' => $connectGoogle,
)
);
}
/**
* @Route("/widget/notes/calendargpcvr/create/", name="widget_notes_calendar_gp_cvr_create")
*/
public function addNotesAction(Request $request, LoggerInterface $logger)
{
$em = $this->getDoctrine()->getManager();
$notes = $em->getRepository(WidgetNotes::class)->findAll();
$wnotes = new WidgetNotes();
$form = $this->createWidgetNotesCreateForm($wnotes);
$form->handleRequest($request);
$forAgent = $form->get('forAgent')->getData();
if(!is_null($forAgent)){ $wnotes->setForAgent($forAgent->getId()); }
if($form->isValid())
{
/* Obtengo usuario logueado */
$user_logueado = $this->get('security.token_storage')->getToken()->getUser();
$user_id = $user_logueado->getId();
$wnotes->setCreatedId($user_id);
$wnotes->setUpdatedId($user_id);
/* Gestión de eventos en Log */
$user_lastname = $user_logueado->getLastname();
$user_name = $user_logueado->getName();
$user_email = $user_logueado->getEmail();
$user_rol = $user_logueado->getRoles();
$event_url = $request->getPathInfo();
$event_complete = $user_name.' '.$user_lastname.' - '.$user_email.' - '.$user_rol[0].' | '.$event_url;
try{
$em->persist($wnotes);
$em->flush();
$event = 'The Note has been created succesfully.';
$successMessage = $this->get('translator')->trans($event);
$this->addFlash('mensaje', $successMessage);
$logger->info($event_complete.' | '.$event);
} catch (\Exception $e){
$event = 'An error occurred: '.$e->getMessage();
/* Para el log */
$logger->error($event_complete.' | '.$event);
/* Para el usuario */
$errorMessage = $this->get('translator')->trans($event);
$this->addFlash('mensajeerror', $errorMessage);
}
}else{
$errorMessage = $this->get('translator')->trans('Error, some fields are empty');
$this->addFlash('mensajeerror', $errorMessage);
}
return $this->redirectToRoute('homepage');
}
/**
* @Route("/gp-cvr/eventsgpcvrnew", name="get_reservations_gp_cvr_new")
* Cambio en como se muestran y se envían los datos a la vista del calendario
*/
public function reservationGpCvrEventsActionNew()
{
// 1) Traemos las reservas de hace 1 año en adelante
$todayOneYearAgo = new \DateTime('now -365 days');
$parameters = ['dateStart' => $todayOneYearAgo];
$dql = '
SELECT r
FROM GreenPatioBundle:Reservation r
WHERE r.dateStart >= :dateStart
AND r.status != \'Deleted\'
ORDER BY
CASE WHEN r.status = \'Confirmed\' THEN 0 ELSE 1 END ASC,
r.dateStart ASC
';
$query = $this->em->createQuery($dql)->setParameters($parameters);
$reservations = $query->getResult();
$datos = [];
if (!empty($reservations)) {
foreach ($reservations as $reservation) {
// 1.1) Obtenemos todos los lounges de la reserva
$loungesAll = $this->em
->getRepository(ReservationLoungeSimple::class)
->findByIdReservation($reservation->getId());
if (empty($loungesAll)) {
continue;
}
// 2) Separamos primero los lounges “normales” (no montaje ni desmontaje)
$loungesNormales = [];
$loungesMontaje = [];
$loungesDesmontaje= [];
foreach ($loungesAll as $lounge) {
if ($lounge->getType() === 'Montaje') {
$loungesMontaje[] = $lounge;
} elseif ($lounge->getType() === 'Desmontaje') {
$loungesDesmontaje[] = $lounge;
} else {
$loungesNormales[] = $lounge;
}
}
// 3) Agrupamos los lounges normales en bloques de fechas consecutivas
$bloquesNormales = $this->_splitLoungesByConsecutiveDays($loungesNormales);
// 4) Por cada bloque, montamos un evento
foreach ($bloquesNormales as $bloque) {
$evento = $this->_getEventsData($reservation, $bloque, false);
if (!empty($evento)) {
$datos[] = $evento;
}
}
// 5) Si hay bloques de montaje, hacemos lo mismo (pero marcando isMontajeDesmontaje=true)
$bloquesMontaje = $this->_splitLoungesByConsecutiveDays($loungesMontaje);
foreach ($bloquesMontaje as $bloqueMontaje) {
$eventoMontaje = $this->_getEventsData($reservation, $bloqueMontaje, true);
if (!empty($eventoMontaje)) {
$datos[] = $eventoMontaje;
}
}
// 6) Si hay bloques de desmontaje, idem
$bloquesDesmontaje = $this->_splitLoungesByConsecutiveDays($loungesDesmontaje);
foreach ($bloquesDesmontaje as $bloqueDesmontaje) {
$eventoDesmontaje = $this->_getEventsData($reservation, $bloqueDesmontaje, true);
if (!empty($eventoDesmontaje)) {
$datos[] = $eventoDesmontaje;
}
}
}
}
// 7) Lo mismo para visitas (no cambia la lógica original)
$todayOneWeekAgo = new \DateTime('now -1 week');
$parameters = ['dateStart' => $todayOneWeekAgo];
$dql = '
SELECT p
FROM GreenPatioBundle:ReservationVisit p
WHERE p.dateStart >= :dateStart
ORDER BY p.dateStart ASC
';
$query = $this->em->createQuery($dql)->setParameters($parameters);
$visitas = $query->getResult();
if (!empty($visitas)) {
foreach ($visitas as $visita) {
$eventoVisita = $this->_getVisitEventsData($visita);
if (!empty($eventoVisita)) {
$datos[] = $eventoVisita;
}
}
}
return new JsonResponse(['reservation' => $datos]);
}
/**
* Función auxiliar: recibe un array de ReservationLoungeSimple y devuelve un array
* de “bloques” (sub-arrays), de forma que cada bloque contenga lounges cuyas
* fechas (dateStart) sean días consecutivos.
*/
private function _splitLoungesByConsecutiveDays(array $lounges): array
{
// 1) Si no hay ninguno, devolvemos array vacío
if (empty($lounges)) {
return [];
}
// 2) Ordenamos los lounges por fecha (dateStart) ascendente
usort($lounges, function (ReservationLoungeSimple $a, ReservationLoungeSimple $b) {
// Suponemos que getDateStart() devuelve DateTime
return $a->getDateStart() <=> $b->getDateStart();
});
$bloques = [];
$bloqueActual = [];
// 3) Recorremos los lounges uno a uno y los vamos agrandando en bloqueActual
foreach ($lounges as $lounge) {
if (empty($bloqueActual)) {
// Si el bloque está vacío, arrancamos con este lounge
$bloqueActual[] = $lounge;
} else {
// Vemos la última fecha del bloque actual
$ultimoLounge = end($bloqueActual);
$fechaUltimo = $ultimoLounge->getDateStart();
$fechaActualLounge = $lounge->getDateStart();
// Calculamos la diferencia en días (entero) entre ambas fechas
/** @var \DateInterval $interval */
$interval = $fechaUltimo->diff($fechaActualLounge);
$diasDif = (int) $interval->format('%r%a'); // número de días; si son negativos, no deberían darse por cómo ordenamos
if ($diasDif === 0 || $diasDif === 1) {
// Mismo día (0) o día siguiente (1) → consideramos que se incluyen en este mismo bloque
$bloqueActual[] = $lounge;
} else {
// Hay un salto mayor a 1 día → cerramos el bloque actual y empezamos uno nuevo
$bloques[] = $bloqueActual;
$bloqueActual = [$lounge];
}
}
}
// 4) Al salir, añadimos el último bloque si no estaba vacío
if (!empty($bloqueActual)) {
$bloques[] = $bloqueActual;
}
return $bloques;
}
/**
* función privada para crear el $datos[] con las reservas de GP y CVR
*/
private function _getEventsData($reservation, $lounges, $isMontajeDesmontaje = false)
{
$primerLounge = $lounges[0];
// Montamos el icono de pagos
$pago1 = "";
$pago2 = "";
$ht = "";
$paymentsAll = $this->em->getRepository(ReservationPaymentsClient::class)
->findOneByReservationId($reservation->getId());
if (!empty($paymentsAll)) {
$pago2 = "<i class='icon-coin-euro' style='color: #000 !important;'></i>";
}
// Facturas (GP y CVR)
$facturas = $this->em->getRepository(ReservationInvoice::class)
->findByReservationId($reservation->getId());
$facturasCVR= $this->em->getRepository(CvrReservationInvoice::class)
->findByReservationId($reservation->getId());
foreach ($facturasCVR as $item) {
array_push($facturas, $item);
}
foreach ($facturas as $factura) {
if ($factura->getMaster() === "master") {
$pago1 = "<i class='icon-thumbs-up3' style='color: #000 !important;'></i>";
}
if ($factura->getMaster() !== "master") {
$pago2 = "<i class='icon-coin-euro' style='color: #000 !important;'></i>";
}
}
// Catering HIGO & TRIGO
if ($reservation->getCateringName() === 'HIGO & TRIGO, S.L.') {
$ht = "<a style='color: #000 !important;'><strong>H&T</strong></a>";
}
// Tipo (Montaje/Desmontaje o null)
$type = $isMontajeDesmontaje ? $primerLounge->getType() : null;
// 1) Calculamos el inicio y fin del bloque de lounges (función que tú ya tenías)
list($start, $end) = $this->_getStartEnd($lounges, $isMontajeDesmontaje);
if (is_null($start) || is_null($end)) {
return []; // Si no hay inicio o fin válido, devolvemos vacío
}
// 2) Title: hora de inicio, iconos, tipo, etc.
$title = $start->format('H:i') . ' ' . $pago2 . $pago1 . $ht . ' ' . $type;
// 3) Color según estado y sala principal
$color = $this->_getColor($reservation->getStatus(), $primerLounge->getIdLounge(), $isMontajeDesmontaje);
// 4) Tooltip: título base de reserva
$tooltip = $reservation->getTitle();
// 5) Si hay varias salas dentro del bloque, las incluimos en title y tooltip
if (count($lounges) >= 1) {
$loungesName = [];
foreach ($lounges as $key => $lounge) {
// Solo mostramos salas normales si no es bloque montaje/desmontaje
if (!in_array($lounge->getLoungeName(), $loungesName)
&& ($isMontajeDesmontaje
|| ($lounge->getType() !== 'Montaje' && $lounge->getType() !== 'Desmontaje'))
) {
$loungesName[] = $lounge->getLoungeName();
$title .= '<br> ' . $lounge->getLoungeName();
}
if ($isMontajeDesmontaje
|| ($lounge->getType() !== 'Montaje' && $lounge->getType() !== 'Desmontaje')
) {
$horaInicio = sprintf('%02d:%02d', $lounge->getHourStart(), $lounge->getMinStart());
$horaFin = sprintf('%02d:%02d', $lounge->getHourEnd(), $lounge->getMinEnd());
$fechaInicio = $lounge->getDateStart()->format('d/m/Y'); // añadí “Y” para ver bien el año
$tooltip .= sprintf(
'<br/><b><h3>%s</h3></b> Del %s desde %s hasta %s',
$lounge->getLoungeName(),
$fechaInicio,
$horaInicio,
$horaFin
);
}
}
}
$title .= '<br>' . $reservation->getTitle();
// 6) Status parseado (tu función original)
$status = $this->_getStatus($reservation->getStatus());
// 7) Construimos el array final de datos para este evento
$datos = [
'title' => $title,
'type' => $type,
'id' => $reservation->getId(),
'tooltip' => $tooltip,
'start' => $start,
'end' => $end,
'color' => $color,
'url' => "/reservations-greenpatio/edit/" . $reservation->getId(),
'status' => $status
];
return $datos;
}
/**
* Función para crear el $datos[] con las visitas de GP y CVR
*/
private function _getVisitEventsData($visita)
{
$start = (new \DateTime($visita->getDateStart()->format('Y-m-d') . ' ' . sprintf('%02d', $visita->getHourStart()) . ':' . sprintf('%02d', $visita->getMinStart())));
$end = (new \DateTime($visita->getDateEnd()->format('Y-m-d') . ' ' . sprintf('%02d', $visita->getHourEnd()) . ':' . sprintf('%02d', $visita->getMinEnd())));
if (is_null($start) || is_null($end)) {
return []; // Si no hay inicio o fin, no devolvemos nada
}
$title = $visita->getHourStart() . ":" . $visita->getMinStart() . ' ' . $visita->getLoungeName();
$tooltip = $visita->getLoungeName() . ' - <b><h3>' . $visita->getLoungeName() . "</h3></b> Del " . $visita->getDateStart()->format('d/m') . ' desde ' . $visita->getHourStart() . ":" . $visita->getMinStart() . " a " . $visita->getHourEnd() . ":" . $visita->getMinEnd();
$color = $this->_getColorVisit($visita->getAgentId(), $visita->getIdLounge());
if ($visita->getIdLounge() != 0) {
// Si la visita no tiene sala asignada, usamos el color por defecto
$color = $this->_getColorVisit(0, $visita->getIdLounge());
}
return [
'title' => $title,
'type' => 'Visit',
'id' => $visita->getId() . 'V',
'tooltip' => $tooltip,
'start' => $start,
'end' => $end,
'color' => $color, // Color específico para visitas
'url' => '/reservations-greenpatio/addvisit',
'status' => $this->_getStatus('visit'), // Status específico para visitas
'agentId' => $visita->getAgentId(),
];
}
/**
* Devuelve el color de la reserva según su estado
*/
private function _getColor($status, $loungeId, $isMontajeDesmontaje)
{
if($isMontajeDesmontaje){
return "#a5b8a2";
}
$statusColorMap = [
'Bloqueo' => ($loungeId > 21) ? "#b873bf" : "#ffaa00",
'Confirmed' => "#13ad27",
'Invoiced' => "#13ad27",
'Deleted' => "#ff0000",
'Cotizado' => "#faafc3",
'Reservado' => "#13ad27",
'default' => "",
];
$color = $statusColorMap[$status] ?? $statusColorMap['default'];
if (in_array($loungeId, [22, 23, 24, 25])){
//Ajustamos el color a una sala de covarrubia
switch ($color) {
case '#ffaa00': $color = "#b873bf"; break; //naranja (bloqueo) => morado
case '#13ad27': $color = "#017362"; break; //verde (Confirmed) => verde olivo
case '#ff0000': $color = "#ff0000"; break; //rojo
case '#faafc3': $color = "#faafc3"; break; //Rojo claro
default: break; //no modificar el color
}
}
return $color;
}
/**
* Devuelve el color de la visita según el agente o el venue
*/
private function _getColorVisit($agentId, $venue)
{
// Si el venue determina directamente el color, lo devolvemos
if (($venue === 0) or (is_null($venue))) {
return '#f0d800'; // Color Covarrubias
}
if ($venue === 2) {
return '#990202'; // Color Bella View
}
// Si el venue es 1, buscamos el color del agente
if ($venue === 1 && !is_null($agentId)) {
$agent = $this->em->getRepository(User::class)->find($agentId);
if ($agent && $agent->getColor()) {
return $agent->getColor();
}
}
// Si no se encuentra nada, retornamos null
return null;
}
/**
* Calcula el inicio y el fin de la reserva en función de las salas que no sean montaje o desmontaje
*/
private function _getStartEnd($lounges, $isMontajeDesmontaje = false)
{
$start = null;
$end = null;
foreach ($lounges as $lounge) {
if ($isMontajeDesmontaje || ($lounge->getType() != 'Montaje' && $lounge->getType() != 'Desmontaje')) {
if (is_null($start) || $lounge->getDateStart() < $start) {
$start = (new \DateTime($lounge->getDateStart()->format('Y-m-d') . ' ' . sprintf('%02d', $lounge->getHourStart()) . ':' . sprintf('%02d', $lounge->getMinStart())));
}
if (is_null($end) || $lounge->getDateEnd() > $end) {
$end = (new \DateTime($lounge->getDateEnd()->format('Y-m-d') . ' 23:59:59'));
}
}
}
// Sumar un minuto al final para que no se vea el evento cortado
if (!is_null($end)) {
$end->modify('+1 minute');
}
return [$start, $end];
}
/**
* Devuelve el status de la reserva según su estado como un número
*/
private function _getStatus($status)
{
$statusMap = [
'Bloqueo' => 1,
'Confirmed' => 2,
'Invoiced' => 3,
'Deleted' => 4,
'Cotizado' => 5,
'Reservado' => 6,
'default' => 0,
];
return $statusMap[$status] ?? $statusMap['default'];
}
/**
* @Route("/gp-cvr/eventsgpcvr", name="get_reservations_gp_cvr")
*/
public function reservationGpCvrEventsAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
// Buscamos las reservas desde 1 año atras en adelante para no traer exceso de datos
$todayOneYearAgo = new DateTime('now -365 days');
$parameters = array('dateStart' => $todayOneYearAgo,);
$dql = 'SELECT p
FROM GreenPatioBundle:ReservationLoungeSimple p
WHERE p.dateStart >= :dateStart
ORDER BY p.dateStart ASC';
$query = $em->createQuery($dql)->setParameters($parameters);
$reservation = $query->getResult();
// Buscamos las visitas desde 1 semana atras en adelante para no traer exceso de datos (Tiempo confirmado por Gabriela Bracho)
$todayOneWeekAgo = new DateTime('now -1 week');
$parameters = array('dateStart' => $todayOneWeekAgo,);
$dql = 'SELECT p
FROM GreenPatioBundle:ReservationVisit p
WHERE p.dateStart >= :dateStart
ORDER BY p.dateStart ASC';
$query = $em->createQuery($dql)->setParameters($parameters);
$visitas = $query->getResult();
$arrayFechaVisitas = [];
foreach ($visitas as $item) {
//Se agrupan las visitas por fechas
$arrayFechaVisitas[$item->getDateStart()->format('Y-m-d').$item->getId()][] = $item;
}
$newArrayVisitas = [];
//Se agrupan las visitas por agente
foreach ($arrayFechaVisitas as $fecha) {
foreach ($fecha as $item) {
//Se van concatenando los titulos de las visitas en una sola
$loungeNameTemp = '';
$idAgentLounge = ($item->getIdLounge() == 0) ? $item->getAgentId() : '0';
if (!empty($newArrayVisitas[$item->getDateStart()->format('Y-m-d') . '-' . $idAgentLounge])) {
// $loungeNameTemp = $newArrayVisitas[$item->getDateStart()->format('Y-m-d') . '-' . $idAgentLounge]->getLoungeName();
}
$item->setLoungeName($loungeNameTemp . $item->getDateStart()->format('H:i') . ' ' . $item->getLoungeName() . '<br>');
$newArrayVisitas[$item->getDateStart()->format('Y-m-d') . '-' . $idAgentLounge] = $item;
}
}
$visitas = $newArrayVisitas;
$xArray = [];
foreach ($arrayFechaVisitas as $elem) { foreach ($elem as $item) { $xArray[] = $item; } }
foreach ($xArray as $item) { array_push($reservation, $item); }
$datos = [];
$agentColorMap = [
77 => "#22cbf5",
82 => "#f5229a",
120 => "#157cc2",
];
if (!empty($reservation)) {
foreach ($reservation as $reservaSala) {
if (!empty($reservaSala->getIdReservation())) {
$reserva = $em->getRepository(Reservation::class)->findOneById($reservaSala->getIdReservation());
if ($reservaSala->getType() == 'Visit') {
$reserva->setStatus('Visit');
}
} else {
// Estamos con una visita
$reserva = new Reservation();
$reserva->setStatus('Visit');
$reserva->setTitle($reservaSala->getLoungeName());
}
if ($reservaSala->getDateStart()->format('d') == $reservaSala->getDateEnd()->format('d')) {
$tooltip = $reserva->getTitle() . ' - <b><h3>' . $reservaSala->getLoungeName() . "</h3></b> Del " . $reservaSala->getDateStart()->format('d/m') . ' desde ' . $reservaSala->getHourStart() . ":" . $reservaSala->getMinStart() . " a " . $reservaSala->getHourEnd() . ":" . $reservaSala->getMinEnd();
} else {
$tooltip = $reserva->getTitle() . ' - <b><h3>' . $reservaSala->getLoungeName() . "</h3></b> Del " . $reservaSala->getDateStart()->format('d/m') . ' desde ' . $reservaSala->getHourStart() . ":" . $reservaSala->getMinStart() . " al " . $reservaSala->getDateEnd()->format('d/m') . ' hasta ' . $reservaSala->getHourEnd() . ":" . $reservaSala->getMinEnd();
}
$logicoVisita = false;
if (!is_null($reserva->getStatus())) {
$statusColorMap = [
'Bloqueo' => function($reservaSala) {
$idLounge = $reservaSala->getIdLounge();
if ($idLounge > 29) {
return "#964B00"; // Marrón (Bella View)
} elseif ($idLounge > 21) {
return "#b873bf"; // Morado (Covarrubias)
} else {
return "#ffaa00"; // Naranja (Green Patio)
}
},
'Confirmed' => "#13ad27",
'Invoiced' => "#13ad27",
'Deleted' => "#ff0000",
'Cotizado' => "#faafc3",
'Reservado' => "#13ad27",
'Visit' => function($reservaSala) {
if ($reservaSala->getIdLounge() == 0) {
return $agentColorMap[$reservaSala->getAgentId()] ?? "";
} else {
if ($reservaSala->getIdLounge() == 1) {
return '#f0d800'; // Color Covarrubias
} else {
return '#9e6c3a'; // Color Bella View
}
}
},
'default' => "",
];
$color = "";
$logicoVisita = false;
if (array_key_exists($reserva->getStatus(), $statusColorMap)) {
$value = $statusColorMap[$reserva->getStatus()];
// Si el valor es una función, la ejecutamos para obtener el color.
$color = is_callable($value) ? $value($reservaSala) : $value;
if ($reserva->getStatus() === 'Visit') {
$logicoVisita = true;
}
} else {
$color = $statusColorMap['default'];
}
if (!empty($reservaSala->getType()) and !($reservaSala->getType() == 'Visit')) {
//Es un montaje o desmontaje
$color = "#a5b8a2";
// Si es un montaje o desmontaje pero esta cancelado debe prevalecer el color de cancelado
if ($reserva->getStatus() == 'Deleted') { $color = "#ff0000"; }
}
if (($reservaSala->getIdLounge() > 21) and ($reservaSala->getIdLounge() < 30)){
//Ajustamos el color a una sala de covarrubia
switch ($color) {
case '#ffaa00': $color = "#b873bf"; break; //naranja (bloqueo) => morado
case '#13ad27': $color = "#017362"; break; //verde (Confirmed) => verde olivo
case '#ff0000': $color = "#ff0000"; break; //rojo
case '#faafc3': $color = "#faafc3"; break; //Rojo claro
default: break; //no modificar el color
}
}
if ($reservaSala->getIdLounge() > 29){
//Ajustamos el color a una sala de bella view
switch ($color) {
case '#ffaa00': $color = "#2691fc"; break; //naranja (bloqueo) => azul claro
case '#13ad27': $color = "#066191"; break; //verde (Confirmed) => azul oscuro
case '#ff0000': $color = "#ff0000"; break; //rojo
case '#faafc3': $color = "#faafc3"; break; //Rojo claro
default: break; //no modificar el color
}
}
}
$pago1 = "";
$pago2 = "";
$ht = "";
if (!($reserva->getStatus() == 'Visit')) {
$paymentsAll = $em->getRepository(ReservationPaymentsClient::class)->findOneByReservationId($reserva->getId());
} else {
$paymentsAll = null;
}
if (!empty($paymentsAll)) {
$pago2 = "<i class='icon-coin-euro' style='color: #000 !important;'></i>"; //Hay pagos parciales
}
if (!($reserva->getStatus() == 'Visit')) {
$facturas = $em->getRepository(ReservationInvoice::class)->findByReservationId($reserva->getId());
$facturasCVR = $em->getRepository(CvrReservationInvoice::class)->findByReservationId($reserva->getId());
$facturasBLV = $em->getRepository(BlvReservationInvoice::class)->findByReservationId($reserva->getId());
foreach ($facturasCVR as $item) { array_push($facturas, $item); }
foreach ($facturasBLV as $item) { array_push($facturas, $item); }
}
if (!empty($facturas)) {
foreach ($facturas as $factura) {
if ($factura->getMaster() == "master") {
$pago1 = "<i class='icon-thumbs-up3' style='color: #000 !important;'></i>";// Se ha pagado la totalidad
}
if ($factura->getMaster() != "master") {
$pago2 = "<i class='icon-coin-euro' style='color: #000 !important;'></i>"; //Hay pagos parciales
}
}
}
if ($reserva->getCateringName() == 'HIGO & TRIGO, S.L.') {
$ht = "<a style='color: #000 !important;'><strong>H&T</strong></a>"; // Es una reserva con servicio de Catering Higo & Trigo
}
// Pagos parciales y totales
if (!$logicoVisita) {
$datos[] = array(
"title" => $reservaSala->getDateStart()->format('H:i') . ' ' . $pago2 . $pago1 . $ht . ' ' . $reservaSala->getType() . ' ' . $reservaSala->getLoungeName() . '<br>' . $reserva->getTitle(),
"titleOne" => $reservaSala->getDateStart()->format('H:i') . ' ' . $pago2 . $pago1 . $ht . ' ' . $reservaSala->getType(),
"titleTwo" => $reservaSala->getLoungeName(),
"titleThree" => '' . '<br>' . $reserva->getTitle(),
"type" => $reservaSala->getType(),
"id" => $reserva->getId(),
"tooltip" => $tooltip,
"start" => (new \DateTime($reservaSala->getDateStart()->format('Y-m-d') . ' ' . sprintf('%02d', $reservaSala->getHourStart()) . ':' . sprintf('%02d', $reservaSala->getMinStart()))),
"end" => (new \DateTime($reservaSala->getDateEnd()->format('Y-m-d') . ' ' . sprintf('%02d', $reservaSala->getHourEnd()) . ':' . sprintf('%02d', $reservaSala->getMinEnd()))),
"color" => $color,
"loungeId" => $reservaSala->getIdLounge(),
"url" => "/reservations-greenpatio/edit/" . $reserva->getId(),
"status" => $reserva->getStatus(),
);
} else {
// Es una visita
$datos[] = array(
"title" => $reservaSala->getLoungeName(),
"titleOne" => $reservaSala->getDateStart()->format('H:i') . ' ' . ' ' . $reservaSala->getType() . '<br>',
"titleTwo" => $reservaSala->getLoungeName(),
"titleThree" => '' . '<br>' . '<br>' . $reserva->getTitle(),
"type" => $reservaSala->getType(),
"id" => $reservaSala->getId() . 'V',
"tooltip" => $tooltip,
"start" => (new \DateTime($reservaSala->getDateStart()->format('Y-m-d') . ' ' . sprintf('%02d', $reservaSala->getHourStart()) . ':' . sprintf('%02d', $reservaSala->getMinStart()))),
"end" => (new \DateTime($reservaSala->getDateEnd()->format('Y-m-d') . ' ' . sprintf('%02d', $reservaSala->getHourEnd()) . ':' . sprintf('%02d', $reservaSala->getMinEnd()))),
"color" => $color,
"loungeId" => $reservaSala->getIdLounge(),
"url" => '/reservations-greenpatio/addvisit',
"status" => $reserva->getStatus(),
"agentId" => $reservaSala->getAgentId(),
);
}
}
}
$newDatos = [];
// INICIO: Se unen las salas en una sola reserva por ID de reserva
foreach ($datos as $dato) {
// Inicializamos el arreglo para crear los indices
switch ($dato['color']){
case '#a5b8a2': //Montaje o Desmontaje
if ($dato['type'] == 'Montaje'){
$newDatos[$dato['id'].'M'] = null;
} else {
$newDatos[$dato['id'].'D'] = null;
}
break;
default: //Dia de reserva o Visita (la visita ya viene con su indice #V )
$newDatos[$dato['id']] = null;
break;
}
}
foreach ($datos as $dato) {
switch ($dato['color']){
//Montaje o Desmontaje
case '#a5b8a2':
if ($dato['type'] == "Montaje") {
if (!empty($newDatos[$dato['id'] . 'M'])) {
// El Montaje esta ocupando mas de 1 dia, se deben unir los dias de montaje si estamos tratando la misma sala (no se deben unir montajes de salas diferentes)
if ($newDatos[$dato['id'] . 'M']['loungeId'] == $dato['loungeId']) {
if ($newDatos[$dato['id'] . 'M']['start'] > $dato['start']) { $newDatos[$dato['id'] . 'M']['start'] = $dato['start']; }
if ($newDatos[$dato['id'] . 'M']['end'] < $dato['end']) { $newDatos[$dato['id'] . 'M']['end'] = $dato['end']; }
} else {
if (array_key_exists($dato['id'] . 'M'.$dato['loungeId'],$newDatos)){
if ($newDatos[$dato['id'] . 'M'.$dato['loungeId']]['start'] > $dato['start']) { $newDatos[$dato['id'] . 'M'.$dato['loungeId']]['start'] = $dato['start']; }
if ($newDatos[$dato['id'] . 'M'.$dato['loungeId']]['end'] < $dato['end']) { $newDatos[$dato['id'] . 'M'.$dato['loungeId']]['end'] = $dato['end']; }
} else {
$newDatos[$dato['id'] . 'M'.$dato['loungeId']] = $dato;
}
}
} else {
$newDatos[$dato['id'] . 'M'] = $dato;
}
} else {
if ($dato['type'] == "Desmontaje") {
if (!empty($newDatos[$dato['id'] . 'D'])) {
// El Desmontaje esta ocupando mas de 1 dia, se deben unir los dias de desmontaje
if ($newDatos[$dato['id'] . 'D']['start'] > $dato['start']) { $newDatos[$dato['id'] . 'D']['start'] = $dato['start']; }
if ($newDatos[$dato['id'] . 'D']['end'] < $dato['end']) { $newDatos[$dato['id'] . 'D']['end'] = $dato['end']; }
} else {
$newDatos[$dato['id'] . 'D'] = $dato;
}
}
}
break;
//Visita Angie (id user 77)
case '#22cbf5':
if ($dato['type'] == "Visit") {
$newDatos[$dato['start']->format('Ymd').'V77'.$dato['id']] = $dato;
if (!empty($newDatos[$dato['start']->format('Ymd').'V77'])) {
// Hay varias visitas ese mismo dia para el agente
// $newDatos[$dato['start']->format('Ymd').'V77']['tooltip'] = $newDatos[$dato['start']->format('Ymd').'V77']['tooltip'] . $dato['tooltip'];
} else {
// $newDatos[$dato['start']->format('Ymd').'V77'] = $dato;
}
}
break;
//Visita Gabriela (id user 82)
case '#f5229a':
if ($dato['type'] == "Visit") {
$newDatos[$dato['start']->format('Ymd').'V82'.$dato['id']] = $dato;
if (!empty($newDatos[$dato['start']->format('Ymd').'V82'])) {
// Hay varias visitas ese mismo dia para el agente
// $newDatos[$dato['start']->format('Ymd').'V82']['tooltip'] = $newDatos[$dato['start']->format('Ymd').'V82']['tooltip'] . $dato['tooltip'];
} else {
// $newDatos[$dato['start']->format('Ymd').'V82'] = $dato;
}
}
break;
//Visita Cristina (id user 120)
case '#157cc2':
if ($dato['type'] == "Visit") {
$newDatos[$dato['start']->format('Ymd').'V120'.$dato['id']] = $dato;
if (!empty($newDatos[$dato['start']->format('Ymd').'V120'])) {
// Hay varias visitas ese mismo dia para el agente
// $newDatos[$dato['start']->format('Ymd').'V120']['tooltip'] = $newDatos[$dato['start']->format('Ymd').'V120']['tooltip'] . $dato['tooltip'];
} else {
// $newDatos[$dato['start']->format('Ymd').'V120'] = $dato;
}
}
break;
//Visita Generica para agentes a Covarrubias
case '#f0d800':
if ($dato['type'] == "Visit") {
$newDatos[$dato['start']->format('Ymd').'V0'.$dato['id']] = $dato;
if (!empty($newDatos[$dato['start']->format('Ymd').'V0'])) {
// Hay varias visitas ese mismo dia para el agente
// $newDatos[$dato['start']->format('Ymd').'V0']['tooltip'] = $newDatos[$dato['start']->format('Ymd').'V0']['tooltip'] . $dato['tooltip'];
} else {
// $newDatos[$dato['start']->format('Ymd').'V0'] = $dato;
}
}
break;
//Visita Generica para agentes a Bella View
case '#990202':
if ($dato['type'] == "Visit") {
$newDatos[$dato['start']->format('Ymd').'V0'.$dato['id']] = $dato;
if (!empty($newDatos[$dato['start']->format('Ymd').'V0'])) {
// Hay varias visitas ese mismo dia para el agente
// $newDatos[$dato['start']->format('Ymd').'V0']['tooltip'] = $newDatos[$dato['start']->format('Ymd').'V0']['tooltip'] . $dato['tooltip'];
} else {
// $newDatos[$dato['start']->format('Ymd').'V0'] = $dato;
}
}
break;
//Reserva color naranja Bloqueo
case '#ffaa00':
if (empty($newDatos[$dato['id']])){
$newDatos[$dato['id']] = $dato;
} else {
// Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
$newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' . $dato['tooltip'];
// Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
// No se encontro la cadena, debemos agregar
$newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' . ' '. $dato['titleTwo'];
$newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
}
}
break;
//Reserva color morado Bloqueo (Covarrubias)
case '#b873bf':
if (empty($newDatos[$dato['id']])){
$newDatos[$dato['id']] = $dato;
} else {
// Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
$newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' . $dato['tooltip'];
// Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
// No se encontro la cadena, debemos agregar
$newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' . ' '. $dato['titleTwo'];
$newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
}
}
break;
//Reserva color Rojo claro Cotizado
case '#faafc3':
if (empty($newDatos[$dato['id']])){
$newDatos[$dato['id']] = $dato;
} else {
// Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
$newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' . $dato['tooltip'];
// Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
// No se encontro la cadena, debemos agregar
$newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' . ' '. $dato['titleTwo'];
$newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
}
}
break;
//Reserva color Rojo Reserva Cancelada
case '#ff0000':
//Las canceladas no se muestran en el calendario
break;
//Reserva color Verde Reserva Confirmada, Facturada, (se ha adelantado un pago parcial)
case '#13ad27':
if (empty($newDatos[$dato['id']])){
$newDatos[$dato['id']] = $dato;
} else {
// Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
$newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' . $dato['tooltip'];
// Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
// No se encontro la cadena, debemos agregar
$newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' . ' '. $dato['titleTwo'];
$newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
}
}
break;
//Reserva color Verde Reserva Confirmada, Facturada, (Covarrubias)
case '#017362':
if (empty($newDatos[$dato['id']])){
$newDatos[$dato['id']] = $dato;
} else {
// Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
$newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' . $dato['tooltip'];
// Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
// No se encontro la cadena, debemos agregar
$newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' . ' '. $dato['titleTwo'];
$newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
}
}
break;
//Reserva color Verde Reserva Confirmada, Facturada, (Bella View)
case '#066191':
if (empty($newDatos[$dato['id']])){
$newDatos[$dato['id']] = $dato;
} else {
// Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
$newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' . $dato['tooltip'];
// Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
// No se encontro la cadena, debemos agregar
$newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' . ' '. $dato['titleTwo'];
$newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
}
}
break;
//Se pondra color a negro para resaltar este cualquier caso que no haya sido considerado (status Pendiente)
default:
if (empty($newDatos[$dato['id']])){
$newDatos[$dato['id']] = $dato;
} else {
// Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
$newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' . $dato['tooltip'];
// Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
// No se encontro la cadena, debemos agregar
$newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' . ' '. $dato['titleTwo'];
$newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
}
}
// Se pone en color negro para resaltar este caso que no esta entrando en ninguno de los casos anteriores
$newDatos[$dato['id']]['color'] = '#000000';
if ($dato['type'] == "Visit") {
// Si no es una de los agentes regulares (Gaby, Angie, Cristina) se busca el color del usuario configurado en el perfil
$elAgente = $em->getRepository(User::class)->findOneById($dato['agentId']);
$elAgenteColor = !empty($elAgente) ? $elAgente->getColor() : null;
if (!empty($elAgenteColor)){ $newDatos[$dato['id']]['color'] = $elAgenteColor; }
}
break;
}
}
$datos0 = [];
foreach ($newDatos as $key => $item) {
if (!empty($item['id'])) {
$datos0[$key] = array('title' => $item['title'],
'titleOne' => $item['titleOne'],
'titleTwo' => $item['titleTwo'],
'titleThree' => $item['titleThree'],
'type' => $item['type'],
'id' => $item['id'],
'tooltip' => $item['tooltip'],
'start' => $item['start'],
'end' => $item['end'],
'color' => $item['color'],
'loungeId' => $item['loungeId'],
'url' => $item['url']
);
}
}
$newDatos = $datos0;
$datos = [];
foreach ($newDatos as $item) {
if ($item['color'] != '#ff0000') {
// No se agregan al calendario los elementos eliminados o elementos vacios
if (!empty($item)) {
//INICIO: Verificamos por huecos dentro de la reserva
if (empty($item['type'])) {
// solo las reservas se van a verificar en este if
if ((date_diff($item['start'], $item['end'])->d) > 1) { //el evento tiene mas de 2 dias, puede haber huecos
$resSimples = $em->getRepository(ReservationLoungeSimple::class)->findByIdReservation($item['id']);
$period = new DatePeriod( $item['start'], new DateInterval('P1D'), $item['end'] );
$arrayPeriod = [];
foreach ($period as $key => $value) { $arrayPeriod[] = $value; }
$logAllDiasEnReserva = false;
$logDiaEnReserva = false;
//Verificamos que cada dia tenga su reserva de sala para que no haya hueco
foreach ($arrayPeriod as $day) {
foreach ($resSimples as $resSimple) {
if ($resSimple->getDateStart()->format('Y-m-d') == $day->format('Y-m-d')) {
$logDiaEnReserva = true;
break;
}
}
if (!$logDiaEnReserva) {
//Un dia no se encontraba, hay un hueco
foreach ($resSimples as $resDayToAdd) {
if (empty($resDayToAdd->getType())) { // Solo se deben agregar salsa los montajes y desmontajes aqui no van
$item['start'] = $resDayToAdd->getDateStart();
$item['end'] = $resDayToAdd->getDateEnd();
$br = '<br>';
$br = strpos($item['title'], $br);
$tempText = substr($item['title'], $br + 4);
$item['title'] = $resDayToAdd->getDateStart()->format('H:i') . ' ' . '<br>' . $tempText;
$datos[] = $item;
}
}
break;
} else {
//Se debe evaluar el siguiente dia
$logDiaEnReserva = false;
if ($day->format('Y-m-d') == (end($arrayPeriod))->format('Y-m-d')) { //Si es el ultimo elemento evaluado, todos los dias se encontraban en Reservas Simple
$logAllDiasEnReserva = true;
}
}
}
if ($logAllDiasEnReserva) { $datos[] = $item; }
} else {
// El evento es de 1 o 2 dias, no hay posibilidad de hueco
$datos[] = $item;
}
} else {
//Es Visita Las visitas son las unicas entradas que no tienen hueco
if ($item['type'] == 'Visit'){
$datos[] = $item;
} else {
// es montaje o desmontaje, se va verificar por huecos
if ((date_diff($item['start'], $item['end'])->d) > 1) { //el item tiene mas de 2 dias, puede haber huecos
$parameters = array(
'id' => $item['id'],
'type' => $item['type'],
);
$dql = 'SELECT i
FROM GreenPatioBundle:ReservationLoungeSimple i
WHERE i.idReservation = :id
and i.type = :type';
$query = $em->createQuery($dql)->setParameters($parameters);
$resSimples = $query->getResult();
$period = new DatePeriod( $item['start'], new DateInterval('P1D'), $item['end'] );
$arrayPeriod = [];
foreach ($period as $key => $value) { $arrayPeriod[] = $value; }
$logAllDiasEnReserva = false;
$logDiaEnReserva = false;
//Verificamos que cada dia tenga su reserva de sala para que no haya hueco
foreach ($arrayPeriod as $day) {
foreach ($resSimples as $resSimple) {
if ($resSimple->getDateStart()->format('Y-m-d') == $day->format('Y-m-d')) {
$logDiaEnReserva = true;
break;
}
}
if (!$logDiaEnReserva) {
//Un dia no se encontraba, hay un hueco
foreach ($resSimples as $resDayToAdd) {
if (!empty($resDayToAdd->getType())) { // Solo se deben agregar montajes y desmontajes aqui
$item['start'] = $resDayToAdd->getDateStart();
$item['end'] = $resDayToAdd->getDateEnd();
$br = '<br>';
$br = strpos($item['title'], $br);
$tempText = substr($item['title'], $br + 4);
$item['title'] = $resDayToAdd->getDateStart()->format('H:i') . ' ' . '<br>' . $tempText;
$datos[] = $item;
}
}
break;
} else {
//Se debe evaluar el siguiente dia
$logDiaEnReserva = false;
if ($day->format('Y-m-d') == (end($arrayPeriod))->format('Y-m-d')) { //Si es el ultimo elemento evaluado, todos los dias se encontraban en Reservas Simple
$logAllDiasEnReserva = true;
}
}
}
if ($logAllDiasEnReserva) { $datos[] = $item; }
} else {
// El montaje o desmontaje es de 1 o 2 dias, no hay posibilidad de hueco
$datos[] = $item;
}
}
}
//FIN: Verificamos por huecos dentro de la reserva
}
}
}
$return = array( 'reservation' => $datos, );
$response = new JsonResponse($return);
return $response;
}
/**
* @Route("/gp-cvr/calendarconfac", name="gp_cvr_calendar_con_fac")
*/
public function calendarCvrGpConfFactReservationsAction(Request $request, AlertService $alertService) {
$session = new Session();
$token=$session->get('tokenGoogleCalendar');
if (!is_null($token)) {
$this->googleCalendar->setAccessToken($token);
$connectGoogle = "1";
}else{
$connectGoogle = "0";
}
$user_logueado = $this->get('security.token_storage')->getToken()->getUser();
$user_id = $user_logueado->getId();
$wnotes = new WidgetNotes();
$wnotes->setDateAt(new \DateTime("now"));
$form = $this->createWidgetNotesCreateForm($wnotes);
$alertService->loadGpAlerts($user_logueado);
return $this->render('MDS/GreenPatioBundle/reservations/calendar-gp-cvr-confac-reservations.html.twig',
array(
'form' => $form->createView(),
'user'=> $user_id,
'connectGoogle' => $connectGoogle,
)
);
}
/**
* @Route("/gp-cvr/eventsgpcvrconfac", name="get_reservations_gp_cvr_con_fac")
*/
public function reservationGpCvrEventsConfFactAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
// Buscamos las reservas desde 1 año atras en adelante para no traer exceso de datos
$todayOneYearAgo = new DateTime('now -365 days');
$parameters = array('dateStart' => $todayOneYearAgo,);
$dql = 'SELECT p
FROM GreenPatioBundle:ReservationLoungeSimple p
WHERE p.dateStart >= :dateStart
ORDER BY p.dateStart ASC ';
$query = $em->createQuery($dql)->setParameters($parameters);
$reservation = $query->getResult();
// Buscamos las visitas desde 1 semana atras en adelante para no traer exceso de datos (Tiempo confirmado por Gabriela Bracho)
$todayOneWeekAgo = new DateTime('now -1 week');
$parameters = array('dateStart' => $todayOneWeekAgo,);
$dql = 'SELECT p
FROM GreenPatioBundle:ReservationVisit p
WHERE p.dateStart >= :dateStart
ORDER BY p.dateStart ASC ';
$query = $em->createQuery($dql)->setParameters($parameters);
$visitas = $query->getResult();
$arrayFechaVisitas = [];
foreach ($visitas as $item) {
//Se agrupan las visitas por fechas
$arrayFechaVisitas[$item->getDateStart()->format('Y-m-d').$item->getId()][] = $item;
}
$newArrayVisitas = [];
//Se agrupan las visitas por agente
foreach ($arrayFechaVisitas as $fecha) {
foreach ($fecha as $item) {
//Se van concatenando los titulos de las visitas en una sola
$loungeNameTemp = '';
$idAgentLounge = ($item->getIdLounge() == 0) ? $item->getAgentId() : '0';
if (!empty($newArrayVisitas[$item->getDateStart()->format('Y-m-d') . '-' . $idAgentLounge])) {
// $loungeNameTemp = $newArrayVisitas[$item->getDateStart()->format('Y-m-d') . '-' . $idAgentLounge]->getLoungeName();
}
$item->setLoungeName($loungeNameTemp . $item->getDateStart()->format('H:i') . ' ' . $item->getLoungeName() . '<br>');
$newArrayVisitas[$item->getDateStart()->format('Y-m-d') . '-' . $idAgentLounge] = $item;
}
}
$visitas = $newArrayVisitas;
$xArray = [];
foreach ($arrayFechaVisitas as $elem) { foreach ($elem as $item) { $xArray[] = $item; } }
foreach ($xArray as $item) { array_push($reservation, $item); }
$datos = [];
$datosMontaje = [];
$datosDesMontaje = [];
if (!empty($reservation)) {
foreach ($reservation as $reservaSala) {
if (!empty($reservaSala->getIdReservation())) {
$reserva = $em->getRepository(Reservation::class)->findOneById($reservaSala->getIdReservation());
if ($reservaSala->getType() == 'Visit') { $reserva->setStatus('Visit'); }
} else {
// Estamos con una visita
$reserva = new Reservation();
$reserva->setStatus('Visit');
$reserva->setTitle($reservaSala->getLoungeName());
}
if ($reservaSala->getDateStart()->format('d') == $reservaSala->getDateEnd()->format('d')) {
$tooltip = $reserva->getTitle() . ' - <b><h3>' . $reservaSala->getLoungeName() . "</h3></b> Del " . $reservaSala->getDateStart()->format('d/m') . ' desde ' . $reservaSala->getHourStart() . ":" . $reservaSala->getMinStart() . " a " . $reservaSala->getHourEnd() . ":" . $reservaSala->getMinEnd();
} else {
$tooltip = $reserva->getTitle() . ' - <b><h3>' . $reservaSala->getLoungeName() . "</h3></b> Del " . $reservaSala->getDateStart()->format('d/m') . ' desde ' . $reservaSala->getHourStart() . ":" . $reservaSala->getMinStart() . " al " . $reservaSala->getDateEnd()->format('d/m') . ' hasta ' . $reservaSala->getHourEnd() . ":" . $reservaSala->getMinEnd();
}
$logicoVisita = false;
if (!is_null($reserva->getStatus())) {
$statusColorMap = [
'Bloqueo' => function($reservaSala) {
$idLounge = $reservaSala->getIdLounge();
if ($idLounge > 29) {
return "#2691fc"; // Marrón (Bella View)
} elseif ($idLounge > 21) {
return "#b873bf"; // Morado (Covarrubias)
} else {
return "#ffaa00"; // Naranja (Green Patio)
}
},
'Confirmed' => "#13ad27",
'Invoiced' => "#13ad27",
'Deleted' => "#ff0000",
'Cotizado' => "#faafc3",
'Reservado' => "#13ad27",
'Visit' => function($reservaSala) {
if ($reservaSala->getIdLounge() == 0) {
return $agentColorMap[$reservaSala->getAgentId()] ?? "";
} else {
if ($reservaSala->getIdLounge() == 1) {
return '#f0d800'; // Color Covarrubias
} else {
return '#066191'; // Color Bella View
}
}
},
'default' => "#066191",
];
$color = "";
$logicoVisita = false;
if (array_key_exists($reserva->getStatus(), $statusColorMap)) {
$value = $statusColorMap[$reserva->getStatus()];
// Si el valor es una función, la ejecutamos para obtener el color.
$color = is_callable($value) ? $value($reservaSala) : $value;
if ($reserva->getStatus() === 'Visit') {
$logicoVisita = true;
}
} else {
$color = $statusColorMap['default'];
}
if (!empty($reservaSala->getType()) and !($reservaSala->getType() == 'Visit')) {
//Es un montaje o desmontaje
$color = "#a5b8a2";
// Si es un montaje o desmontaje pero esta cancelado debe prevalecer el color de cancelado
if ($reserva->getStatus() == 'Deleted') { $color = "#ff0000"; }
}
if (($reservaSala->getIdLounge() > 21) and ($reservaSala->getIdLounge() < 30)){
//Ajustamos el color a una sala de covarrubia
switch ($color) {
case '#ffaa00': $color = "#b873bf"; break; //naranja (bloqueo) => morado
case '#13ad27': $color = "#017362"; break; //verde (Confirmed) => verde olivo
case '#ff0000': $color = "#ff0000"; break; //rojo
case '#faafc3': $color = "#faafc3"; break; //Rojo claro
default: break; //no modificar el color
}
}
if ($reservaSala->getIdLounge() > 29){
//Ajustamos el color a una sala de bella view
switch ($color) {
case '#ffaa00': $color = "#2691fc"; break; //naranja (bloqueo) => azul claro
case '#13ad27': $color = "#066191"; break; //verde (Confirmed) => azul oscuro
case '#ff0000': $color = "#ff0000"; break; //rojo
case '#faafc3': $color = "#faafc3"; break; //Rojo claro
default: break; //no modificar el color
}
}
}
$pago1 = "";
$pago2 = "";
$ht = "";
if (!($reserva->getStatus() == 'Visit')) {
$paymentsAll = $em->getRepository(ReservationPaymentsClient::class)->findOneByReservationId($reserva->getId());
} else {
$paymentsAll = null;
}
if (!empty($paymentsAll)) {
$pago2 = "<i class='icon-coin-euro' style='color: #000 !important;'></i>"; //Hay pagos parciales
}
if (!($reserva->getStatus() == 'Visit')) {
$facturas = $em->getRepository(ReservationInvoice::class)->findByReservationId($reserva->getId());
$facturasCVR = $em->getRepository(CvrReservationInvoice::class)->findByReservationId($reserva->getId());
$facturasBLV = $em->getRepository(BlvReservationInvoice::class)->findByReservationId($reserva->getId());
foreach ($facturasCVR as $item) { array_push($facturas, $item); }
foreach ($facturasBLV as $item) { array_push($facturas, $item); }
}
if (!empty($facturas)) {
foreach ($facturas as $factura) {
if ($factura->getMaster() == "master") {
$pago1 = "<i class='icon-thumbs-up3' style='color: #000 !important;'></i>";// Se ha pagado la totalidad
}
if ($factura->getMaster() != "master") {
$pago2 = "<i class='icon-coin-euro' style='color: #000 !important;'></i>"; //Hay pagos parciales
}
}
}
if ($reserva->getCateringName() == 'HIGO & TRIGO, S.L.') {
$ht = "<a style='color: #000 !important;'><strong>H&T</strong></a>"; // Es una reserva con servicio de Catering Higo & Trigo
}
// Pagos parciales y totales
if (!empty($reserva)) {
if (!$logicoVisita) {
if (($reserva->getStatus() == 'Confirmed') or ($reserva->getStatus() == 'Invoiced')) {
$datos[] = array(
"title" => $reservaSala->getDateStart()->format('H:i') . ' ' . $pago2 . $pago1 . $ht . ' ' . $reservaSala->getType() . ' ' . $reservaSala->getLoungeName() . '<br>' . $reserva->getTitle(),
"titleOne" => $reservaSala->getDateStart()->format('H:i') . ' ' . $pago2 . $pago1 . $ht . ' ' . $reservaSala->getType(),
"titleTwo" => $reservaSala->getLoungeName(),
"titleThree" => '' . '<br>' . $reserva->getTitle(),
"type" => $reservaSala->getType(),
"id" => $reserva->getId(),
"tooltip" => $tooltip,
"start" => $reservaSala->getDateStart(),
"end" => $reservaSala->getDateEnd(),
"color" => $color,
"loungeId" => $reservaSala->getIdLounge(),
"url" => "/reservations-greenpatio/edit/" . $reserva->getId(),
"status" => $reserva->getStatus(),
);
}
} else {
// Es una visita
}
} else {
$datos = [];
}
}
}
$newDatos = [];
// INICIO: Se unen las salas en una sola reserva por ID de reserva
foreach ($datos as $dato) {
// Inicializamos el arreglo para crear los indices
switch ($dato['color']){
case '#a5b8a2': //Montaje o Desmontaje
if ($dato['type'] == 'Montaje'){
$newDatos[$dato['id'].'M'] = null;
} else {
$newDatos[$dato['id'].'D'] = null;
}
break;
default: //Dia de reserva o Visita (la visita ya viene con su indice #V )
$newDatos[$dato['id']] = null;
break;
}
}
foreach ($datos as $dato) {
switch ($dato['color']){
//Montaje o Desmontaje
case '#a5b8a2':
if ($dato['type'] == "Montaje") {
if (!empty($newDatos[$dato['id'] . 'M'])) {
// El Montaje esta ocupando mas de 1 dia, se deben unir los dias de montaje si estamos tratando la misma sala (no se deben unir montajes de salas diferentes)
if ($newDatos[$dato['id'] . 'M']['loungeId'] == $dato['loungeId']) {
if ($newDatos[$dato['id'] . 'M']['start'] > $dato['start']) { $newDatos[$dato['id'] . 'M']['start'] = $dato['start']; }
if ($newDatos[$dato['id'] . 'M']['end'] < $dato['end']) { $newDatos[$dato['id'] . 'M']['end'] = $dato['end']; }
} else {
if (array_key_exists($dato['id'] . 'M'.$dato['loungeId'],$newDatos)){
if ($newDatos[$dato['id'] . 'M'.$dato['loungeId']]['start'] > $dato['start']) { $newDatos[$dato['id'] . 'M'.$dato['loungeId']]['start'] = $dato['start']; }
if ($newDatos[$dato['id'] . 'M'.$dato['loungeId']]['end'] < $dato['end']) { $newDatos[$dato['id'] . 'M'.$dato['loungeId']]['end'] = $dato['end']; }
} else {
$newDatos[$dato['id'] . 'M'.$dato['loungeId']] = $dato;
}
}
} else {
$newDatos[$dato['id'] . 'M'] = $dato;
}
} else {
if ($dato['type'] == "Desmontaje") {
if (!empty($newDatos[$dato['id'] . 'D'])) {
// El Desmontaje esta ocupando mas de 1 dia, se deben unir los dias de desmontaje
if ($newDatos[$dato['id'] . 'D']['start'] > $dato['start']) { $newDatos[$dato['id'] . 'D']['start'] = $dato['start']; }
if ($newDatos[$dato['id'] . 'D']['end'] < $dato['end']) { $newDatos[$dato['id'] . 'D']['end'] = $dato['end']; }
} else {
$newDatos[$dato['id'] . 'D'] = $dato;
}
}
}
break;
//Visita Angie (id user 77)
case '#22cbf5':
if ($dato['type'] == "Visit") {
$newDatos[$dato['start']->format('Ymd').'V77'.$dato['id']] = $dato;
if (!empty($newDatos[$dato['start']->format('Ymd').'V77'])) {
// Hay varias visitas ese mismo dia para el agente
// $newDatos[$dato['start']->format('Ymd').'V77']['tooltip'] = $newDatos[$dato['start']->format('Ymd').'V77']['tooltip'] . $dato['tooltip'];
} else {
// $newDatos[$dato['start']->format('Ymd').'V77'] = $dato;
}
}
break;
//Visita Gabriela (id user 82)
case '#f5229a':
if ($dato['type'] == "Visit") {
$newDatos[$dato['start']->format('Ymd').'V82'.$dato['id']] = $dato;
if (!empty($newDatos[$dato['start']->format('Ymd').'V82'])) {
// Hay varias visitas ese mismo dia para el agente
// $newDatos[$dato['start']->format('Ymd').'V82']['tooltip'] = $newDatos[$dato['start']->format('Ymd').'V82']['tooltip'] . $dato['tooltip'];
} else {
// $newDatos[$dato['start']->format('Ymd').'V82'] = $dato;
}
}
break;
//Visita Cristina (id user 120)
case '#157cc2':
if ($dato['type'] == "Visit") {
$newDatos[$dato['start']->format('Ymd').'V120'.$dato['id']] = $dato;
if (!empty($newDatos[$dato['start']->format('Ymd').'V120'])) {
// Hay varias visitas ese mismo dia para el agente
// $newDatos[$dato['start']->format('Ymd').'V120']['tooltip'] = $newDatos[$dato['start']->format('Ymd').'V120']['tooltip'] . $dato['tooltip'];
} else {
// $newDatos[$dato['start']->format('Ymd').'V120'] = $dato;
}
}
break;
//Visita Generica para agentes a Covarrubias
case '#f0d800':
if ($dato['type'] == "Visit") {
$newDatos[$dato['start']->format('Ymd').'V0'.$dato['id']] = $dato;
if (!empty($newDatos[$dato['start']->format('Ymd').'V0'])) {
// Hay varias visitas ese mismo dia para el agente
// $newDatos[$dato['start']->format('Ymd').'V0']['tooltip'] = $newDatos[$dato['start']->format('Ymd').'V0']['tooltip'] . $dato['tooltip'];
} else {
// $newDatos[$dato['start']->format('Ymd').'V0'] = $dato;
}
}
break;
//Visita Generica para agentes a Bella View
case '#990202':
if ($dato['type'] == "Visit") {
$newDatos[$dato['start']->format('Ymd').'V0'.$dato['id']] = $dato;
if (!empty($newDatos[$dato['start']->format('Ymd').'V0'])) {
// Hay varias visitas ese mismo dia para el agente
// $newDatos[$dato['start']->format('Ymd').'V0']['tooltip'] = $newDatos[$dato['start']->format('Ymd').'V0']['tooltip'] . $dato['tooltip'];
} else {
// $newDatos[$dato['start']->format('Ymd').'V0'] = $dato;
}
}
break;
//Reserva color naranja Bloqueo
case '#ffaa00':
if (empty($newDatos[$dato['id']])){
$newDatos[$dato['id']] = $dato;
} else {
// Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
$newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' . $dato['tooltip'];
// Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
// No se encontro la cadena, debemos agregar
$newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' . ' '. $dato['titleTwo'];
$newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
}
}
break;
//Reserva color morado Bloqueo (Covarrubias)
case '#b873bf':
if (empty($newDatos[$dato['id']])){
$newDatos[$dato['id']] = $dato;
} else {
// Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
$newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' . $dato['tooltip'];
// Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
// No se encontro la cadena, debemos agregar
$newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' . ' '. $dato['titleTwo'];
$newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
}
}
break;
//Reserva color Rojo claro Cotizado
case '#faafc3':
if (empty($newDatos[$dato['id']])){
$newDatos[$dato['id']] = $dato;
} else {
// Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
$newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' . $dato['tooltip'];
// Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
// No se encontro la cadena, debemos agregar
$newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' . ' '. $dato['titleTwo'];
$newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
}
}
break;
//Reserva color Rojo Reserva Cancelada
case '#ff0000':
//Las canceladas no se muestran en el calendario
break;
//Reserva color Verde Reserva Confirmada, Facturada, (se ha adelantado un pago parcial)
case '#13ad27':
if (empty($newDatos[$dato['id']])){
$newDatos[$dato['id']] = $dato;
} else {
// Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
$newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' . $dato['tooltip'];
// Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
// No se encontro la cadena, debemos agregar
$newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' . ' '. $dato['titleTwo'];
$newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
}
}
break;
//Reserva color Verde Reserva Confirmada, Facturada, (Covarrubias)
case '#017362':
if (empty($newDatos[$dato['id']])){
$newDatos[$dato['id']] = $dato;
} else {
// Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
$newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' . $dato['tooltip'];
// Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
// No se encontro la cadena, debemos agregar
$newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' . ' '. $dato['titleTwo'];
$newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
}
}
break;
//Se pondra color a negro para resaltar este cualquier caso que no haya sido considerado (status Pendiente)
default:
if (empty($newDatos[$dato['id']])){
$newDatos[$dato['id']] = $dato;
} else {
// Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
$newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' . $dato['tooltip'];
// Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
// No se encontro la cadena, debemos agregar
$newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' . ' '. $dato['titleTwo'];
$newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
}
}
// Se pone en color negro para resaltar este caso que no esta entrando en ninguno de los casos anteriores
$newDatos[$dato['id']]['color'] = '#000000';
if ($dato['type'] == "Visit") {
// Si no es una de los agentes regulares (Gaby, Angie, Cristina) se busca el color del usuario configurado en el perfil
$elAgente = $em->getRepository(User::class)->findOneById($dato['agentId']);
$elAgenteColor = !empty($elAgente) ? $elAgente->getColor() : null;
if (!empty($elAgenteColor)){ $newDatos[$dato['id']]['color'] = $elAgenteColor; }
}
break;
}
}
$datos0 = array();
foreach ($newDatos as $key => $item) {
if (!empty($item['id'])) {
$datos0[$key] = array('title' => $item['title'],
'titleOne' => $item['titleOne'],
'titleTwo' => $item['titleTwo'],
'titleThree' => $item['titleThree'],
'type' => $item['type'],
'id' => $item['id'],
'tooltip' => $item['tooltip'],
'start' => $item['start'],
'end' => $item['end'],
'color' => $item['color'],
'loungeId' => $item['loungeId'],
'url' => $item['url']
);
}
}
$newDatos = $datos0;
$datos = array();
foreach ($newDatos as $item) {
if ($item['color'] != '#ff0000') {
// No se agregan al calendario los elementos eliminados o elementos vacios
if (!empty($item)) {
//INICIO: Verificamos por huecos dentro de la reserva
if (empty($item['type'])) {
// solo las reservas se van a verificar en este if
if ((date_diff($item['start'], $item['end'])->d) > 1) { //el evento tiene mas de 2 dias, puede haber huecos
$resSimples = $em->getRepository(ReservationLoungeSimple::class)->findByIdReservation($item['id']);
$period = new DatePeriod( $item['start'], new DateInterval('P1D'), $item['end'] );
$arrayPeriod = array();
foreach ($period as $key => $value) { $arrayPeriod[] = $value; }
$logAllDiasEnReserva = false;
$logDiaEnReserva = false;
//Verificamos que cada dia tenga su reserva de sala para que no haya hueco
foreach ($arrayPeriod as $day) {
foreach ($resSimples as $resSimple) {
if ($resSimple->getDateStart()->format('Y-m-d') == $day->format('Y-m-d')) {
$logDiaEnReserva = true;
break;
}
}
if (!$logDiaEnReserva) {
//Un dia no se encontraba, hay un hueco
foreach ($resSimples as $resDayToAdd) {
if (empty($resDayToAdd->getType())) { // Solo se deben agregar salsa los montajes y desmontajes aqui no van
$item['start'] = $resDayToAdd->getDateStart();
$item['end'] = $resDayToAdd->getDateEnd();
$br = '<br>';
$br = strpos($item['title'], $br);
$tempText = substr($item['title'], $br + 4);
$item['title'] = $resDayToAdd->getDateStart()->format('H:i') . ' ' . '<br>' . $tempText;
$datos[] = $item;
}
}
break;
} else {
//Se debe evaluar el siguiente dia
$logDiaEnReserva = false;
if ($day->format('Y-m-d') == (end($arrayPeriod))->format('Y-m-d')) { //Si es el ultimo elemento evaluado, todos los dias se encontraban en Reservas Simple
$logAllDiasEnReserva = true;
}
}
}
if ($logAllDiasEnReserva) { $datos[] = $item; }
} else {
// El evento es de 1 o 2 dias, no hay posibilidad de hueco
$datos[] = $item;
}
} else {
//Es Visita Las visitas son las unicas entradas que no tienen hueco
if ($item['type'] == 'Visit'){
$datos[] = $item;
} else {
// es montaje o desmontaje, se va verificar por huecos
if ((date_diff($item['start'], $item['end'])->d) > 1) { //el item tiene mas de 2 dias, puede haber huecos
$parameters = array(
'id' => $item['id'],
'type' => $item['type'],
);
$dql = 'SELECT i
FROM GreenPatioBundle:ReservationLoungeSimple i
WHERE i.idReservation = :id
and i.type = :type';
$query = $em->createQuery($dql)->setParameters($parameters);
$resSimples = $query->getResult();
$period = new DatePeriod( $item['start'], new DateInterval('P1D'), $item['end'] );
$arrayPeriod = array();
foreach ($period as $key => $value) { $arrayPeriod[] = $value; }
$logAllDiasEnReserva = false;
$logDiaEnReserva = false;
//Verificamos que cada dia tenga su reserva de sala para que no haya hueco
foreach ($arrayPeriod as $day) {
foreach ($resSimples as $resSimple) {
if ($resSimple->getDateStart()->format('Y-m-d') == $day->format('Y-m-d')) {
$logDiaEnReserva = true;
break;
}
}
if (!$logDiaEnReserva) {
//Un dia no se encontraba, hay un hueco
foreach ($resSimples as $resDayToAdd) {
if (!empty($resDayToAdd->getType())) { // Solo se deben agregar montajes y desmontajes aqui
$item['start'] = $resDayToAdd->getDateStart();
$item['end'] = $resDayToAdd->getDateEnd();
$br = '<br>';
$br = strpos($item['title'], $br);
$tempText = substr($item['title'], $br + 4);
$item['title'] = $resDayToAdd->getDateStart()->format('H:i') . ' ' . '<br>' . $tempText;
$datos[] = $item;
}
}
break;
} else {
//Se debe evaluar el siguiente dia
$logDiaEnReserva = false;
if ($day->format('Y-m-d') == (end($arrayPeriod))->format('Y-m-d')) { //Si es el ultimo elemento evaluado, todos los dias se encontraban en Reservas Simple
$logAllDiasEnReserva = true;
}
}
}
if ($logAllDiasEnReserva) { $datos[] = $item; }
} else {
// El montaje o desmontaje es de 1 o 2 dias, no hay posibilidad de hueco
$datos[] = $item;
}
}
}
//FIN: Verificamos por huecos dentro de la reserva
}
}
}
$return = array( 'reservation' => $datos, );
$response = new JsonResponse($return);
return $response;
}
private function createWidgetNotesCreateForm(WidgetNotes $entity)
{
$form = $this->createForm(WidgetNotesType::class, $entity, array(
'action' => $this->generateUrl('widget_notes_calendar_cvr_create'),
'method' => 'POST'
));
return $form;
}
};