src/MDS/GreenPatioBundle/Controller/CvrGPReservationsCalendarController.php line 41

Open in your IDE?
  1. <?php
  2. namespace App\MDS\GreenPatioBundle\Controller;
  3. use App\Entity\User;
  4. use App\Entity\WidgetNotes;
  5. use App\Form\WidgetNotesType;
  6. use App\MDS\GreenPatioBundle\Entity\CvrReservationInvoice;
  7. use App\MDS\GreenPatioBundle\Entity\BlvReservationInvoice;
  8. use App\MDS\GreenPatioBundle\Entity\Reservation;
  9. use App\MDS\GreenPatioBundle\Entity\ReservationInvoice;
  10. use App\MDS\GreenPatioBundle\Entity\ReservationLoungeDetails;
  11. use App\MDS\GreenPatioBundle\Entity\ReservationLoungeSimple;
  12. use App\MDS\GreenPatioBundle\Entity\ReservationPaymentsClient;
  13. use App\Service\AlertService;
  14. use Symfony\Component\Routing\Annotation\Route;
  15. use Symfony\Component\HttpFoundation\Request;
  16. use Symfony\Component\HttpFoundation\Session\Session;
  17. use Symfony\Component\HttpFoundation\JsonResponse;
  18. use Psr\Log\LoggerInterface;
  19. use DateTime;
  20. use DatePeriod;
  21. use DateInterval;
  22. use Doctrine\ORM\EntityManagerInterface;
  23. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  24. // Controlador para el calendario UNIFICADO de las salas de Green Patio y Covarrubias (excluyendo las visitas)
  25. class CvrGPReservationsCalendarController extends AbstractController
  26. {
  27.     private EntityManagerInterface $em;
  28.     public function __construct(EntityManagerInterface $em) {
  29.         $this->em $em;
  30.     }
  31.     /**
  32.      * @Route("/gp-cvr/calendar", name="gp_cvr_calendar")
  33.      */
  34.     public function calendarCvrGpReservationsAction(Request $requestAlertService $alertService) {
  35.         $session = new Session();
  36.         $token=$session->get('tokenGoogleCalendar');
  37.         if (!is_null($token)) {
  38.             $this->googleCalendar->setAccessToken($token);
  39.             $connectGoogle "1";
  40.         }else{
  41.             $connectGoogle "0";
  42.         }
  43.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  44.         $user_id $user_logueado->getId();
  45.         $wnotes = new WidgetNotes();
  46.         $wnotes->setDateAt(new \DateTime("now"));
  47.         $form $this->createWidgetNotesCreateForm($wnotes);
  48.         $alertService->loadGpAlerts($user_logueado);
  49.         return $this->render('MDS/GreenPatioBundle/reservations/calendar-gp-cvr-reservations.html.twig',
  50.             array(
  51.                 'form' => $form->createView(),
  52.                 'user'=> $user_id,
  53.                 'connectGoogle' => $connectGoogle,
  54.             )
  55.         );
  56.     }
  57.     /**
  58.      * @Route("/widget/notes/calendargpcvr/create/", name="widget_notes_calendar_gp_cvr_create")
  59.      */
  60.     public function addNotesAction(Request $requestLoggerInterface $logger)
  61.     {
  62.         $em $this->getDoctrine()->getManager();
  63.         $notes $em->getRepository(WidgetNotes::class)->findAll();
  64.         $wnotes = new WidgetNotes();
  65.         $form $this->createWidgetNotesCreateForm($wnotes);
  66.         $form->handleRequest($request);
  67.         $forAgent $form->get('forAgent')->getData();
  68.         if(!is_null($forAgent)){ $wnotes->setForAgent($forAgent->getId()); }
  69.         if($form->isValid())
  70.         {
  71.             /* Obtengo usuario logueado */
  72.             $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  73.             $user_id $user_logueado->getId();
  74.             $wnotes->setCreatedId($user_id);
  75.             $wnotes->setUpdatedId($user_id);
  76.             /* Gestión de eventos en Log */
  77.             $user_lastname $user_logueado->getLastname();
  78.             $user_name $user_logueado->getName();
  79.             $user_email $user_logueado->getEmail();
  80.             $user_rol $user_logueado->getRoles();
  81.             $event_url $request->getPathInfo();
  82.             $event_complete $user_name.' '.$user_lastname.' - '.$user_email.' - '.$user_rol[0].' | '.$event_url;
  83.             try{
  84.                 $em->persist($wnotes);
  85.                 $em->flush();
  86.                 $event 'The Note has been created succesfully.';
  87.                 $successMessage $this->get('translator')->trans($event);
  88.                 $this->addFlash('mensaje'$successMessage);
  89.                 $logger->info($event_complete.' | '.$event);
  90.             } catch (\Exception $e){
  91.                 $event 'An error occurred: '.$e->getMessage();
  92.                 /* Para el log */
  93.                 $logger->error($event_complete.' | '.$event);
  94.                 /* Para el usuario */
  95.                 $errorMessage $this->get('translator')->trans($event);
  96.                 $this->addFlash('mensajeerror'$errorMessage);
  97.             }
  98.         }else{
  99.             $errorMessage $this->get('translator')->trans('Error, some fields are empty');
  100.             $this->addFlash('mensajeerror'$errorMessage);
  101.         }
  102.         return $this->redirectToRoute('homepage');
  103.     }
  104.     /**
  105.      * @Route("/gp-cvr/eventsgpcvrnew", name="get_reservations_gp_cvr_new")
  106.      * Cambio en como se muestran y se envían los datos a la vista del calendario
  107.      */
  108.     public function reservationGpCvrEventsActionNew()
  109.     {
  110.         // 1) Traemos las reservas de hace 1 año en adelante
  111.         $todayOneYearAgo = new \DateTime('now -365 days');
  112.         $parameters = ['dateStart' => $todayOneYearAgo];
  113.         $dql '
  114.             SELECT r
  115.             FROM GreenPatioBundle:Reservation r
  116.             WHERE r.dateStart >= :dateStart
  117.             AND r.status != \'Deleted\'
  118.             ORDER BY
  119.                 CASE WHEN r.status = \'Confirmed\' THEN 0 ELSE 1 END ASC,
  120.                 r.dateStart ASC
  121.         ';
  122.         $query $this->em->createQuery($dql)->setParameters($parameters);
  123.         $reservations $query->getResult();
  124.         $datos = [];
  125.         if (!empty($reservations)) {
  126.             foreach ($reservations as $reservation) {
  127.                 // 1.1) Obtenemos todos los lounges de la reserva
  128.                 $loungesAll $this->em
  129.                     ->getRepository(ReservationLoungeSimple::class)
  130.                     ->findByIdReservation($reservation->getId());
  131.                 if (empty($loungesAll)) {
  132.                     continue;
  133.                 }
  134.                 // 2) Separamos primero los lounges “normales” (no montaje ni desmontaje)
  135.                 $loungesNormales = [];
  136.                 $loungesMontaje   = [];
  137.                 $loungesDesmontaje= [];
  138.                 foreach ($loungesAll as $lounge) {
  139.                     if ($lounge->getType() === 'Montaje') {
  140.                         $loungesMontaje[] = $lounge;
  141.                     } elseif ($lounge->getType() === 'Desmontaje') {
  142.                         $loungesDesmontaje[] = $lounge;
  143.                     } else {
  144.                         $loungesNormales[] = $lounge;
  145.                     }
  146.                 }
  147.                 // 3) Agrupamos los lounges normales en bloques de fechas consecutivas
  148.                 $bloquesNormales $this->_splitLoungesByConsecutiveDays($loungesNormales);
  149.                 // 4) Por cada bloque, montamos un evento
  150.                 foreach ($bloquesNormales as $bloque) {
  151.                     $evento $this->_getEventsData($reservation$bloquefalse);
  152.                     if (!empty($evento)) {
  153.                         $datos[] = $evento;
  154.                     }
  155.                 }
  156.                 // 5) Si hay bloques de montaje, hacemos lo mismo (pero marcando isMontajeDesmontaje=true)
  157.                 $bloquesMontaje $this->_splitLoungesByConsecutiveDays($loungesMontaje);
  158.                 foreach ($bloquesMontaje as $bloqueMontaje) {
  159.                     $eventoMontaje $this->_getEventsData($reservation$bloqueMontajetrue);
  160.                     if (!empty($eventoMontaje)) {
  161.                         $datos[] = $eventoMontaje;
  162.                     }
  163.                 }
  164.                 // 6) Si hay bloques de desmontaje, idem
  165.                 $bloquesDesmontaje $this->_splitLoungesByConsecutiveDays($loungesDesmontaje);
  166.                 foreach ($bloquesDesmontaje as $bloqueDesmontaje) {
  167.                     $eventoDesmontaje $this->_getEventsData($reservation$bloqueDesmontajetrue);
  168.                     if (!empty($eventoDesmontaje)) {
  169.                         $datos[] = $eventoDesmontaje;
  170.                     }
  171.                 }
  172.             }
  173.         }
  174.         // 7) Lo mismo para visitas (no cambia la lógica original)
  175.         $todayOneWeekAgo = new \DateTime('now -1 week');
  176.         $parameters = ['dateStart' => $todayOneWeekAgo];
  177.         $dql '
  178.             SELECT p
  179.             FROM GreenPatioBundle:ReservationVisit p
  180.             WHERE p.dateStart >= :dateStart
  181.             ORDER BY p.dateStart ASC
  182.         ';
  183.         $query $this->em->createQuery($dql)->setParameters($parameters);
  184.         $visitas $query->getResult();
  185.         if (!empty($visitas)) {
  186.             foreach ($visitas as $visita) {
  187.                 $eventoVisita $this->_getVisitEventsData($visita);
  188.                 if (!empty($eventoVisita)) {
  189.                     $datos[] = $eventoVisita;
  190.                 }
  191.             }
  192.         }
  193.         return new JsonResponse(['reservation' => $datos]);
  194.     }
  195.     /**
  196.      * Función auxiliar: recibe un array de ReservationLoungeSimple y devuelve un array
  197.      * de “bloques” (sub-arrays), de forma que cada bloque contenga lounges cuyas
  198.      * fechas (dateStart) sean días consecutivos.
  199.      */
  200.     private function _splitLoungesByConsecutiveDays(array $lounges): array
  201.     {
  202.         // 1) Si no hay ninguno, devolvemos array vacío
  203.         if (empty($lounges)) {
  204.             return [];
  205.         }
  206.         // 2) Ordenamos los lounges por fecha (dateStart) ascendente
  207.         usort($lounges, function (ReservationLoungeSimple $aReservationLoungeSimple $b) {
  208.             // Suponemos que getDateStart() devuelve DateTime
  209.             return $a->getDateStart() <=> $b->getDateStart();
  210.         });
  211.         $bloques = [];
  212.         $bloqueActual = [];
  213.         // 3) Recorremos los lounges uno a uno y los vamos agrandando en bloqueActual
  214.         foreach ($lounges as $lounge) {
  215.             if (empty($bloqueActual)) {
  216.                 // Si el bloque está vacío, arrancamos con este lounge
  217.                 $bloqueActual[] = $lounge;
  218.             } else {
  219.                 // Vemos la última fecha del bloque actual
  220.                 $ultimoLounge       end($bloqueActual);
  221.                 $fechaUltimo        $ultimoLounge->getDateStart();
  222.                 $fechaActualLounge  $lounge->getDateStart();
  223.                 // Calculamos la diferencia en días (entero) entre ambas fechas
  224.                 /** @var \DateInterval $interval */
  225.                 $interval $fechaUltimo->diff($fechaActualLounge);
  226.                 $diasDif  = (int) $interval->format('%r%a'); // número de días; si son negativos, no deberían darse por cómo ordenamos
  227.                 if ($diasDif === || $diasDif === 1) {
  228.                     // Mismo día (0) o día siguiente (1) → consideramos que se incluyen en este mismo bloque
  229.                     $bloqueActual[] = $lounge;
  230.                 } else {
  231.                     // Hay un salto mayor a 1 día → cerramos el bloque actual y empezamos uno nuevo
  232.                     $bloques[] = $bloqueActual;
  233.                     $bloqueActual = [$lounge];
  234.                 }
  235.             }
  236.         }
  237.         // 4) Al salir, añadimos el último bloque si no estaba vacío
  238.         if (!empty($bloqueActual)) {
  239.             $bloques[] = $bloqueActual;
  240.         }
  241.         return $bloques;
  242.     }
  243.     /**
  244.      * función privada para crear el $datos[] con las reservas de GP y CVR
  245.      */
  246.     private function _getEventsData($reservation$lounges$isMontajeDesmontaje false)
  247.     {
  248.         $primerLounge $lounges[0];
  249.         // Montamos el icono de pagos
  250.         $pago1 "";
  251.         $pago2 "";
  252.         $ht "";
  253.         $paymentsAll $this->em->getRepository(ReservationPaymentsClient::class)
  254.                             ->findOneByReservationId($reservation->getId());
  255.         if (!empty($paymentsAll)) {
  256.             $pago2 "<i class='icon-coin-euro' style='color: #000 !important;'></i>";
  257.         }
  258.         // Facturas (GP y CVR)
  259.         $facturas   $this->em->getRepository(ReservationInvoice::class)
  260.                             ->findByReservationId($reservation->getId());
  261.         $facturasCVR$this->em->getRepository(CvrReservationInvoice::class)
  262.                             ->findByReservationId($reservation->getId());
  263.         foreach ($facturasCVR as $item) {
  264.             array_push($facturas$item);
  265.         }
  266.         foreach ($facturas as $factura) {
  267.             if ($factura->getMaster() === "master") {
  268.                 $pago1 "<i class='icon-thumbs-up3' style='color: #000 !important;'></i>";
  269.             }
  270.             if ($factura->getMaster() !== "master") {
  271.                 $pago2 "<i class='icon-coin-euro' style='color: #000 !important;'></i>";
  272.             }
  273.         }
  274.         // Catering HIGO & TRIGO
  275.         if ($reservation->getCateringName() === 'HIGO & TRIGO, S.L.') {
  276.             $ht "<a style='color: #000 !important;'><strong>H&T</strong></a>";
  277.         }
  278.         // Tipo (Montaje/Desmontaje o null)
  279.         $type $isMontajeDesmontaje $primerLounge->getType() : null;
  280.         // 1) Calculamos el inicio y fin del bloque de lounges (función que tú ya tenías)
  281.         list($start$end) = $this->_getStartEnd($lounges$isMontajeDesmontaje);
  282.         if (is_null($start) || is_null($end)) {
  283.             return []; // Si no hay inicio o fin válido, devolvemos vacío
  284.         }
  285.         // 2) Title: hora de inicio, iconos, tipo, etc.
  286.         $title $start->format('H:i') . ' ' $pago2 $pago1 $ht ' ' $type;
  287.         // 3) Color según estado y sala principal
  288.         $color $this->_getColor($reservation->getStatus(), $primerLounge->getIdLounge(), $isMontajeDesmontaje);
  289.         // 4) Tooltip: título base de reserva
  290.         $tooltip $reservation->getTitle();
  291.         // 5) Si hay varias salas dentro del bloque, las incluimos en title y tooltip
  292.         if (count($lounges) >= 1) {
  293.             $isFirst true;
  294.             $loungesName = [];
  295.             foreach ($lounges as $key => $lounge) {
  296.                 // Solo mostramos salas normales si no es bloque montaje/desmontaje
  297.                 if (!in_array($lounge->getLoungeName(), $loungesName)
  298.                     && ($isMontajeDesmontaje
  299.                         || ($lounge->getType() !== 'Montaje' && $lounge->getType() !== 'Desmontaje'))
  300.                 ) {
  301.                     $loungesName[] = $lounge->getLoungeName();
  302.                     if ($isFirst) {
  303.                         $title .= ' ' $lounge->getLoungeName();
  304.                         $isFirst false;
  305.                     } else {
  306.                         $title .= '</br>&nbsp;&nbsp;&nbsp; ' $lounge->getLoungeName();
  307.                     }
  308.                 }
  309.                 if ($isMontajeDesmontaje
  310.                     || ($lounge->getType() !== 'Montaje' && $lounge->getType() !== 'Desmontaje')
  311.                 ) {
  312.                     $horaInicio  sprintf('%02d:%02d'$lounge->getHourStart(), $lounge->getMinStart());
  313.                     $horaFin     sprintf('%02d:%02d'$lounge->getHourEnd(),   $lounge->getMinEnd());
  314.                     $fechaInicio $lounge->getDateStart()->format('d/m/Y'); // añadí “Y” para ver bien el año
  315.                     $tooltip   .= sprintf(
  316.                         '<br/><b><h3>%s</h3></b> Del %s desde %s hasta %s',
  317.                         $lounge->getLoungeName(),
  318.                         $fechaInicio,
  319.                         $horaInicio,
  320.                         $horaFin
  321.                     );
  322.                 }
  323.             }
  324.         }
  325.         $title .= '<br>' $reservation->getTitle();
  326.         // 6) Status parseado (tu función original)
  327.         $status $this->_getStatus($reservation->getStatus());
  328.         // 7) Construimos el array final de datos para este evento
  329.         $datos = [
  330.             'title'   => $title,
  331.             'type'    => $type,
  332.             'id'      => $reservation->getId(),
  333.             'tooltip' => $tooltip,
  334.             'start'   => $start,
  335.             'end'     => $end,
  336.             'color'   => $color,
  337.             'url'     => "/reservations-greenpatio/edit/" $reservation->getId(),
  338.             'status'  => $status
  339.         ];
  340.         return $datos;
  341.     }
  342.     /**
  343.      * Función para crear el $datos[] con las visitas de GP y CVR
  344.      */
  345.     private function _getVisitEventsData($visita)
  346.     {
  347.         $start = (new \DateTime($visita->getDateStart()->format('Y-m-d') . ' ' sprintf('%02d'$visita->getHourStart()) . ':' sprintf('%02d'$visita->getMinStart())));
  348.         $end = (new \DateTime($visita->getDateEnd()->format('Y-m-d') . ' ' sprintf('%02d'$visita->getHourEnd()) . ':' sprintf('%02d'$visita->getMinEnd())));
  349.         if (is_null($start) || is_null($end)) {
  350.             return []; // Si no hay inicio o fin, no devolvemos nada
  351.         }
  352.         $em $this->getDoctrine()->getManager();
  353.         $title $visita->getHourStart() . ":" $visita->getMinStart() . ' ' .  $visita->getLoungeName();
  354.         $loungeDetailsName =  $em->getRepository(ReservationLoungeDetails::class)->findOneById($visita->getIdLoungeDetails());
  355.         $loungeDetailsName = (empty($loungeDetailsName)) ? '' $loungeDetailsName->getName();
  356.         $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() .' '$loungeDetailsName;
  357. //        $color = $this->_getColorVisit($visita->getAgentId(), $visita->getIdLounge());
  358.         $xAgent $em->getRepository(User::class)->findOneById($visita->getAgentId());
  359.         $color = (empty($xAgent)) ? '' : (empty($xAgent->getColor()) ? '' $xAgent->getColor());
  360.         if ($visita->getIdLounge() != 0) {
  361.             // Si la visita no tiene sala asignada, usamos el color por defecto
  362.             $color $this->_getColorVisit(0$visita->getIdLounge());
  363.         }
  364.         return [
  365.             'title' => $title,
  366.             'type' => 'Visit',
  367.             'id' => $visita->getId() . 'V',
  368.             'tooltip' => $tooltip,
  369.             'start' => $start,
  370.             'end' => $end,
  371.             'color' => $color// Color específico para visitas
  372.             'url' => '/reservations-greenpatio/addvisit',
  373.             'status' => $this->_getStatus('visit'), // Status específico para visitas
  374.             'agentId' => $visita->getAgentId(),
  375.         ];
  376.     }
  377.     /**
  378.      * Devuelve el color de la reserva según su estado
  379.      */
  380.     private function _getColor($status$loungeId$isMontajeDesmontaje)
  381.     {
  382.         if($isMontajeDesmontaje){
  383.             return "#a5b8a2";
  384.         }
  385.         $statusColorMap = [
  386.             'Bloqueo' => ($loungeId 21) ? "#b873bf" "#ffaa00",
  387.             'Confirmed' => "#13ad27",
  388.             'Invoiced' => "#13ad27",
  389.             'Deleted' => "#ff0000",
  390.             'Cotizado' => "#faafc3",
  391.             'Reservado' => "#13ad27",
  392.             'default' => "",
  393.         ];
  394.         $color $statusColorMap[$status] ?? $statusColorMap['default'];
  395.         if (in_array($loungeId, [22232425])){
  396.             //Ajustamos el color a una sala de covarrubia
  397.             switch ($color) {
  398.                 case '#ffaa00'$color "#b873bf"; break; //naranja (bloqueo) => morado
  399.                 case '#13ad27'$color "#017362"; break; //verde (Confirmed) => verde olivo
  400.                 case '#ff0000'$color "#ff0000"; break; //rojo
  401.                 case '#faafc3'$color "#faafc3"; break; //Rojo claro
  402.                 default: break; //no modificar el color
  403.             }
  404.         }
  405.         return $color;
  406.     }
  407.     /**
  408.      * Devuelve el color de la visita según el agente o el venue
  409.      */
  410.     private function _getColorVisit($agentId$venue)
  411.     {
  412.         // Si el venue determina directamente el color, lo devolvemos
  413.         if (($venue === 1) or (is_null($venue))) {
  414.             return '#f0d800'// Color Covarrubias
  415.         }
  416.         if ($venue === 2) {
  417.             return '#990202'// Color Bella View
  418.         }
  419.         // Si el venue es 1, buscamos el color del agente
  420.         if ($venue === && !is_null($agentId)) {
  421.             $agent $this->em->getRepository(User::class)->find($agentId);
  422.             if ($agent && $agent->getColor()) {
  423.                 return $agent->getColor();
  424.             }
  425.         }
  426.         // Si no se encuentra nada, retornamos null
  427.         return null;
  428.     }
  429.     /**
  430.      * Calcula el inicio y el fin de la reserva en función de las salas que no sean montaje o desmontaje
  431.      */
  432.     private function _getStartEnd($lounges$isMontajeDesmontaje false)
  433.     {
  434.         $start null;
  435.         $end null;
  436.         foreach ($lounges as $lounge) {
  437.             if ($isMontajeDesmontaje || ($lounge->getType() != 'Montaje' && $lounge->getType() != 'Desmontaje')) {
  438.                 if (is_null($start) || $lounge->getDateStart() < $start) {
  439.                     $start = (new \DateTime($lounge->getDateStart()->format('Y-m-d') . ' ' sprintf('%02d'$lounge->getHourStart()) . ':' sprintf('%02d'$lounge->getMinStart())));
  440.                 }
  441.                 if (is_null($end) || $lounge->getDateEnd() > $end) {
  442.                     $end = (new \DateTime($lounge->getDateEnd()->format('Y-m-d') . ' 23:59:59'));
  443.                 }
  444.             }
  445.         }
  446.         // Sumar un minuto al final para que no se vea el evento cortado
  447.         if (!is_null($end)) {
  448.             $end->modify('+1 minute');
  449.         }
  450.         return [$start$end];
  451.     }
  452.     /**
  453.      * Devuelve el status de la reserva según su estado como un número
  454.      */
  455.     private function _getStatus($status)
  456.     {
  457.         $statusMap = [
  458.             'Bloqueo' => 1,
  459.             'Confirmed' => 2,
  460.             'Invoiced' => 3,
  461.             'Deleted' => 4,
  462.             'Cotizado' => 5,
  463.             'Reservado' => 6,
  464.             'default' => 0,
  465.         ];
  466.         return $statusMap[$status] ?? $statusMap['default'];
  467.     }
  468.     /**
  469.      * @Route("/gp-cvr/eventsgpcvr", name="get_reservations_gp_cvr")
  470.      */
  471.     public function reservationGpCvrEventsAction(Request $request)
  472.     {
  473.         $em $this->getDoctrine()->getManager();
  474.         // Buscamos las reservas desde 1 año atras en adelante para no traer exceso de datos
  475. //        $todayOneYearAgo = new DateTime('now -365 days');
  476. //        $parameters = array('dateStart' => $todayOneYearAgo,);
  477. //        $dql = 'SELECT p
  478. //                FROM GreenPatioBundle:ReservationLoungeSimple p
  479. //                WHERE p.dateStart >= :dateStart
  480. //                ORDER BY p.dateStart ASC';
  481. //        $query = $em->createQuery($dql)->setParameters($parameters);
  482. //        $reservation = $query->getResult();
  483.         $todayOneYearAgo = new \DateTime('-60 days');
  484.         $dql 'SELECT p
  485.         FROM GreenPatioBundle:ReservationLoungeSimple p
  486.         INNER JOIN GreenPatioBundle:Reservation r WITH p.idReservation = r.id
  487.         WHERE p.dateStart >= :dateStart
  488.           AND r.status <> :statusDeleted
  489.         ORDER BY p.dateStart ASC';
  490.         $query $em->createQuery($dql)->setParameters([
  491.             'dateStart' => $todayOneYearAgo,
  492.             'statusDeleted' => 'Deleted'
  493.         ]);
  494.         $reservation $query->getResult();
  495.         // Buscamos las visitas desde 1 semana atras en adelante para no traer exceso de datos (Tiempo confirmado por Gabriela Bracho)
  496.         $todayOneWeekAgo = new DateTime('now -1 week');
  497.         $parameters = array('dateStart' => $todayOneWeekAgo,);
  498.         $dql 'SELECT p
  499.                 FROM GreenPatioBundle:ReservationVisit p                         
  500.                 WHERE p.dateStart >= :dateStart  
  501.                 ORDER BY p.dateStart ASC';
  502.         $query $em->createQuery($dql)->setParameters($parameters);
  503.         $visitas $query->getResult();
  504.         $arrayFechaVisitas = [];
  505.         foreach ($visitas as $item) {
  506.             //Se agrupan las visitas por fechas
  507.             $arrayFechaVisitas[$item->getDateStart()->format('Y-m-d').$item->getId()][] = $item;
  508.         }
  509.         $newArrayVisitas = [];
  510.         //Se agrupan las visitas por agente
  511.         foreach ($arrayFechaVisitas as $fecha) {
  512.             foreach ($fecha as $item) {
  513.                 //Se van concatenando los titulos de las visitas en una sola
  514.                 $loungeNameTemp '';
  515.                 $idAgentLounge = ($item->getIdLounge() == 0) ? $item->getAgentId() : '0';
  516.                 if (!empty($newArrayVisitas[$item->getDateStart()->format('Y-m-d') . '-' $idAgentLounge])) {
  517. //                    $loungeNameTemp = $newArrayVisitas[$item->getDateStart()->format('Y-m-d') . '-' . $idAgentLounge]->getLoungeName();
  518.                 }
  519.                 $pos strripos($item->getLoungeName(), "Visita");
  520.                 if ($pos !== false) { $prefijo substr($item->getLoungeName(), $pos); }        // Rafa pidio colocar el nombre del agente por delante
  521.                 $item->setLoungeName($loungeNameTemp $item->getDateStart()->format('H:i') . ' ' $prefijo ' ' $item->getLoungeName() . '<br>');
  522.                 $newArrayVisitas[$item->getDateStart()->format('Y-m-d') . '-' $idAgentLounge] = $item;
  523.             }
  524.         }
  525.         $visitas $newArrayVisitas;
  526.         $xArray = [];
  527.         foreach ($arrayFechaVisitas as $elem) { foreach ($elem as $item) { $xArray[] = $item; } }
  528.         foreach ($xArray as $item) { array_push($reservation$item); }
  529.         $datos = [];
  530.         $agentColorMap = [
  531.             77 => "#22cbf5",
  532.             82 => "#f5229a",
  533.             120 => "#157cc2",
  534.         ];
  535.         if (!empty($reservation)) {
  536.             foreach ($reservation as $reservaSala) {
  537.                 $loungeDetailsName '';
  538.                 if (!empty($reservaSala->getIdReservation())) {
  539.                     $reserva $em->getRepository(Reservation::class)->findOneById($reservaSala->getIdReservation());
  540.                     if ($reservaSala->getType() == 'Visit') {
  541.                         $reserva->setStatus('Visit');
  542.                     }
  543.                 } else {
  544.                     // Estamos con una visita
  545.                     $reserva = new Reservation();
  546.                     $reserva->setStatus('Visit');
  547.                     $reserva->setTitle($reservaSala->getLoungeName());
  548.                     if (!empty($reservaSala->getIdLoungeDetails())){
  549.                         $loungeDetailsName =  $em->getRepository(ReservationLoungeDetails::class)->findOneById($reservaSala->getIdLoungeDetails());
  550.                         $loungeDetailsName = (empty($loungeDetailsName)) ? '' $loungeDetailsName->getName();
  551.                     }
  552.                 }
  553.                 if ($reservaSala->getDateStart()->format('d') == $reservaSala->getDateEnd()->format('d')) {
  554.                     $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() .' '$loungeDetailsName;
  555.                 } else {
  556.                     $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() .' '$loungeDetailsName;
  557.                 }
  558.                 $logicoVisita false;
  559.                 if (!is_null($reserva->getStatus())) {
  560.                     $statusColorMap = [
  561.                         'Bloqueo' => function($reservaSala) {
  562.                             $idLounge $reservaSala->getIdLounge();
  563.                             if ($idLounge 29) {
  564.                                 return "#964B00"// Marrón (Bella View)
  565.                             } elseif ($idLounge 21) {
  566.                                 return "#b873bf"// Morado (Covarrubias)
  567.                             } else {
  568.                                 return "#ffaa00"// Naranja (Green Patio)
  569.                             }
  570.                         },
  571.                         'Confirmed' => "#13ad27",
  572.                         'Invoiced' => "#13ad27",
  573.                         'Deleted' => "#ff0000",
  574.                         'Cotizado' => "#faafc3",
  575.                         'Reservado' => "#13ad27",
  576.                         'Visit' => function($reservaSala) {
  577.                             if ($reservaSala->getIdLounge() == 0) {
  578.                                 return $agentColorMap[$reservaSala->getAgentId()] ?? "";
  579.                             } else {
  580.                                 if ($reservaSala->getIdLounge() == 1) {
  581.                                     return '#f0d800';   //  Color Covarrubias
  582.                                 } else {
  583.                                     return '#9e6c3a';   //  Color Bella View
  584.                                 }
  585.                             }
  586.                         },
  587.                         'default' => "",
  588.                     ];
  589.                     
  590.                     $color "";
  591.                     $logicoVisita false;
  592.                     
  593.                     if (array_key_exists($reserva->getStatus(), $statusColorMap)) {
  594.                         $value $statusColorMap[$reserva->getStatus()];
  595.                         // Si el valor es una función, la ejecutamos para obtener el color.
  596.                         $color is_callable($value) ? $value($reservaSala) : $value;
  597.                         if ($reserva->getStatus() === 'Visit') {
  598.                             $logicoVisita true;
  599.                         }
  600.                     } else {
  601.                         $color $statusColorMap['default'];
  602.                     }
  603.                     if (!empty($reservaSala->getType()) and !($reservaSala->getType() == 'Visit')) {
  604.                         //Es un montaje o desmontaje
  605.                         $color "#a5b8a2";
  606.                         // Si es un montaje o desmontaje pero esta cancelado debe prevalecer el color de cancelado
  607.                         if ($reserva->getStatus() == 'Deleted') { $color "#ff0000"; }
  608.                     }
  609.                     if (($reservaSala->getIdLounge() > 21) and ($reservaSala->getIdLounge() < 30)){
  610.                         //Ajustamos el color a una sala de covarrubia
  611.                         switch ($color) {
  612.                             case '#ffaa00'$color "#b873bf"; break; //naranja (bloqueo) => morado
  613.                             case '#13ad27'$color "#017362"; break; //verde (Confirmed) => verde olivo
  614.                             case '#ff0000'$color "#ff0000"; break; //rojo
  615.                             case '#faafc3'$color "#faafc3"; break; //Rojo claro
  616.                             default: break; //no modificar el color
  617.                         }
  618.                     }
  619.                     if((($reservaSala->getIdLounge() > 29) and ($reservaSala->getIdLounge() < 33)) or (($reservaSala->getIdLounge() > 34) and ($reservaSala->getIdLounge() < 39))){
  620.                         //Ajustamos el color a una sala de bella view
  621.                         switch ($color) {
  622.                             case '#ffaa00'$color "#2691fc"; break; //naranja (bloqueo) => azul claro
  623.                             case '#13ad27'$color "#066191"; break; //verde (Confirmed) => azul oscuro
  624.                             case '#ff0000'$color "#ff0000"; break; //rojo
  625.                             case '#faafc3'$color "#faafc3"; break; //Rojo claro
  626.                             default: break; //no modificar el color
  627.                         }
  628.                     }
  629.                 }
  630.                 $pago1 "";
  631.                 $pago2 "";
  632.                 $ht "";
  633.                 if (!($reserva->getStatus() == 'Visit')) {
  634.                     $paymentsAll $em->getRepository(ReservationPaymentsClient::class)->findOneByReservationId($reserva->getId());
  635.                 } else {
  636.                     $paymentsAll null;
  637.                 }
  638.                 if (!empty($paymentsAll)) {
  639.                     $pago2 "<i class='icon-coin-euro' style='color: #000 !important;'></i>";      //Hay pagos parciales
  640.                 }
  641.                 if (!($reserva->getStatus() == 'Visit')) {
  642.                     $facturas $em->getRepository(ReservationInvoice::class)->findByReservationId($reserva->getId());
  643.                     $facturasCVR $em->getRepository(CvrReservationInvoice::class)->findByReservationId($reserva->getId());
  644.                     $facturasBLV $em->getRepository(BlvReservationInvoice::class)->findByReservationId($reserva->getId());
  645.                     foreach ($facturasCVR as $item) { array_push($facturas$item); }
  646.                     foreach ($facturasBLV as $item) { array_push($facturas$item); }
  647.                 }
  648.                 if (!empty($facturas)) {
  649.                     foreach ($facturas as $factura) {
  650.                         if ($factura->getMaster() == "master") {
  651.                             $pago1 "<i class='icon-thumbs-up3' style='color: #000 !important;'></i>";// Se ha pagado la totalidad
  652.                         }
  653.                         if ($factura->getMaster() != "master") {
  654.                             $pago2 "<i class='icon-coin-euro' style='color: #000 !important;'></i>";      //Hay pagos parciales
  655.                         }
  656.                     }
  657.                 }
  658.                 if ($reserva->getCateringName() == 'HIGO & TRIGO, S.L.') {
  659.                     $ht "<a style='color: #000 !important;'><strong>H&T</strong></a>";      // Es una reserva con servicio de Catering Higo & Trigo
  660.                 }
  661.                 // Pagos parciales y totales
  662.                 if (!$logicoVisita) {
  663.                     $datos[] = array(
  664.                         "title" => $reservaSala->getDateStart()->format('H:i') . ' ' $pago2 $pago1 $ht ' ' $reservaSala->getType() . ' ' $reservaSala->getLoungeName() . '<br>' $reserva->getTitle(),
  665.                         "titleOne" => $reservaSala->getDateStart()->format('H:i') . ' ' $pago2 $pago1 $ht ' ' $reservaSala->getType(),
  666.                         "titleTwo" => $reservaSala->getLoungeName(),
  667.                         "titleThree" => '' '<br>' $reserva->getTitle(),
  668.                         "type" => $reservaSala->getType(),
  669.                         "id" => $reserva->getId(),
  670.                         "tooltip" => $tooltip,
  671.                         "start" => (new \DateTime($reservaSala->getDateStart()->format('Y-m-d') . ' ' sprintf('%02d'$reservaSala->getHourStart()) . ':' sprintf('%02d'$reservaSala->getMinStart()))),
  672.                         "end" => (new \DateTime($reservaSala->getDateEnd()->format('Y-m-d') . ' ' sprintf('%02d'$reservaSala->getHourEnd()) . ':' sprintf('%02d'$reservaSala->getMinEnd()))),
  673.                         "color" => $color,
  674.                         "loungeId" => $reservaSala->getIdLounge(),
  675.                         "url" => "/reservations-greenpatio/edit/" $reserva->getId(),
  676.                         "status" => $reserva->getStatus(),
  677.                     );
  678.                 } else {
  679.                     // Es una visita
  680.                     $datos[] = array(
  681.                         "title" => $reservaSala->getLoungeName(),
  682.                         "titleOne" => $reservaSala->getDateStart()->format('H:i') . ' ' ' ' $reservaSala->getType() . '<br>',
  683.                         "titleTwo" => $reservaSala->getLoungeName(),
  684.                         "titleThree" => '' '<br>' '<br>' $reserva->getTitle(),
  685.                         "type" => $reservaSala->getType(),
  686.                         "id" => $reservaSala->getId() . 'V',
  687.                         "tooltip" => $tooltip,
  688.                         "start" => (new \DateTime($reservaSala->getDateStart()->format('Y-m-d') . ' ' sprintf('%02d'$reservaSala->getHourStart()) . ':' sprintf('%02d'$reservaSala->getMinStart()))),
  689.                         "end" => (new \DateTime($reservaSala->getDateEnd()->format('Y-m-d') . ' ' sprintf('%02d'$reservaSala->getHourEnd()) . ':' sprintf('%02d'$reservaSala->getMinEnd()))),
  690.                         "color" => $color,
  691.                         "loungeId" => $reservaSala->getIdLounge(),
  692.                         "url" => '/reservations-greenpatio/addvisit',
  693.                         "status" => $reserva->getStatus(),
  694.                         "agentId" => $reservaSala->getAgentId(),
  695.                     );
  696.                 }
  697.             }
  698.         }
  699.         $newDatos = [];
  700.         // INICIO: Se unen las salas en una sola reserva por ID de reserva
  701.         foreach ($datos as $dato) {
  702.             // Inicializamos el arreglo para crear los indices
  703.             switch ($dato['color']){
  704.                 case '#a5b8a2':              //Montaje o Desmontaje
  705.                     if ($dato['type'] == 'Montaje'){
  706.                         $newDatos[$dato['id'].'M'] = null;
  707.                     } else {
  708.                         $newDatos[$dato['id'].'D'] = null;
  709.                     }
  710.                     break;
  711.                 default:                    //Dia de reserva o Visita (la visita ya viene con su indice #V )
  712.                     $newDatos[$dato['id']] = null;
  713.                     break;
  714.             }
  715.         }
  716.         foreach ($datos as $dato) {
  717.             switch ($dato['color']){
  718.                 //Montaje o Desmontaje
  719.                 case '#a5b8a2':
  720.                     if ($dato['type'] == "Montaje") {
  721.                         if (!empty($newDatos[$dato['id'] . 'M1'])) {
  722.                             // 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)
  723. //                            if ($newDatos[$dato['id'] . 'M']['loungeId'] == $dato['loungeId']) {
  724. //                                if ($newDatos[$dato['id'] . 'M']['start'] > $dato['start']) { $newDatos[$dato['id'] . 'M']['start'] = $dato['start']; }
  725. //                                if ($newDatos[$dato['id'] . 'M']['end'] < $dato['end']) { $newDatos[$dato['id'] . 'M']['end'] = $dato['end']; }
  726. //                            } else {
  727. //                                if (array_key_exists($dato['id'] . 'M'.$dato['loungeId'],$newDatos)){
  728. //                                    if ($newDatos[$dato['id'] . 'M'.$dato['loungeId']]['start'] > $dato['start']) { $newDatos[$dato['id'] . 'M'.$dato['loungeId']]['start'] = $dato['start']; }
  729. //                                    if ($newDatos[$dato['id'] . 'M'.$dato['loungeId']]['end'] < $dato['end']) { $newDatos[$dato['id'] . 'M'.$dato['loungeId']]['end'] = $dato['end']; }
  730. //                                } else {
  731. //                                    $newDatos[$dato['id'] . 'M'.$dato['loungeId']] = $dato;
  732. //                                }
  733. //                            }
  734.                             //   ***********************************
  735.                                 if (array_key_exists($dato['id'] . 'M1',$newDatos)){
  736.                                     if ($newDatos[$dato['id'] . 'M1']['start'] > $dato['start']) { $newDatos[$dato['id'] . 'M1']['start'] = $dato['start']; }
  737.                                     if ($newDatos[$dato['id'] . 'M1']['end'] < $dato['end']) { $newDatos[$dato['id'] . 'M1']['end'] = $dato['end']; }
  738.                                     $newDatos[$dato['id'] . 'M1']['tooltip'] .= '<br>'.$dato['tooltip'];
  739.                                     $newDatos[$dato['id'] . 'M1']['title'] = str_replace($newDatos[$dato['id'] . 'M1']['titleThree'],'',$newDatos[$dato['id'] . 'M1']['title']);
  740.                                     $newDatos[$dato['id'] . 'M1']['title'] .= '<br>'.$dato['titleTwo'];
  741.                                     $newDatos[$dato['id'] . 'M1']['title'] .= $newDatos[$dato['id'] . 'M1']['titleThree'];
  742.                                 } else {
  743.                                     $newDatos[$dato['id'] . 'M1'] = $dato;
  744.                                 }
  745.                             //   ***********************************
  746.                         } else {
  747.                             $newDatos[$dato['id'] . 'M1'] = $dato;
  748.                         }
  749.                     } else {
  750.                         if ($dato['type'] == "Desmontaje") {
  751.                             if (!empty($newDatos[$dato['id'] . 'D'])) {
  752.                                 // El Desmontaje esta ocupando mas de 1 dia, se deben unir los dias de desmontaje
  753.                                 if ($newDatos[$dato['id'] . 'D']['start'] > $dato['start']) { $newDatos[$dato['id'] . 'D']['start'] = $dato['start']; }
  754.                                 if ($newDatos[$dato['id'] . 'D']['end'] < $dato['end']) { $newDatos[$dato['id'] . 'D']['end'] = $dato['end']; }
  755.                             } else {
  756.                                 $newDatos[$dato['id'] . 'D'] = $dato;
  757.                             }
  758.                         }
  759.                     }
  760.                 break;
  761.                 //Visita Angie (id user 77)
  762.                 case '#22cbf5':
  763.                     if ($dato['type'] == "Visit") {
  764.                         $newDatos[$dato['start']->format('Ymd').'V77'.$dato['id']] = $dato;
  765.                         if (!empty($newDatos[$dato['start']->format('Ymd').'V77'])) {
  766.                             // Hay varias visitas ese mismo dia para el agente
  767. //                            $newDatos[$dato['start']->format('Ymd').'V77']['tooltip'] = $newDatos[$dato['start']->format('Ymd').'V77']['tooltip'] . $dato['tooltip'];
  768.                         } else {
  769. //                            $newDatos[$dato['start']->format('Ymd').'V77'] = $dato;
  770.                         }
  771.                     }
  772.                 break;
  773.                 //Visita Gabriela (id user 82)
  774.                 case '#f5229a':
  775.                     if ($dato['type'] == "Visit") {
  776.                         $newDatos[$dato['start']->format('Ymd').'V82'.$dato['id']] = $dato;
  777.                         if (!empty($newDatos[$dato['start']->format('Ymd').'V82'])) {
  778.                             // Hay varias visitas ese mismo dia para el agente
  779. //                            $newDatos[$dato['start']->format('Ymd').'V82']['tooltip'] = $newDatos[$dato['start']->format('Ymd').'V82']['tooltip'] . $dato['tooltip'];
  780.                         } else {
  781. //                            $newDatos[$dato['start']->format('Ymd').'V82'] = $dato;
  782.                         }
  783.                     }
  784.                 break;
  785.                 //Visita Cristina (id user 120)
  786.                 case '#157cc2':
  787.                     if ($dato['type'] == "Visit") {
  788.                         $newDatos[$dato['start']->format('Ymd').'V120'.$dato['id']] = $dato;
  789.                         if (!empty($newDatos[$dato['start']->format('Ymd').'V120'])) {
  790.                             // Hay varias visitas ese mismo dia para el agente
  791. //                            $newDatos[$dato['start']->format('Ymd').'V120']['tooltip'] = $newDatos[$dato['start']->format('Ymd').'V120']['tooltip'] . $dato['tooltip'];
  792.                         } else {
  793. //                            $newDatos[$dato['start']->format('Ymd').'V120'] = $dato;
  794.                         }
  795.                     }
  796.                 break;
  797.                 //Visita Generica para agentes a Covarrubias
  798.                 case '#f0d800':
  799.                     if ($dato['type'] == "Visit") {
  800.                         $newDatos[$dato['start']->format('Ymd').'V0'.$dato['id']] = $dato;
  801.                         if (!empty($newDatos[$dato['start']->format('Ymd').'V0'])) {
  802.                             // Hay varias visitas ese mismo dia para el agente
  803. //                            $newDatos[$dato['start']->format('Ymd').'V0']['tooltip'] = $newDatos[$dato['start']->format('Ymd').'V0']['tooltip'] . $dato['tooltip'];
  804.                         } else {
  805. //                            $newDatos[$dato['start']->format('Ymd').'V0'] = $dato;
  806.                         }
  807.                     }
  808.                     break;
  809.                 //Visita Generica para agentes a Bella View
  810.                 case '#990202':
  811.                     if ($dato['type'] == "Visit") {
  812.                         $newDatos[$dato['start']->format('Ymd').'V0'.$dato['id']] = $dato;
  813.                         if (!empty($newDatos[$dato['start']->format('Ymd').'V0'])) {
  814.                             // Hay varias visitas ese mismo dia para el agente
  815. //                            $newDatos[$dato['start']->format('Ymd').'V0']['tooltip'] = $newDatos[$dato['start']->format('Ymd').'V0']['tooltip'] . $dato['tooltip'];
  816.                         } else {
  817. //                            $newDatos[$dato['start']->format('Ymd').'V0'] = $dato;
  818.                         }
  819.                     }
  820.                     break;
  821.                 //Reserva color naranja Bloqueo
  822.                 case '#ffaa00':
  823.                     if (empty($newDatos[$dato['id']])){
  824.                         $newDatos[$dato['id']] = $dato;
  825.                     } else {
  826.                         // Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
  827.                         if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
  828.                         if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
  829.                         $newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' $dato['tooltip'];
  830.                         // Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
  831.                         if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
  832.                             // No se encontro la cadena, debemos agregar
  833.                             $newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'$dato['titleTwo'];
  834.                             $newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
  835.                         }
  836.                     }
  837.                 break;
  838.                 //Reserva color morado Bloqueo (Covarrubias)
  839.                 case '#b873bf':
  840.                     if (empty($newDatos[$dato['id']])){
  841.                         $newDatos[$dato['id']] = $dato;
  842.                     } else {
  843.                         // Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
  844.                         if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
  845.                         if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
  846.                         $newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' $dato['tooltip'];
  847.                         // Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
  848.                         if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
  849.                             // No se encontro la cadena, debemos agregar
  850.                             $newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'$dato['titleTwo'];
  851.                             $newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
  852.                         }
  853.                     }
  854.                 break;
  855.                 //Reserva color Rojo claro Cotizado
  856.                 case '#faafc3':
  857.                     if (empty($newDatos[$dato['id']])){
  858.                         $newDatos[$dato['id']] = $dato;
  859.                     } else {
  860.                         // Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
  861.                         if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
  862.                         if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
  863.                         $newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' $dato['tooltip'];
  864.                         // Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
  865.                         if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
  866.                             // No se encontro la cadena, debemos agregar
  867.                             $newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'$dato['titleTwo'];
  868.                             $newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
  869.                         }
  870.                     }
  871.                 break;
  872.                 //Reserva color Rojo Reserva Cancelada
  873.                 case '#ff0000':
  874.                     //Las canceladas no se muestran en el calendario
  875.                 break;
  876.                 //Reserva color Verde Reserva Confirmada, Facturada, (se ha adelantado un pago parcial)
  877.                 case '#13ad27':
  878.                     if (empty($newDatos[$dato['id']])){
  879.                         $newDatos[$dato['id']] = $dato;
  880.                     } else {
  881.                         // Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
  882.                         if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
  883.                         if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
  884.                         $newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' $dato['tooltip'];
  885.                         // Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
  886.                         if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
  887.                             // No se encontro la cadena, debemos agregar
  888.                             $newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'$dato['titleTwo'];
  889.                             $newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
  890.                         }
  891.                     }
  892.                 break;
  893.                 //Reserva color Verde Reserva Confirmada, Facturada, (Covarrubias)
  894.                 case '#017362':
  895.                     if (empty($newDatos[$dato['id']])){
  896.                         $newDatos[$dato['id']] = $dato;
  897.                     } else {
  898.                         // Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
  899.                         if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
  900.                         if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
  901.                         $newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' $dato['tooltip'];
  902.                         // Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
  903.                         if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
  904.                             // No se encontro la cadena, debemos agregar
  905.                             $newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'$dato['titleTwo'];
  906.                             $newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
  907.                         }
  908.                     }
  909.                 break;
  910.                 //Reserva color Verde Reserva Confirmada, Facturada, (Bella View)
  911.                 case '#066191':
  912.                     if (empty($newDatos[$dato['id']])){
  913.                         $newDatos[$dato['id']] = $dato;
  914.                     } else {
  915.                         // Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
  916.                         if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
  917.                         if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
  918.                         $newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' $dato['tooltip'];
  919.                         // Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
  920.                         if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
  921.                             // No se encontro la cadena, debemos agregar
  922.                             $newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'$dato['titleTwo'];
  923.                             $newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
  924.                         }
  925.                     }
  926.                 break;
  927.                 //Se pondra color a negro para resaltar este cualquier caso que no haya sido considerado (status Pendiente)
  928.                 default:
  929.                     if (empty($newDatos[$dato['id']])){
  930.                         $newDatos[$dato['id']] = $dato;
  931.                     } else {
  932.                         // Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
  933.                         if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
  934.                         if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
  935.                         $newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' $dato['tooltip'];
  936.                         // Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
  937.                         if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
  938.                             // No se encontro la cadena, debemos agregar
  939.                             $newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'$dato['titleTwo'];
  940.                             $newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
  941.                         }
  942.                     }
  943.                     // Se pone en color negro para resaltar este caso que no esta entrando en ninguno de los casos anteriores
  944.                     $newDatos[$dato['id']]['color'] = '#000000';
  945.                     if ($dato['type'] == "Visit") {
  946.                         // Si no es una de los agentes regulares (Gaby, Angie, Cristina) se busca el color del usuario configurado en el perfil
  947.                         $elAgente $em->getRepository(User::class)->findOneById($dato['agentId']);
  948.                         $elAgenteColor = !empty($elAgente) ? $elAgente->getColor() : null;
  949.                         if (!empty($elAgenteColor)){ $newDatos[$dato['id']]['color'] = $elAgenteColor; }
  950.                     }
  951.                 break;
  952.             }
  953.         }
  954.         $datos0 = [];
  955.         foreach ($newDatos as $key => $item) {
  956.             if (!empty($item['id'])) {
  957.                 $datos0[$key] = array('title' => $item['title'],
  958.                     'titleOne' => $item['titleOne'],
  959.                     'titleTwo' => $item['titleTwo'],
  960.                     'titleThree' => $item['titleThree'],
  961.                     'type' => $item['type'],
  962.                     'id' => $item['id'],
  963.                     'tooltip' => $item['tooltip'],
  964.                     'start' => $item['start'],
  965.                     'end' => $item['end'],
  966.                     'color' => $item['color'],
  967.                     'loungeId' => $item['loungeId'],
  968.                     'url' => $item['url']
  969.                 );
  970.             }
  971.         }
  972.         $newDatos $datos0;
  973.         $datos = [];
  974.         foreach ($newDatos as $item) {
  975.             if ($item['color'] != '#ff0000') {
  976.                 // No se agregan al calendario los elementos eliminados o elementos vacios
  977.                 if (!empty($item)) {
  978.                     //INICIO: Verificamos por huecos dentro de la reserva
  979.                     if (empty($item['type'])) {
  980.                         // solo las reservas se van a verificar en este if
  981.                         if ((date_diff($item['start'], $item['end'])->d) > 1) {    //el evento tiene mas de 2 dias, puede haber huecos
  982.                             $resSimples $em->getRepository(ReservationLoungeSimple::class)->findByIdReservation($item['id']);
  983.                             $period = new DatePeriod$item['start'], new DateInterval('P1D'), $item['end'] );
  984.                             $arrayPeriod = [];
  985.                             foreach ($period as $key => $value) { $arrayPeriod[] = $value; }
  986.                             $logAllDiasEnReserva false;
  987.                             $logDiaEnReserva false;
  988.                             //Verificamos que cada dia tenga su reserva de sala para que no haya hueco
  989.                             foreach ($arrayPeriod as $day) {
  990.                                 foreach ($resSimples as $resSimple) {
  991.                                     if ($resSimple->getDateStart()->format('Y-m-d') == $day->format('Y-m-d')) {
  992.                                         $logDiaEnReserva true;
  993.                                         break;
  994.                                     }
  995.                                 }
  996.                                 if (!$logDiaEnReserva) {
  997.                                     //Un dia no se encontraba, hay un hueco
  998.                                     foreach ($resSimples as $resDayToAdd) {
  999.                                         if (empty($resDayToAdd->getType())) {       // Solo se deben agregar salsa los montajes y desmontajes aqui no van
  1000.                                             $item['start'] = $resDayToAdd->getDateStart();
  1001.                                             $item['end'] = $resDayToAdd->getDateEnd();
  1002.                                             $br '<br>';
  1003.                                             $br strpos($item['title'], $br);
  1004.                                             $tempText substr($item['title'], $br 4);
  1005.                                             $item['title'] = $resDayToAdd->getDateStart()->format('H:i') . ' ' '<br>' $tempText;
  1006.                                             $datos[] = $item;
  1007.                                         }
  1008.                                     }
  1009.                                     break;
  1010.                                 } else {
  1011.                                     //Se debe evaluar el siguiente dia
  1012.                                     $logDiaEnReserva false;
  1013.                                     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
  1014.                                         $logAllDiasEnReserva true;
  1015.                                     }
  1016.                                 }
  1017.                             }
  1018.                             if ($logAllDiasEnReserva) { $datos[] = $item; }
  1019.                         } else {
  1020.                             // El evento es de 1 o 2 dias, no hay posibilidad de hueco
  1021.                             $datos[] = $item;
  1022.                         }
  1023.                     } else {
  1024.                         //Es Visita Las visitas son las unicas entradas que no tienen hueco
  1025.                         if ($item['type'] == 'Visit'){
  1026.                             $datos[] = $item;
  1027.                         } else {
  1028.                             // es montaje o desmontaje, se va verificar por huecos
  1029.                             if ((date_diff($item['start'], $item['end'])->d) > 1) {    //el item tiene mas de 2 dias, puede haber huecos
  1030.                                 $parameters = array(
  1031.                                     'id' => $item['id'],
  1032.                                     'type' => $item['type'],
  1033.                                 );
  1034.                                 $dql 'SELECT i
  1035.                                         FROM GreenPatioBundle:ReservationLoungeSimple i
  1036.                                         WHERE  i.idReservation = :id
  1037.                                           and i.type = :type';
  1038.                                 $query $em->createQuery($dql)->setParameters($parameters);
  1039.                                 $resSimples $query->getResult();
  1040.                                 $period = new DatePeriod$item['start'], new DateInterval('P1D'), $item['end'] );
  1041.                                 $arrayPeriod = [];
  1042.                                 foreach ($period as $key => $value) { $arrayPeriod[] = $value; }
  1043.                                 $logAllDiasEnReserva false;
  1044.                                 $logDiaEnReserva false;
  1045.                                 //Verificamos que cada dia tenga su reserva de sala para que no haya hueco
  1046.                                 foreach ($arrayPeriod as $day) {
  1047.                                     foreach ($resSimples as $resSimple) {
  1048.                                         if ($resSimple->getDateStart()->format('Y-m-d') == $day->format('Y-m-d')) {
  1049.                                             $logDiaEnReserva true;
  1050.                                             break;
  1051.                                         }
  1052.                                     }
  1053.                                     if (!$logDiaEnReserva) {
  1054.                                         //Un dia no se encontraba, hay un hueco
  1055.                                         foreach ($resSimples as $resDayToAdd) {
  1056.                                             if (!empty($resDayToAdd->getType())) {       // Solo se deben agregar montajes y desmontajes aqui
  1057.                                                 $item['start'] = $resDayToAdd->getDateStart();
  1058.                                                 $item['end'] = $resDayToAdd->getDateEnd();
  1059.                                                 $br '<br>';
  1060.                                                 $br strpos($item['title'], $br);
  1061.                                                 $tempText substr($item['title'], $br 4);
  1062.                                                 $item['title'] = $resDayToAdd->getDateStart()->format('H:i') . ' ' '<br>' $tempText;
  1063.                                                 $datos[] = $item;
  1064.                                             }
  1065.                                         }
  1066.                                         break;
  1067.                                     } else {
  1068.                                         //Se debe evaluar el siguiente dia
  1069.                                         $logDiaEnReserva false;
  1070.                                         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
  1071.                                             $logAllDiasEnReserva true;
  1072.                                         }
  1073.                                     }
  1074.                                 }
  1075.                                 if ($logAllDiasEnReserva) { $datos[] = $item; }
  1076.                             } else {
  1077.                                 // El montaje o desmontaje es de 1 o 2 dias, no hay posibilidad de hueco
  1078.                                 $datos[] = $item;
  1079.                             }
  1080.                         }
  1081.                     }
  1082.                     //FIN: Verificamos por huecos dentro de la reserva
  1083.                 }
  1084.             }
  1085.         }
  1086.         $return = array( 'reservation' => $datos, );
  1087.         $response = new JsonResponse($return);
  1088.         return $response;
  1089.     }
  1090.     /**
  1091.      * @Route("/gp-cvr/calendarconfac", name="gp_cvr_calendar_con_fac")
  1092.      */
  1093.     public function calendarCvrGpConfFactReservationsAction(Request $requestAlertService $alertService) {
  1094.         $session = new Session();
  1095.         $token=$session->get('tokenGoogleCalendar');
  1096.         if (!is_null($token)) {
  1097.             $this->googleCalendar->setAccessToken($token);
  1098.             $connectGoogle "1";
  1099.         }else{
  1100.             $connectGoogle "0";
  1101.         }
  1102.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  1103.         $user_id $user_logueado->getId();
  1104.         $wnotes = new WidgetNotes();
  1105.         $wnotes->setDateAt(new \DateTime("now"));
  1106.         $form $this->createWidgetNotesCreateForm($wnotes);
  1107.         $alertService->loadGpAlerts($user_logueado);
  1108.         return $this->render('MDS/GreenPatioBundle/reservations/calendar-gp-cvr-confac-reservations.html.twig',
  1109.             array(
  1110.                 'form' => $form->createView(),
  1111.                 'user'=> $user_id,
  1112.                 'connectGoogle' => $connectGoogle,
  1113.             )
  1114.         );
  1115.     }
  1116.     /**
  1117.      * @Route("/gp-cvr/eventsgpcvrconfac", name="get_reservations_gp_cvr_con_fac")
  1118.      */
  1119.     public function reservationGpCvrEventsConfFactAction(Request $request)
  1120.     {
  1121.         $em $this->getDoctrine()->getManager();
  1122.         // Buscamos las reservas desde 1 año atras en adelante para no traer exceso de datos
  1123.         $todayOneYearAgo = new DateTime('now -365 days');
  1124.         $parameters = array('dateStart' => $todayOneYearAgo,);
  1125.         $dql 'SELECT p
  1126.                 FROM GreenPatioBundle:ReservationLoungeSimple p                         
  1127.                 WHERE p.dateStart >= :dateStart  
  1128.                 ORDER BY p.dateStart ASC ';
  1129.         $query $em->createQuery($dql)->setParameters($parameters);
  1130.         $reservation $query->getResult();
  1131.         // Buscamos las visitas desde 1 semana atras en adelante para no traer exceso de datos (Tiempo confirmado por Gabriela Bracho)
  1132.         $todayOneWeekAgo = new DateTime('now -1 week');
  1133.         $parameters = array('dateStart' => $todayOneWeekAgo,);
  1134.         $dql 'SELECT p
  1135.                 FROM GreenPatioBundle:ReservationVisit p                         
  1136.                 WHERE p.dateStart >= :dateStart  
  1137.                 ORDER BY p.dateStart ASC ';
  1138.         $query $em->createQuery($dql)->setParameters($parameters);
  1139.         $visitas $query->getResult();
  1140.         $arrayFechaVisitas = [];
  1141.         foreach ($visitas as $item) {
  1142.             //Se agrupan las visitas por fechas
  1143.             $arrayFechaVisitas[$item->getDateStart()->format('Y-m-d').$item->getId()][] = $item;
  1144.         }
  1145.         $newArrayVisitas = [];
  1146.         //Se agrupan las visitas por agente
  1147.         foreach ($arrayFechaVisitas as $fecha) {
  1148.             foreach ($fecha as $item) {
  1149.                 //Se van concatenando los titulos de las visitas en una sola
  1150.                 $loungeNameTemp '';
  1151.                 $idAgentLounge = ($item->getIdLounge() == 0) ? $item->getAgentId() : '0';
  1152.                 if (!empty($newArrayVisitas[$item->getDateStart()->format('Y-m-d') . '-' $idAgentLounge])) {
  1153. //                    $loungeNameTemp = $newArrayVisitas[$item->getDateStart()->format('Y-m-d') . '-' . $idAgentLounge]->getLoungeName();
  1154.                 }
  1155.                 $pos strripos($item->getLoungeName(), "Visita");
  1156.                 if ($pos !== false) { $prefijo substr($item->getLoungeName(), $pos); }        // Rafa pidio colocar el nombre del agente por delante
  1157.                 $item->setLoungeName($loungeNameTemp $item->getDateStart()->format('H:i') . ' ' $prefijo ' ' $item->getLoungeName() . '<br>');
  1158.                 $newArrayVisitas[$item->getDateStart()->format('Y-m-d') . '-' $idAgentLounge] = $item;
  1159.             }
  1160.         }
  1161.         $visitas $newArrayVisitas;
  1162.         $xArray = [];
  1163.         foreach ($arrayFechaVisitas as $elem) { foreach ($elem as $item) { $xArray[] = $item; } }
  1164.         foreach ($xArray as $item) { array_push($reservation$item); }
  1165.         $datos = [];
  1166.         $datosMontaje = [];
  1167.         $datosDesMontaje = [];
  1168.         if (!empty($reservation)) {
  1169.             foreach ($reservation as $reservaSala) {
  1170.                 $loungeDetailsName '';
  1171.                 if (!empty($reservaSala->getIdReservation())) {
  1172.                     $reserva $em->getRepository(Reservation::class)->findOneById($reservaSala->getIdReservation());
  1173.                     if ($reservaSala->getType() == 'Visit') { $reserva->setStatus('Visit'); }
  1174.                 } else {
  1175.                     // Estamos con una visita
  1176.                     $reserva = new Reservation();
  1177.                     $reserva->setStatus('Visit');
  1178.                     $reserva->setTitle($reservaSala->getLoungeName());
  1179.                     if (!empty($reservaSala->getIdLoungeDetails())){
  1180.                         $loungeDetailsName =  $em->getRepository(ReservationLoungeDetails::class)->findOneById($reservaSala->getIdLoungeDetails());
  1181.                         $loungeDetailsName = (empty($loungeDetailsName)) ? '' $loungeDetailsName->getName();
  1182.                     }
  1183.                 }
  1184.                 if ($reservaSala->getDateStart()->format('d') == $reservaSala->getDateEnd()->format('d')) {
  1185.                     $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() .' '$loungeDetailsName;
  1186.                 } else {
  1187.                     $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() .' '$loungeDetailsName;
  1188.                 }
  1189.                 $logicoVisita false;
  1190.                 if (!is_null($reserva->getStatus())) {
  1191.                     $statusColorMap = [
  1192.                         'Bloqueo' => function($reservaSala) {
  1193.                             $idLounge $reservaSala->getIdLounge();
  1194.                             if ($idLounge 29) {
  1195.                                 return "#2691fc"// Marrón (Bella View)
  1196.                             } elseif ($idLounge 21) {
  1197.                                 return "#b873bf"// Morado (Covarrubias)
  1198.                             } else {
  1199.                                 return "#ffaa00"// Naranja (Green Patio)
  1200.                             }
  1201.                         },
  1202.                         'Confirmed' => "#13ad27",
  1203.                         'Invoiced' => "#13ad27",
  1204.                         'Deleted' => "#ff0000",
  1205.                         'Cotizado' => "#faafc3",
  1206.                         'Reservado' => "#13ad27",
  1207.                         'Visit' => function($reservaSala) {
  1208.                             if ($reservaSala->getIdLounge() == 0) {
  1209.                                 return $agentColorMap[$reservaSala->getAgentId()] ?? "";
  1210.                             } else {
  1211.                                 if ($reservaSala->getIdLounge() == 1) {
  1212.                                     return '#f0d800';   //  Color Covarrubias
  1213.                                 } else {
  1214.                                     return '#066191';   //  Color Bella View
  1215.                                 }
  1216.                             }
  1217.                         },
  1218.                         'default' => "#066191",
  1219.                     ];
  1220.                     $color "";
  1221.                     $logicoVisita false;
  1222.                     if (array_key_exists($reserva->getStatus(), $statusColorMap)) {
  1223.                         $value $statusColorMap[$reserva->getStatus()];
  1224.                         // Si el valor es una función, la ejecutamos para obtener el color.
  1225.                         $color is_callable($value) ? $value($reservaSala) : $value;
  1226.                         if ($reserva->getStatus() === 'Visit') {
  1227.                             $logicoVisita true;
  1228.                         }
  1229.                     } else {
  1230.                         $color $statusColorMap['default'];
  1231.                     }
  1232.                     if (!empty($reservaSala->getType()) and !($reservaSala->getType() == 'Visit')) {
  1233.                         //Es un montaje o desmontaje
  1234.                         $color "#a5b8a2";
  1235.                         // Si es un montaje o desmontaje pero esta cancelado debe prevalecer el color de cancelado
  1236.                         if ($reserva->getStatus() == 'Deleted') { $color "#ff0000"; }
  1237.                     }
  1238.                     if (($reservaSala->getIdLounge() > 21) and ($reservaSala->getIdLounge() < 30)){
  1239.                         //Ajustamos el color a una sala de covarrubia
  1240.                         switch ($color) {
  1241.                             case '#ffaa00'$color "#b873bf"; break; //naranja (bloqueo) => morado
  1242.                             case '#13ad27'$color "#017362"; break; //verde (Confirmed) => verde olivo
  1243.                             case '#ff0000'$color "#ff0000"; break; //rojo
  1244.                             case '#faafc3'$color "#faafc3"; break; //Rojo claro
  1245.                             default: break; //no modificar el color
  1246.                         }
  1247.                     }
  1248.                     if ($reservaSala->getIdLounge() > 29){
  1249.                         //Ajustamos el color a una sala de bella view
  1250.                         switch ($color) {
  1251.                             case '#ffaa00'$color "#2691fc"; break; //naranja (bloqueo) => azul claro
  1252.                             case '#13ad27'$color "#066191"; break; //verde (Confirmed) => azul oscuro
  1253.                             case '#ff0000'$color "#ff0000"; break; //rojo
  1254.                             case '#faafc3'$color "#faafc3"; break; //Rojo claro
  1255.                             default: break; //no modificar el color
  1256.                         }
  1257.                     }
  1258.                 }
  1259.                 $pago1 "";
  1260.                 $pago2 "";
  1261.                 $ht "";
  1262.                 if (!($reserva->getStatus() == 'Visit')) {
  1263.                     $paymentsAll $em->getRepository(ReservationPaymentsClient::class)->findOneByReservationId($reserva->getId());
  1264.                 } else {
  1265.                     $paymentsAll null;
  1266.                 }
  1267.                 if (!empty($paymentsAll)) {
  1268.                     $pago2 "<i class='icon-coin-euro' style='color: #000 !important;'></i>";      //Hay pagos parciales
  1269.                 }
  1270.                 if (!($reserva->getStatus() == 'Visit')) {
  1271.                     $facturas $em->getRepository(ReservationInvoice::class)->findByReservationId($reserva->getId());
  1272.                     $facturasCVR $em->getRepository(CvrReservationInvoice::class)->findByReservationId($reserva->getId());
  1273.                     $facturasBLV $em->getRepository(BlvReservationInvoice::class)->findByReservationId($reserva->getId());
  1274.                     foreach ($facturasCVR as $item) { array_push($facturas$item); }
  1275.                     foreach ($facturasBLV as $item) { array_push($facturas$item); }
  1276.                 }
  1277.                 if (!empty($facturas)) {
  1278.                     foreach ($facturas as $factura) {
  1279.                         if ($factura->getMaster() == "master") {
  1280.                             $pago1 "<i class='icon-thumbs-up3' style='color: #000 !important;'></i>";// Se ha pagado la totalidad
  1281.                         }
  1282.                         if ($factura->getMaster() != "master") {
  1283.                             $pago2 "<i class='icon-coin-euro' style='color: #000 !important;'></i>";      //Hay pagos parciales
  1284.                         }
  1285.                     }
  1286.                 }
  1287.                 if ($reserva->getCateringName() == 'HIGO & TRIGO, S.L.') {
  1288.                     $ht "<a style='color: #000 !important;'><strong>H&T</strong></a>";      // Es una reserva con servicio de Catering Higo & Trigo
  1289.                 }
  1290.                 // Pagos parciales y totales
  1291.                 if (!empty($reserva)) {
  1292.                     if (!$logicoVisita) {
  1293.                         if (($reserva->getStatus() == 'Confirmed') or ($reserva->getStatus() == 'Invoiced')) {
  1294.                             $datos[] = array(
  1295.                                 "title" => $reservaSala->getDateStart()->format('H:i') . ' ' $pago2 $pago1 $ht ' ' $reservaSala->getType() . ' ' $reservaSala->getLoungeName() . '<br>' $reserva->getTitle(),
  1296.                                 "titleOne" => $reservaSala->getDateStart()->format('H:i') . ' ' $pago2 $pago1 $ht ' ' $reservaSala->getType(),
  1297.                                 "titleTwo" => $reservaSala->getLoungeName(),
  1298.                                 "titleThree" => '' '<br>' $reserva->getTitle(),
  1299.                                 "type" => $reservaSala->getType(),
  1300.                                 "id" => $reserva->getId(),
  1301.                                 "tooltip" => $tooltip,
  1302.                                 "start" => $reservaSala->getDateStart(),
  1303.                                 "end" => $reservaSala->getDateEnd(),
  1304.                                 "color" => $color,
  1305.                                 "loungeId" => $reservaSala->getIdLounge(),
  1306.                                 "url" => "/reservations-greenpatio/edit/" $reserva->getId(),
  1307.                                 "status" => $reserva->getStatus(),
  1308.                             );
  1309.                         }
  1310.                     } else {
  1311.                         // Es una visita
  1312.                     }
  1313.                 } else {
  1314.                     $datos = [];
  1315.                 }
  1316.             }
  1317.         }
  1318.         $newDatos = [];
  1319.         // INICIO: Se unen las salas en una sola reserva por ID de reserva
  1320.         foreach ($datos as $dato) {
  1321.             // Inicializamos el arreglo para crear los indices
  1322.             switch ($dato['color']){
  1323.                 case '#a5b8a2':              //Montaje o Desmontaje
  1324.                     if ($dato['type'] == 'Montaje'){
  1325.                         $newDatos[$dato['id'].'M'] = null;
  1326.                     } else {
  1327.                         $newDatos[$dato['id'].'D'] = null;
  1328.                     }
  1329.                     break;
  1330.                 default:                    //Dia de reserva o Visita (la visita ya viene con su indice #V )
  1331.                     $newDatos[$dato['id']] = null;
  1332.                     break;
  1333.             }
  1334.         }
  1335.         foreach ($datos as $dato) {
  1336.             switch ($dato['color']){
  1337.                 //Montaje o Desmontaje
  1338.                 case '#a5b8a2':
  1339.                     if ($dato['type'] == "Montaje") {
  1340.                         if (!empty($newDatos[$dato['id'] . 'M'])) {
  1341.                             // 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)
  1342.                             if ($newDatos[$dato['id'] . 'M']['loungeId'] == $dato['loungeId']) {
  1343.                                 if ($newDatos[$dato['id'] . 'M']['start'] > $dato['start']) { $newDatos[$dato['id'] . 'M']['start'] = $dato['start']; }
  1344.                                 if ($newDatos[$dato['id'] . 'M']['end'] < $dato['end']) { $newDatos[$dato['id'] . 'M']['end'] = $dato['end']; }
  1345.                             } else {
  1346.                                 if (array_key_exists($dato['id'] . 'M'.$dato['loungeId'],$newDatos)){
  1347.                                     if ($newDatos[$dato['id'] . 'M'.$dato['loungeId']]['start'] > $dato['start']) { $newDatos[$dato['id'] . 'M'.$dato['loungeId']]['start'] = $dato['start']; }
  1348.                                     if ($newDatos[$dato['id'] . 'M'.$dato['loungeId']]['end'] < $dato['end']) { $newDatos[$dato['id'] . 'M'.$dato['loungeId']]['end'] = $dato['end']; }
  1349.                                 } else {
  1350.                                     $newDatos[$dato['id'] . 'M'.$dato['loungeId']] = $dato;
  1351.                                 }
  1352.                             }
  1353.                         } else {
  1354.                             $newDatos[$dato['id'] . 'M'] = $dato;
  1355.                         }
  1356.                     } else {
  1357.                         if ($dato['type'] == "Desmontaje") {
  1358.                             if (!empty($newDatos[$dato['id'] . 'D'])) {
  1359.                                 // El Desmontaje esta ocupando mas de 1 dia, se deben unir los dias de desmontaje
  1360.                                 if ($newDatos[$dato['id'] . 'D']['start'] > $dato['start']) { $newDatos[$dato['id'] . 'D']['start'] = $dato['start']; }
  1361.                                 if ($newDatos[$dato['id'] . 'D']['end'] < $dato['end']) { $newDatos[$dato['id'] . 'D']['end'] = $dato['end']; }
  1362.                             } else {
  1363.                                 $newDatos[$dato['id'] . 'D'] = $dato;
  1364.                             }
  1365.                         }
  1366.                     }
  1367.                     break;
  1368.                 //Visita Angie (id user 77)
  1369.                 case '#22cbf5':
  1370.                     if ($dato['type'] == "Visit") {
  1371.                         $newDatos[$dato['start']->format('Ymd').'V77'.$dato['id']] = $dato;
  1372.                         if (!empty($newDatos[$dato['start']->format('Ymd').'V77'])) {
  1373.                             // Hay varias visitas ese mismo dia para el agente
  1374. //                            $newDatos[$dato['start']->format('Ymd').'V77']['tooltip'] = $newDatos[$dato['start']->format('Ymd').'V77']['tooltip'] . $dato['tooltip'];
  1375.                         } else {
  1376. //                            $newDatos[$dato['start']->format('Ymd').'V77'] = $dato;
  1377.                         }
  1378.                     }
  1379.                     break;
  1380.                 //Visita Gabriela (id user 82)
  1381.                 case '#f5229a':
  1382.                     if ($dato['type'] == "Visit") {
  1383.                         $newDatos[$dato['start']->format('Ymd').'V82'.$dato['id']] = $dato;
  1384.                         if (!empty($newDatos[$dato['start']->format('Ymd').'V82'])) {
  1385.                             // Hay varias visitas ese mismo dia para el agente
  1386. //                            $newDatos[$dato['start']->format('Ymd').'V82']['tooltip'] = $newDatos[$dato['start']->format('Ymd').'V82']['tooltip'] . $dato['tooltip'];
  1387.                         } else {
  1388. //                            $newDatos[$dato['start']->format('Ymd').'V82'] = $dato;
  1389.                         }
  1390.                     }
  1391.                     break;
  1392.                 //Visita Cristina (id user 120)
  1393.                 case '#157cc2':
  1394.                     if ($dato['type'] == "Visit") {
  1395.                         $newDatos[$dato['start']->format('Ymd').'V120'.$dato['id']] = $dato;
  1396.                         if (!empty($newDatos[$dato['start']->format('Ymd').'V120'])) {
  1397.                             // Hay varias visitas ese mismo dia para el agente
  1398. //                            $newDatos[$dato['start']->format('Ymd').'V120']['tooltip'] = $newDatos[$dato['start']->format('Ymd').'V120']['tooltip'] . $dato['tooltip'];
  1399.                         } else {
  1400. //                            $newDatos[$dato['start']->format('Ymd').'V120'] = $dato;
  1401.                         }
  1402.                     }
  1403.                     break;
  1404.                 //Visita Generica para agentes a Covarrubias
  1405.                 case '#f0d800':
  1406.                     if ($dato['type'] == "Visit") {
  1407.                         $newDatos[$dato['start']->format('Ymd').'V0'.$dato['id']] = $dato;
  1408.                         if (!empty($newDatos[$dato['start']->format('Ymd').'V0'])) {
  1409.                             // Hay varias visitas ese mismo dia para el agente
  1410. //                            $newDatos[$dato['start']->format('Ymd').'V0']['tooltip'] = $newDatos[$dato['start']->format('Ymd').'V0']['tooltip'] . $dato['tooltip'];
  1411.                         } else {
  1412. //                            $newDatos[$dato['start']->format('Ymd').'V0'] = $dato;
  1413.                         }
  1414.                     }
  1415.                     break;
  1416.                 //Visita Generica para agentes a Bella View
  1417.                 case '#990202':
  1418.                     if ($dato['type'] == "Visit") {
  1419.                         $newDatos[$dato['start']->format('Ymd').'V0'.$dato['id']] = $dato;
  1420.                         if (!empty($newDatos[$dato['start']->format('Ymd').'V0'])) {
  1421.                             // Hay varias visitas ese mismo dia para el agente
  1422. //                            $newDatos[$dato['start']->format('Ymd').'V0']['tooltip'] = $newDatos[$dato['start']->format('Ymd').'V0']['tooltip'] . $dato['tooltip'];
  1423.                         } else {
  1424. //                            $newDatos[$dato['start']->format('Ymd').'V0'] = $dato;
  1425.                         }
  1426.                     }
  1427.                     break;
  1428.                 //Reserva color naranja Bloqueo
  1429.                 case '#ffaa00':
  1430.                     if (empty($newDatos[$dato['id']])){
  1431.                         $newDatos[$dato['id']] = $dato;
  1432.                     } else {
  1433.                         // Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
  1434.                         if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
  1435.                         if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
  1436.                         $newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' $dato['tooltip'];
  1437.                         // Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
  1438.                         if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
  1439.                             // No se encontro la cadena, debemos agregar
  1440.                             $newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'$dato['titleTwo'];
  1441.                             $newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
  1442.                         }
  1443.                     }
  1444.                     break;
  1445.                 //Reserva color morado Bloqueo (Covarrubias)
  1446.                 case '#b873bf':
  1447.                     if (empty($newDatos[$dato['id']])){
  1448.                         $newDatos[$dato['id']] = $dato;
  1449.                     } else {
  1450.                         // Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
  1451.                         if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
  1452.                         if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
  1453.                         $newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' $dato['tooltip'];
  1454.                         // Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
  1455.                         if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
  1456.                             // No se encontro la cadena, debemos agregar
  1457.                             $newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'$dato['titleTwo'];
  1458.                             $newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
  1459.                         }
  1460.                     }
  1461.                     break;
  1462.                 //Reserva color Rojo claro Cotizado
  1463.                 case '#faafc3':
  1464.                     if (empty($newDatos[$dato['id']])){
  1465.                         $newDatos[$dato['id']] = $dato;
  1466.                     } else {
  1467.                         // Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
  1468.                         if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
  1469.                         if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
  1470.                         $newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' $dato['tooltip'];
  1471.                         // Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
  1472.                         if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
  1473.                             // No se encontro la cadena, debemos agregar
  1474.                             $newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'$dato['titleTwo'];
  1475.                             $newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
  1476.                         }
  1477.                     }
  1478.                     break;
  1479.                 //Reserva color Rojo Reserva Cancelada
  1480.                 case '#ff0000':
  1481.                     //Las canceladas no se muestran en el calendario
  1482.                     break;
  1483.                 //Reserva color Verde Reserva Confirmada, Facturada, (se ha adelantado un pago parcial)
  1484.                 case '#13ad27':
  1485.                     if (empty($newDatos[$dato['id']])){
  1486.                         $newDatos[$dato['id']] = $dato;
  1487.                     } else {
  1488.                         // Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
  1489.                         if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
  1490.                         if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
  1491.                         $newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' $dato['tooltip'];
  1492.                         // Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
  1493.                         if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
  1494.                             // No se encontro la cadena, debemos agregar
  1495.                             $newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'$dato['titleTwo'];
  1496.                             $newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
  1497.                         }
  1498.                     }
  1499.                     break;
  1500.                 //Reserva color Verde Reserva Confirmada, Facturada, (Covarrubias)
  1501.                 case '#017362':
  1502.                     if (empty($newDatos[$dato['id']])){
  1503.                         $newDatos[$dato['id']] = $dato;
  1504.                     } else {
  1505.                         // Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
  1506.                         if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
  1507.                         if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
  1508.                         $newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' $dato['tooltip'];
  1509.                         // Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
  1510.                         if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
  1511.                             // No se encontro la cadena, debemos agregar
  1512.                             $newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'$dato['titleTwo'];
  1513.                             $newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
  1514.                         }
  1515.                     }
  1516.                     break;
  1517.                 //Se pondra color a negro para resaltar este cualquier caso que no haya sido considerado (status Pendiente)
  1518.                 default:
  1519.                     if (empty($newDatos[$dato['id']])){
  1520.                         $newDatos[$dato['id']] = $dato;
  1521.                     } else {
  1522.                         // Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
  1523.                         if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
  1524.                         if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
  1525.                         $newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' $dato['tooltip'];
  1526.                         // Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
  1527.                         if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
  1528.                             // No se encontro la cadena, debemos agregar
  1529.                             $newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'$dato['titleTwo'];
  1530.                             $newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
  1531.                         }
  1532.                     }
  1533.                     // Se pone en color negro para resaltar este caso que no esta entrando en ninguno de los casos anteriores
  1534.                     $newDatos[$dato['id']]['color'] = '#000000';
  1535.                     if ($dato['type'] == "Visit") {
  1536.                         // Si no es una de los agentes regulares (Gaby, Angie, Cristina) se busca el color del usuario configurado en el perfil
  1537.                         $elAgente $em->getRepository(User::class)->findOneById($dato['agentId']);
  1538.                         $elAgenteColor = !empty($elAgente) ? $elAgente->getColor() : null;
  1539.                         if (!empty($elAgenteColor)){ $newDatos[$dato['id']]['color'] = $elAgenteColor; }
  1540.                     }
  1541.                     break;
  1542.             }
  1543.         }
  1544.         $datos0 = array();
  1545.         foreach ($newDatos as $key => $item) {
  1546.             if (!empty($item['id'])) {
  1547.                 $datos0[$key] = array('title' => $item['title'],
  1548.                     'titleOne' => $item['titleOne'],
  1549.                     'titleTwo' => $item['titleTwo'],
  1550.                     'titleThree' => $item['titleThree'],
  1551.                     'type' => $item['type'],
  1552.                     'id' => $item['id'],
  1553.                     'tooltip' => $item['tooltip'],
  1554.                     'start' => $item['start'],
  1555.                     'end' => $item['end'],
  1556.                     'color' => $item['color'],
  1557.                     'loungeId' => $item['loungeId'],
  1558.                     'url' => $item['url']
  1559.                 );
  1560.             }
  1561.         }
  1562.         $newDatos $datos0;
  1563.         $datos = array();
  1564.         foreach ($newDatos as $item) {
  1565.             if ($item['color'] != '#ff0000') {
  1566.                 // No se agregan al calendario los elementos eliminados o elementos vacios
  1567.                 if (!empty($item)) {
  1568.                     //INICIO: Verificamos por huecos dentro de la reserva
  1569.                     if (empty($item['type'])) {
  1570.                         // solo las reservas se van a verificar en este if
  1571.                         if ((date_diff($item['start'], $item['end'])->d) > 1) {    //el evento tiene mas de 2 dias, puede haber huecos
  1572.                             $resSimples $em->getRepository(ReservationLoungeSimple::class)->findByIdReservation($item['id']);
  1573.                             $period = new DatePeriod$item['start'], new DateInterval('P1D'), $item['end'] );
  1574.                             $arrayPeriod = array();
  1575.                             foreach ($period as $key => $value) { $arrayPeriod[] = $value; }
  1576.                             $logAllDiasEnReserva false;
  1577.                             $logDiaEnReserva false;
  1578.                             //Verificamos que cada dia tenga su reserva de sala para que no haya hueco
  1579.                             foreach ($arrayPeriod as $day) {
  1580.                                 foreach ($resSimples as $resSimple) {
  1581.                                     if ($resSimple->getDateStart()->format('Y-m-d') == $day->format('Y-m-d')) {
  1582.                                         $logDiaEnReserva true;
  1583.                                         break;
  1584.                                     }
  1585.                                 }
  1586.                                 if (!$logDiaEnReserva) {
  1587.                                     //Un dia no se encontraba, hay un hueco
  1588.                                     foreach ($resSimples as $resDayToAdd) {
  1589.                                         if (empty($resDayToAdd->getType())) {       // Solo se deben agregar salsa los montajes y desmontajes aqui no van
  1590.                                             $item['start'] = $resDayToAdd->getDateStart();
  1591.                                             $item['end'] = $resDayToAdd->getDateEnd();
  1592.                                             $br '<br>';
  1593.                                             $br strpos($item['title'], $br);
  1594.                                             $tempText substr($item['title'], $br 4);
  1595.                                             $item['title'] = $resDayToAdd->getDateStart()->format('H:i') . ' ' '<br>' $tempText;
  1596.                                             $datos[] = $item;
  1597.                                         }
  1598.                                     }
  1599.                                     break;
  1600.                                 } else {
  1601.                                     //Se debe evaluar el siguiente dia
  1602.                                     $logDiaEnReserva false;
  1603.                                     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
  1604.                                         $logAllDiasEnReserva true;
  1605.                                     }
  1606.                                 }
  1607.                             }
  1608.                             if ($logAllDiasEnReserva) { $datos[] = $item; }
  1609.                         } else {
  1610.                             // El evento es de 1 o 2 dias, no hay posibilidad de hueco
  1611.                             $datos[] = $item;
  1612.                         }
  1613.                     } else {
  1614.                         //Es Visita Las visitas son las unicas entradas que no tienen hueco
  1615.                         if ($item['type'] == 'Visit'){
  1616.                             $datos[] = $item;
  1617.                         } else {
  1618.                             // es montaje o desmontaje, se va verificar por huecos
  1619.                             if ((date_diff($item['start'], $item['end'])->d) > 1) {    //el item tiene mas de 2 dias, puede haber huecos
  1620.                                 $parameters = array(
  1621.                                     'id' => $item['id'],
  1622.                                     'type' => $item['type'],
  1623.                                 );
  1624.                                 $dql 'SELECT i
  1625.                                         FROM GreenPatioBundle:ReservationLoungeSimple i
  1626.                                         WHERE  i.idReservation = :id
  1627.                                           and i.type = :type';
  1628.                                 $query $em->createQuery($dql)->setParameters($parameters);
  1629.                                 $resSimples $query->getResult();
  1630.                                 $period = new DatePeriod$item['start'], new DateInterval('P1D'), $item['end'] );
  1631.                                 $arrayPeriod = array();
  1632.                                 foreach ($period as $key => $value) { $arrayPeriod[] = $value; }
  1633.                                 $logAllDiasEnReserva false;
  1634.                                 $logDiaEnReserva false;
  1635.                                 //Verificamos que cada dia tenga su reserva de sala para que no haya hueco
  1636.                                 foreach ($arrayPeriod as $day) {
  1637.                                     foreach ($resSimples as $resSimple) {
  1638.                                         if ($resSimple->getDateStart()->format('Y-m-d') == $day->format('Y-m-d')) {
  1639.                                             $logDiaEnReserva true;
  1640.                                             break;
  1641.                                         }
  1642.                                     }
  1643.                                     if (!$logDiaEnReserva) {
  1644.                                         //Un dia no se encontraba, hay un hueco
  1645.                                         foreach ($resSimples as $resDayToAdd) {
  1646.                                             if (!empty($resDayToAdd->getType())) {       // Solo se deben agregar montajes y desmontajes aqui
  1647.                                                 $item['start'] = $resDayToAdd->getDateStart();
  1648.                                                 $item['end'] = $resDayToAdd->getDateEnd();
  1649.                                                 $br '<br>';
  1650.                                                 $br strpos($item['title'], $br);
  1651.                                                 $tempText substr($item['title'], $br 4);
  1652.                                                 $item['title'] = $resDayToAdd->getDateStart()->format('H:i') . ' ' '<br>' $tempText;
  1653.                                                 $datos[] = $item;
  1654.                                             }
  1655.                                         }
  1656.                                         break;
  1657.                                     } else {
  1658.                                         //Se debe evaluar el siguiente dia
  1659.                                         $logDiaEnReserva false;
  1660.                                         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
  1661.                                             $logAllDiasEnReserva true;
  1662.                                         }
  1663.                                     }
  1664.                                 }
  1665.                                 if ($logAllDiasEnReserva) { $datos[] = $item; }
  1666.                             } else {
  1667.                                 // El montaje o desmontaje es de 1 o 2 dias, no hay posibilidad de hueco
  1668.                                 $datos[] = $item;
  1669.                             }
  1670.                         }
  1671.                     }
  1672.                     //FIN: Verificamos por huecos dentro de la reserva
  1673.                 }
  1674.             }
  1675.         }
  1676.         $return = array( 'reservation' => $datos, );
  1677.         $response = new JsonResponse($return);
  1678.         return $response;
  1679.     }
  1680.     private function createWidgetNotesCreateForm(WidgetNotes $entity)
  1681.     {
  1682.         $form $this->createForm(WidgetNotesType::class, $entity, array(
  1683.             'action' => $this->generateUrl('widget_notes_calendar_cvr_create'),
  1684.             'method' => 'POST'
  1685.         ));
  1686.         return $form;
  1687.     }
  1688. };