src/MDS/GreenPatioBundle/Controller/ReservationsController.php line 8161

Open in your IDE?
  1.                         $pax $item->getPax();
  2.                         if (empty($pax) or $pax == "0") { $pax 1; }
  3.                         $days 1;
  4.                         $unitsServ $item->getUnits();
  5.                         if (empty($unitsServ) or $unitsServ == "0") { $unitsServ 1; }
  6.                         $subtotal $subtotalService $days $unitsServ $pax;
  7.                         $subneto $subneto $days $unitsServ $pax;
  8.                         break;
  9.                     case 15//Assisstant
  10.                         $pax $item->getPax();
  11.                         if (empty($pax) or $pax == "0") { $pax 1; }
  12.                         $days = ((($item->getDateOutAt())->diff($item->getDateInAt()))->days 1);
  13.                         $unitsServ $item->getUnits();
  14.                         if (empty($unitsServ) or $unitsServ == "0") { $unitsServ 1; }
  15.                         $subtotalService $subtotalService $days $unitsServ $pax;
  16.                         $subneto $subneto $days $unitsServ $pax;
  17.                         break;
  18.                     case 16//DDR
  19.                         $pax $item->getPax();
  20.                         if (empty($pax) or $pax == "0") { $pax 1; }
  21.                         $days = ((($item->getDateOutAt())->diff($item->getDateInAt()))->days 1);
  22.                         $unitsServ $item->getUnits();
  23.                         if (empty($unitsServ) or $unitsServ == "0") { $unitsServ 1; }
  24.                         $subtotal $subtotalService $days $unitsServ $pax;
  25.                         $subneto $subneto $days $unitsServ $pax;
  26.                         break;
  27.                     default:
  28.                         $pax $item->getPax();
  29.                         if (empty($pax) or $pax == "0") { $pax 1; }
  30.                         $days = ((($item->getDateOutAt())->diff($item->getDateInAt()))->days 1);
  31.                         $unitsServ $item->getUnits();
  32.                         if (empty($unitsServ) or $unitsServ == "0") { $unitsServ 1; }
  33.                         $subtotalService $subtotalService $days $unitsServ $pax;
  34.                         $subneto $subneto $days $unitsServ $pax;
  35.                         break;
  36.                 }
  37.                 // Over
  38.                 if ($item->getOpOver()=='1'){
  39.                     $subtotalService $subtotalService $item->getOver();
  40.                     $subneto $subneto $item->getOver();
  41.                 } else {
  42.                     $subtotalService $subtotalService $item->getOver();
  43.                     $subneto $subneto $item->getOver();
  44.                 }
  45.                 // IVA
  46.                 if ($item->getOpIva()=='1'){
  47.                     $subtotalService = ($subtotalService * (+ ($item->getIva()/100)));
  48.                 } else {
  49.                     $subtotalService $item->getPrice();
  50.                     $subneto = ($subneto 100) / (100 $item->getIva());
  51.                 }
  52.                 $subtotal += $subtotalService;
  53.                 // Se lleva a 2 decimales round($totales_neto_antes,2,PHP_ROUND_HALF_UP),
  54.                 $subtotal round($subtotal,2,PHP_ROUND_HALF_UP);
  55.                 $neto round($subneto,2,PHP_ROUND_HALF_UP);
  56.             }
  57.             // Iva vacio se calcula al 21%
  58.             $ivaServ = (empty($item->getIva()) && !is_numeric($item->getIva())) ? ($neto * (21/100)) : ($neto * ($item->getIva()/100));
  59.             switch ($item->getIva()){
  60.                 // Acumula IVA
  61.                 case 21$data_iva['ivaMontoVeintiUno'] += $ivaServ; break;
  62.                 case 10$data_iva['ivaMontoDiez'] += $ivaServ; break;
  63.                 case 0: break;
  64.                 default: $data_iva['ivaMontoVeintiUno'] += $ivaServ; break;
  65.             }
  66.             $totales_neto_all += $neto;
  67.             // Se lleva a 2 decimales round($totales_neto_antes,2,PHP_ROUND_HALF_UP)
  68.             $totales_neto_all round($totales_neto_all,2,PHP_ROUND_HALF_UP);
  69.             $data_iva['ivaMontoVeintiUno'] = round($data_iva['ivaMontoVeintiUno'],2,PHP_ROUND_HALF_UP);
  70.             $data_iva['ivaMontoDiez'] = round($data_iva['ivaMontoDiez'],2,PHP_ROUND_HALF_UP);
  71.             // Acumula netos totales e IVA
  72.             $service['neto'] += $neto;
  73.             $service['sumSubT'] += $subtotalService;
  74.             $service['sumIvas'] += $ivaServ;
  75.             // Se lleva a 2 decimales round($totales_neto_antes,2,PHP_ROUND_HALF_UP)
  76.             $service['neto'] = round($service['neto'],2,PHP_ROUND_HALF_UP);
  77.             $service['sumSubT'] = round($service['sumSubT'],2,PHP_ROUND_HALF_UP);
  78.         }
  79.         $data = array(
  80.             'totales_global_con_iva' => $lounge['sumSubT'],
  81.             'totales_global_iva' => $lounge['sumSubT'] - $lounge['neto'],
  82.             'totales_global_neto' => $lounge['neto'],
  83.             'totales_global_servicios_neto' => $service['neto'],
  84.             'totales_global_servicios_con_iva' => $service['sumSubT'],
  85.             'totales_global_servicios_iva' => $service['sumSubT'] - $service['neto'],
  86.             'sumatoria_totales_global_con_iva' => $lounge['sumSubT'] + $service['sumSubT'],
  87.             'sumatoria_totales_global_neto' => $lounge['neto'] + $service['neto'],
  88.             'sumatoria_totales_global_iva' => $lounge['sumSubT'] + $service['sumSubT'] - $lounge['neto'] - $service['neto'],
  89.         );
  90.         return $data;
  91.     }
  92.     /**
  93.      * @Route("/", name="reservations_greenpatio")
  94.      */
  95.     public function calendarReservationAction(Request $request) {
  96.         // Enviar correos a los agentes de las reservas que se deban Cotizar
  97.         $this->notificacionReservasPorCotizar();
  98.         // Enviar correos a los agentes de las reservas que tienen depositos pendientes por recibir
  99.         $this->notificacionReservasPendientesDelSegundoDeposito();
  100.         $session = new Session();
  101.         $token=$session->get('tokenGoogleCalendar');
  102.         if (!is_null($token)) {
  103.             $this->googleCalendar->setAccessToken($token);
  104.             $connectGoogle "1";
  105.         }else{
  106.             $connectGoogle "0";
  107.         }
  108.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  109.         $user_id $user_logueado->getId();
  110.         $wnotes = new WidgetNotes();
  111.         $wnotes->setDateAt(new \DateTime("now"));
  112.         $form $this->createWidgetNotesCreateForm($wnotes);
  113.         return $this->render('MDS/GreenPatioBundle/reservations/calendar-reservations.html.twig',
  114.             array(
  115.                 'form' => $form->createView(),
  116.                 'user'=> $user_id,
  117.                 'connectGoogle' => $connectGoogle,
  118.             )
  119.         );
  120.     }
  121.     private function createWidgetNotesCreateForm(WidgetNotes $entity)
  122.     {
  123.         $form $this->createForm(WidgetNotesType::class, $entity, array(
  124.             'action' => $this->generateUrl('widget_notes_calendar_create'),
  125.             'method' => 'POST'
  126.         ));
  127.         return $form;
  128.     }
  129. //    private function createWidgetNotesEditForm(WidgetNotes $entity, $id)
  130. //    {
  131. //        $form = $this->createForm(WidgetNotesType::class, $entity, array(
  132. //            'action' => $this->generateUrl('widget_notes_edit',
  133. //                array(
  134. //                    'id' => $id
  135. //                )),
  136. //            'method' => 'PUT'
  137. //        ));
  138. //
  139. //        return $form;
  140. //    }
  141.     /**
  142.      * @Route("/widget/notes/calendar/create/", name="widget_notes_calendar_create")
  143.      */
  144.     public function addNotesAction(EntityManagerInterface $emRequest $requestLoggerInterface $logger)
  145.     {
  146.         $notes $em->getRepository(WidgetNotes::class)->findAll();
  147.         $wnotes = new WidgetNotes();
  148.         $form $this->createWidgetNotesCreateForm($wnotes);
  149.         $form->handleRequest($request);
  150.         $forAgent $form->get('forAgent')->getData();
  151.         if(!is_null($forAgent)){ $wnotes->setForAgent($forAgent->getId()); }
  152.         if($form->isValid())
  153.         {
  154.             /* Obtengo usuario logueado */
  155.             $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  156.             $user_id $user_logueado->getId();
  157.             $wnotes->setCreatedId($user_id);
  158.             $wnotes->setUpdatedId($user_id);
  159.             /* Gestión de eventos en Log */
  160.             $user_lastname $user_logueado->getLastname();
  161.             $user_name $user_logueado->getName();
  162.             $user_email $user_logueado->getEmail();
  163.             $user_rol $user_logueado->getRoles();
  164.             $event_url $request->getPathInfo();
  165.             $event_complete $user_name.' '.$user_lastname.' - '.$user_email.' - '.$user_rol[0].' | '.$event_url;
  166.             try{
  167.                 $em->persist($wnotes);
  168.                 $em->flush();
  169.                 $event 'The Note has been created succesfully.';
  170.                 $successMessage $this->translator->trans($event);
  171.                 $this->addFlash('mensaje'$successMessage);
  172.                 $logger->info($event_complete.' | '.$event);
  173.             } catch (\Exception $e){
  174.                 $event 'An error occurred: '.$e->getMessage();
  175.                 /* Para el log */
  176.                 $logger->error($event_complete.' | '.$event);
  177.                 /* Para el usuario */
  178.                 $errorMessage $this->translator->trans($event);
  179.                 $this->addFlash('mensajeerror'$errorMessage);
  180.             }
  181.             /* Fin Gestión de eventos en Log */
  182.         } else {
  183.             $errorMessage $this->translator->trans('Error, some fields are empty');
  184.             $this->addFlash('mensajeerror'$errorMessage);
  185.         }
  186.         return $this->redirectToRoute('homepage');
  187.     }
  188.     /**
  189.      * @Route("/list/{idgroup}", defaults={"idgroup" = 0}, name="reservations_greenpatio_index")
  190.      */
  191.     public function indexAction($idgroupEntityManagerInterface $emRequest $request) {
  192.         $parameters = array( 'statusdel' => 'Deleted' );
  193.         $dql 'SELECT i
  194.                 FROM GreenPatioBundle:Reservation i
  195.                 WHERE i.status <> :statusdel
  196.                 ORDER BY i.dateStart ASC';
  197.         $query $em->createQuery($dql)->setParameters($parameters);
  198.         $ref = array();
  199.         $reservas $query->getResult();
  200.         $reservasZero = array();
  201.         foreach ($reservas as $res){
  202.             $client $em->getRepository(Client::class)->findOneById($res->getClient());
  203.             if (!empty($client)){ $res->setClient($client->getName()); } else { $res->setClient(null); }
  204.             $res->setCreatedBy(
  205.                 ($em->getRepository(User::class)->findOneById($res->getCreatedBy()))->getName() . ' '.
  206.                 ($em->getRepository(User::class)->findOneById($res->getCreatedBy()))->getLastName());
  207.             $ref[$res->getId()] = '#'.($res->getDateStart())->format('ymd').($res->getDateEnd())->format('ymd');
  208.             switch ($res->getStatus()){
  209.                 case 'Bloqueo'$res->setStatus('BLOQUEO'); break;
  210.                 case 'Confirmed'$res->setStatus('CONFIRMADO'); break;
  211.                 case 'Invoiced'$res->setStatus('FACTURADO'); break;
  212.                 case 'Cotizado'$res->setStatus('COTIZADO'); break;
  213.                 case 'Deleted'$res->setStatus('CANCELADO'); break;
  214.                 default: $res->setStatus('INICIADO'); break;
  215.             }
  216.             $reservasZero[] = array(
  217.                 'dateStart' => $res->getDateStart(),
  218.                 'dateEnd' => $res->getDateEnd(),
  219.                 'id' => $res->getId(),
  220.                 'title' => $res->getTitle(),
  221.                 'client' => $res->getClient(),
  222.                 'createdBy' => $res->getCreatedBy(),
  223.                 'createdAt' => $res->getCreatedAt(),
  224.                 'ref' => $ref[$res->getId()],
  225.                 'status' => $res->getStatus(),
  226.             );
  227.         }
  228.         $reservas $reservasZero;
  229.         return $this->render('MDS/GreenPatioBundle/reservations/list-reservations.html.twig',
  230.             array(
  231.                 'groups' => null,
  232.                 'titleView' => '',
  233.                 'reservations' => $reservas
  234.             )
  235.         );
  236.     }
  237.     /**
  238.      * @Route("/listcanceled/{idgroup}", defaults={"idgroup" = 0}, name="reservations_canceled")
  239.      */
  240.     public function indexCanceledAction(EntityManagerInterface $em$idgroupRequest $request) {
  241.         $parameters = array( 'status' => 'Deleted' );
  242.         $dql 'SELECT i
  243.                 FROM GreenPatioBundle:Reservation i
  244.                 WHERE i.status = :status
  245.                 ORDER BY i.dateStart ASC';
  246.         $query $em->createQuery($dql)->setParameters($parameters);
  247.         $ref = array();
  248.         $reservas $query->getResult();
  249.         foreach ($reservas as $res){
  250.             $client $em->getRepository(Client::class)->findOneById($res->getClient());
  251.             if (!empty($client)){ $res->setClient($client->getName()); } else { $res->setClient(null); }
  252.             $res->setCreatedBy(
  253.                 ($em->getRepository(User::class)->findOneById($res->getCreatedBy()))->getName() . ' '.
  254.                 ($em->getRepository(User::class)->findOneById($res->getCreatedBy()))->getLastName());
  255.             $ref[$res->getId()] = '#'.($res->getDateStart())->format('ymd').($res->getDateEnd())->format('ymd');
  256.         }
  257.         $reservasZero = array();
  258.         foreach ($reservas as $res){
  259.             $reservasZero[] = array(
  260.                 'dateStart' => $res->getDateStart(),
  261.                 'dateEnd' => $res->getDateEnd(),
  262.                 'id' => $res->getId(),
  263.                 'title' => $res->getTitle(),
  264.                 'client' => $res->getClient(),
  265.                 'createdBy' => $res->getCreatedBy(),
  266.                 'createdAt' => $res->getCreatedAt(),
  267.                 'ref' => $ref[$res->getId()],
  268.                 'status' => $res->getStatus(),
  269.             );
  270.         }
  271.         $reservas $reservasZero;
  272.         return $this->render('MDS/GreenPatioBundle/reservations/list-reservations.html.twig',
  273.             array(
  274.                 'groups' => null,
  275.                 'titleView' => ' Canceladas',
  276.                 'reservations' => $reservas
  277.             )
  278.         );
  279.     }
  280.     /**
  281.      * @Route("/listquoted/{idgroup}", defaults={"idgroup" = 0}, name="reservations_quoted")
  282.      */
  283.     public function indexQuotedAction(EntityManagerInterface $em$idgroupRequest $request) {
  284.         $parameters = array( 'status' => 'Cotizado' );
  285.         $dql 'SELECT i
  286.                 FROM GreenPatioBundle:Reservation i
  287.                 WHERE i.status = :status
  288.                 ORDER BY i.createdAt ASC';
  289.         $query $em->createQuery($dql)->setParameters($parameters);
  290.         $ref = array();
  291.         $reservas $query->getResult();
  292.         foreach ($reservas as $res){
  293.             $client $em->getRepository(Client::class)->findOneById($res->getClient());
  294.             if (!empty($client)){ $res->setClient($client->getName()); } else { $res->setClient(null); }
  295.             $res->setCreatedBy(
  296.                 ($em->getRepository(User::class)->findOneById($res->getCreatedBy()))->getName() . ' '.
  297.                 ($em->getRepository(User::class)->findOneById($res->getCreatedBy()))->getLastName());
  298.             $ref[$res->getId()] = '#'.($res->getCreatedAt())->format('ymdHi');
  299.         }
  300.         $reservasZero = array();
  301.         foreach ($reservas as $res){
  302.             $data $this->CalculosTotalesEditSimple($res->getId());
  303.             $reservasZero[] = array(
  304.                 'dateStart' => $res->getDateStart(),
  305.                 'dateEnd' => $res->getDateEnd(),
  306.                 'id' => $res->getId(),
  307.                 'title' => $res->getTitle(),
  308.                 'client' => $res->getClient(),
  309.                 'sales' => $data['sumatoria_totales_global_con_iva'],
  310.                 'ref' => $ref[$res->getId()],
  311.                 'createdAt' => $res->getCreatedAt(),
  312.             );
  313.         }
  314.         $reservas $reservasZero;
  315.         return $this->render('MDS/GreenPatioBundle/reservations/list-reservations-quotation.html.twig',
  316.             array(
  317.                 'groups' => null,
  318.                 'titleView' => ' Cotizadas',
  319.                 'reservations' => $reservas
  320.             )
  321.         );
  322.     }
  323.     /**
  324.      * @Route("/edit/{id}", name="reservations_greenpatio_edit")
  325.      */
  326.     public function editAction($id)
  327.     {
  328.         return $this->redirectToRoute('reservations_greenpatio_edit_simple', array( 'id' => $id'token' => null ));
  329.     }
  330.     private function createEditReservationsForm(Reservation $entity$id)
  331.     {
  332.         $form $this->createForm(ReservationType::class, $entity, array( 'action' => $this->generateUrl('reservations_update', array( 'id' => $id ) ), 'method' => 'PUT'));
  333.         return $form;
  334.     }
  335.     /**
  336.      * @Route("/update/{id}", name="reservations_update")
  337.      */
  338.     public function updateAction($idEntityManagerInterface $emRequest $request)
  339.     {
  340.         // INICIO: Si la reserva esta facturada no puede ser modificada
  341.         $reserva $em->getRepository(Reservation::class)->findOneById($id);
  342.         $oldPriority $reserva->getPriority();         // Si no es un administrador la prioridad no se debe modificar
  343.         $zeroStatus $reserva->getStatus();
  344.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  345.         $user_id $user_logueado->getId();
  346.         $hoy = new \DateTime("now"NULL);
  347.         $reserva->setUpdatedBy($user_id);
  348.         $reserva->setUpdatedAt($hoy);
  349.         $arrayRequest $request->request->get('reservation');
  350.         $boolConfirmacion false;
  351.         $clientContact $request->request->get('clientContact');
  352.         $contactUnregistered $request->request->get('contactUnregistered');
  353.         $nameContactUnregistered $request->request->get('nameContactUnregistered');
  354.         $phoneContactUnregistered $request->request->get('phoneContactUnregistered');
  355.         $reserva->setTitle($arrayRequest['title']);
  356.         $reserva->setClientContact($clientContact);
  357.         $reserva->setContactUnregistered($contactUnregistered);
  358.         if (!empty($nameContactUnregistered)){ $reserva->setNameContactUnregistered($nameContactUnregistered); }
  359.         if (!empty($phoneContactUnregistered)){ $reserva->setPhoneContactUnregistered($phoneContactUnregistered); }
  360.         if(!empty($arrayRequest['client'])){ $reserva->setClient($arrayRequest['client']); } else { $reserva->setClient(null); }
  361.         $daysBlock $arrayRequest['daysBlock'] ?? null;
  362.         if(!is_null($daysBlock) && $reserva->getDaysBlock() != $daysBlock){
  363.             if (empty($daysBlock) && $daysBlock !== 0) {
  364.                 $reserva->setDaysBlock(7);
  365.             } else {
  366.                 $reserva->setDaysBlock($daysBlock);
  367.             }
  368.         }
  369.         // Si se ha cambiado al estado "Bloqueo" se envia un correo al cliente y al agente
  370.         if (!empty($arrayRequest['status'])){
  371.             if ($arrayRequest['status'] == 'Bloqueo'){
  372.                 //Calculamos la fecha limite de bloqueo en función de los dias de bloqueo
  373.                 if(empty($reserva->getDays())){
  374.                     $now = new \DateTime("now");
  375.                     $dateLimit date"Y-m-d H:i"strtotime$now->format('Y-m-d H:i') . "+".$reserva->getDaysBlock()." days" ));
  376.                     $dateLimit = new \DateTime($dateLimit);
  377.     
  378.                     $reserva->setDays($dateLimit);
  379.                 }
  380.                 if ((!empty($reserva->getClient())) or (!empty($reserva->getClientContact())) or (!empty($reserva->getContactUnregistered()))) {
  381.                     //Solo se envia correo de notificacion del correo si hay cliente o contacto o contacto no registrado
  382.                     $client $em->getRepository(Client::class)->findOneById($reserva->getClient());
  383.                     $mailAddressTo null;
  384.                     if (!empty($mailAddressTo)) {
  385.                         $agente $em->getRepository(User::class)->findOneById($user_id);
  386.                         $mailAddressFrom $agente->getEmail();
  387.                         $mailSubject 'Notificación de Bloqueo - Reserva de espacio en Green Patio';
  388.                         $mailBody 'Estimado cliente,' .
  389.                             '<br><br> Nos ponemos en contacto con usted para confirmarle que su reserva ha quedado registrada en Green Patio para la realización de su próximo evento.' .
  390.                             '<br>Le recordamos que esta reserva tiene una validez de ' $reserva->getDaysBlock() . ' días. Si pasado este tiempo no hemos recibido confirmación de vuestra parte, procederemos a la cancelación de la misma.' .
  391.                             '<br><br>Reserva: ' $reserva->getId() .' - '$reserva->getTitle();
  392.                         $mailBody $mailBody '<br><br><br>Muchas gracias por su colaboración.<br><br><br>';
  393.                         //Se envia el correo al cliente y al agente
  394.                         $alertaPrevia $em->getRepository(ReservationMailAlertClient::class)->findOneByReservationId($reserva->getId());
  395.                         if (empty($alertaPrevia)){
  396.                             //El correo solo se enviara si no se ha enviado ya una alerta previamente
  397. //                            $this->sendMail($mailAddressFrom, $mailAddressTo, $mailSubject, $mailBody);
  398.                         }
  399.                         //Se genera el control de la alerta
  400. //                        $this->makeAlert($reserva->getId(), $reserva->getClient(), $mailAddressTo, $agente->getId(), $agente->getEmail());
  401.                     }
  402.                 }
  403.                 // Modificar la fecha de notificación
  404.                 if (!empty($arrayRequest['dateNextMailAlert'])) {
  405.                     $nextReservaMailAlert $em->getRepository(ReservationMailAlertClient::class)->findOneByReservationId($id);
  406.                     if (!empty($nextReservaMailAlert)){
  407.                         // La nueva fecha tiene que ser de mañana en adelante
  408.                         if (new \Datetime($arrayRequest['dateNextMailAlert']) > new \Datetime('now')){
  409.                             if ($nextReservaMailAlert->getAlertSended() == 0){
  410.                                 // Si no se ha enviado el mensaje de alerta se modifican la alerta y la cancelacion (+2 dias)
  411.                                 $newAlertDatetime = new \DateTime($arrayRequest['dateNextMailAlert'].' 15:00');
  412.                                 $newCancelDatetime date"Y-m-d H:i"strtotime$newAlertDatetime->format('Y-m-d H:i') . "+2 days" ));
  413.                                 $newCancelDatetime = new \DateTime($newCancelDatetime);
  414.                                 $nextReservaMailAlert->setAlertDateTime($newAlertDatetime);
  415.                                 $nextReservaMailAlert->setCancelDateTime($newCancelDatetime);
  416.                                 $em->persist($nextReservaMailAlert);
  417.                                 $em->flush();
  418.                             } else {
  419.                                 // Si no se ha enviado el mensaje de cancelacion (paso a cotizacion)
  420.                                 $newCancelDatetime = new \DateTime($arrayRequest['dateNextMailAlert'].' 15:00');
  421.                                 $nextReservaMailAlert->setCancelDateTime($newCancelDatetime);
  422.                                 $em->persist($nextReservaMailAlert);
  423.                                 $em->flush();
  424.                             }
  425.                         }
  426.                     }
  427.                 }
  428.             } else{
  429.                 if(!empty($reserva->getDays())){
  430.                     $reserva->setDays(null);
  431.                 }
  432.             }
  433.             $newStatus $this->verificarStatusInicialyFinal($id,$user_id,$reserva->getStatus(),$arrayRequest['status']);
  434.             // Despues de estudiar el estatus se actualiza con el valor que puede tomar
  435.             $arrayRequest['status'] = $newStatus;
  436.             $reserva->setStatus($newStatus);
  437.             if (!($arrayRequest['status'] == 'Bloqueo')){
  438.                 // Si no es un bloqueo, tal vez se deba eliminar una alerta
  439.                 $alertaPrevia $em->getRepository(ReservationMailAlertClient::class)->findOneByReservationId($id);
  440.                 if (!empty($alertaPrevia)){
  441.                     if ($arrayRequest['status'] == 'Deleted'){
  442.                         // Si se cancela y hay una alerta previa se debe enviar automaticamente correo al cliente y agente acerca de la cancelacion o desbloqueo
  443.                         $agent $em->getRepository(User::class)->findOneById($alertaPrevia->getAgentId());
  444.                         $mailAddressTo $alertaPrevia->getClientMail();
  445.                         $mailAddressFrom $alertaPrevia->getAgentMail();
  446.                         $replyTo = array(
  447.                             $alertaPrevia->getClientMail() => $alertaPrevia->getClientMail(),
  448.                             $alertaPrevia->getAgentMail() => $agent->getName().' '$agent->getLastName(),
  449.                         );
  450.                         $mailSubject 'Notificación de Bloqueo - Reserva de espacio en Green Patio';
  451.                         $mailBody 'Estimado cliente,'.
  452.                             '<br><br>Nos ponemos en contacto con usted para informarle de que su reserva ha sido cancelada.'.
  453.                             '<br><br>Reserva: ' $reserva->getId() .' - '$reserva->getTitle();
  454.                         if (!empty($reserva->getDays())){ $mailBody $mailBody '<br>Días bloqueados: '.$reserva->getDays(); }
  455.                         $mailBody $mailBody '<br><br><br>Muchas gracias por su colaboración.<br><br><br>';
  456.                         //Se envia el correo al cliente y al agente
  457.                         $this->sendMail($mailAddressFrom$mailAddressTo$mailSubject$mailBody);
  458.                         $alertaPrevia->setOldReservationId($alertaPrevia->getReservationId());
  459.                         $alertaPrevia->setReservationId(0);
  460.                         $alertaPrevia->setCancelSended(1);
  461.                     } else {
  462.                         $alertaPrevia->setOldReservationId($alertaPrevia->getReservationId());
  463.                         $alertaPrevia->setReservationId(0);
  464.                     }
  465.                     $em->persist($alertaPrevia);
  466.                     $em->flush();
  467.                 }
  468.             }
  469.         }
  470.         $boolConfirmacion = ($boolConfirmacion and ($reserva->getStatus() == 'Pendiente'));  // Si se pidio cambiar el estado y se quedo en Pendiente y es un usario de GreenPatio (rol 48)
  471.         $reserva->setContract($arrayRequest['contract']);
  472.         $reserva->setDescription($arrayRequest['description']);
  473.         if(!empty($arrayRequest['advancePayment'])){ $reserva->setAdvancePayment($arrayRequest['advancePayment']); } else { $reserva->setAdvancePayment(0); }
  474.         if(!empty($arrayRequest['deposit'])){ $reserva->setDeposit($arrayRequest['deposit']); } else { $reserva->setDeposit(0); }
  475.         if(!empty($arrayRequest['pax'])){ $reserva->setPax($arrayRequest['pax']); } else { $reserva->setPax(null); }
  476.         if(!empty($arrayRequest['idProposal'])){ $reserva->setIdProposal($arrayRequest['idProposal']); } else { $reserva->setIdProposal(null); }
  477.         if (!empty($arrayRequest['cateringName'])){ $reserva->setCateringName($arrayRequest['cateringName']); }
  478.         if(is_null($arrayRequest['priority']) or empty($arrayRequest['priority']) or ($arrayRequest['priority'] == 0)){ $reserva->setPriority(1); } else { $reserva->setPriority($arrayRequest['priority']); }
  479.         if ($user_logueado->getRole() == 'ROLE_USER'){
  480.             // La opcion o prioridad solo la pueden modificar los administradores para evitar competencias entre lo agentes
  481.             $reserva->setPriority($oldPriority);
  482.         }
  483.         if(empty($reserva->getStatus())){$reserva->setStatus('Cotizado');}      //El estado de reserva en vacio es que esta en el proceso de cotizacion
  484.         // Actualizamos las fechas de la reserva
  485.         $resLoungeSimples $em->getRepository(ReservationLoungeSimple::class)->findByIdReservation($id);
  486.         $newStart null$newEnd null;
  487.         foreach ($resLoungeSimples as $item) {
  488.             $dateStart $item->getDateStart();
  489.             $dateEnd $item->getDateEnd();
  490.             if ($newStart === null || $dateStart $newStart) { $newStart $dateStart; }
  491.             if ($newEnd === null || $dateEnd $newEnd) { $newEnd $dateEnd; }
  492.         }
  493.         if (!empty($newStart) and !empty($newEnd)){
  494.             $reserva->setDateStart($newStart);
  495.             $reserva->setDateEnd($newEnd);
  496.         }
  497.         try{
  498.             $em->persist($reserva);
  499.             $em->flush();
  500. //            $event = 'The Reservation has been Updated. Now';
  501.             $successMessage 'La reserva ha sido actualizada.';
  502. //            $successMessage = $this->translator->trans($event);
  503.             $this->addFlash('mensajereservation'$successMessage);
  504.         } catch (\Exception $e){
  505.             $event 'An error occurred: '.$e->getMessage();
  506.             /* Para el usuario */
  507.             $errorMessage $this->translator->trans($event);
  508.             $this->addFlash('mensajereservationerror'$errorMessage);
  509.         }
  510.         $data $this->sincGpHtAvService->sincGlobalGpHtAv($id);
  511.         // Se debe solicitar la confirmación de la reserva
  512.         if ($boolConfirmacion){ return $this->redirectToRoute('reservations_greenpatio_send_confirmation_request_mail', array( 'id' => $id'initStatus' => $zeroStatus )); }
  513.         // Si han confirmado se debe notificar a Salvador y a Rafa, no para que confirmen sino para que esten informados
  514.         if ($reserva->getStatus() == 'Confirmed'){ return $this->redirectToRoute('reservations_greenpatio_send_confirmation_request_mail', array( 'id' => $id'initStatus' => $zeroStatus  )); }
  515.         // Sincronización con HT
  516.         if (!empty($reserva)) {
  517.             // Rafa indico que siempre se sincronice al abrir un expediente de GP
  518.             if (in_array($reserva->getStatus(), [null'''Confirmed''Invoiced''Iniciado''Cotizado''Bloqueo'])) {
  519.                 if ($reserva->getCateringName() == 'HIGO & TRIGO, S.L.') {
  520.                     // Si no se ha creado aun el expediente de HT debemos crearlo
  521.                     $htFile $em->getRepository(HtFile::class)->findByReservation($reserva);
  522.                     if (empty($htFile)) {
  523.                         return $this->redirectToRoute('sinc_gp_ht', array('id' => $id,));
  524.                     }
  525.                 }
  526.             }
  527.         }
  528.         // Sincronización con Av Express
  529.         $cotizable $this->laReservaEsCotizable($reserva->getId());
  530.         if ($cotizable) {
  531.             // Rafa indico que siempre se sincronice al abrir un expediente de GP
  532.             if (in_array($reserva->getStatus(), [null'''Confirmed''Invoiced''Iniciado''Cotizado''Bloqueo'])) {
  533.                 $AveFile $em->getRepository(AveFiles::class)->findByReservation($reserva);
  534.                 if (empty($AveFile)) {
  535.                     // Si no se ha creado aun el expediente de Av Express debemos crearlo
  536.                     return $this->redirectToRoute('sinc_gp_ave', array('id' => $id,));
  537.                 }
  538.             }
  539.         }
  540.         return $this->redirectToRoute('reservations_greenpatio_edit_simple', array( 'id' => $id'token' => null ));
  541.     }
  542.     /**
  543.      * @Route("/events", name="get_reservations")
  544.      */
  545.     public function reservationSelectAction(Request $request)
  546.     {
  547.         $em $this->getDoctrine()->getManager();
  548.         $fechaInicio = new \DateTime('first day of January last year');
  549.         $qb $em->getRepository(ReservationLoungeSimple::class)->createQueryBuilder('r');
  550.         $reservation $qb->where('r.dateStart >= :fechaInicio')
  551.             ->andWhere('r.idLounge < :idLounge')
  552.             ->setParameter('fechaInicio'$fechaInicio)
  553.             ->setParameter('idLounge'22)
  554.             ->getQuery()
  555.             ->getResult();
  556.         $qb $em->getRepository(ReservationVisit::class)->createQueryBuilder('v');
  557.         $visitas $qb->where('v.dateStart >= :fechaInicio')
  558.                     ->andWhere('v.idLounge = 0')
  559.                     ->setParameter('fechaInicio'$fechaInicio)
  560.                     ->getQuery()
  561.                     ->getResult();
  562.         $arrayFechaVisitas = [];
  563.         //Se agrupan las visitas por fechas
  564.         foreach ($visitas as $item) { $arrayFechaVisitas[$item->getDateStart()->format('Y-m-d')][] = $item; }
  565.         $newArrayVisitas = [];
  566.         //Se agrupan las visitas por agente
  567.         foreach ($arrayFechaVisitas as $fecha) {
  568.             foreach ($fecha as $item) {
  569.                 //Se van concatenando los titulos de las visitas en una sola
  570.                 $loungeNameTemp '';
  571.                 $pos strripos($item->getLoungeName(), "Visita");
  572.                 if ($pos !== false) { $prefijo substr($item->getLoungeName(), $pos); }        // Rafa pidio colocar el nombre del agente por delante
  573.                 $item->setLoungeName($loungeNameTemp $item->getDateStart()->format('H:i') . ' ' $prefijo ' ' $item->getLoungeName() . '<br>');
  574.                 $newArrayVisitas[$item->getDateStart()->format('Y-m-d') . '-' $item->getAgentId()] = $item;
  575.             }
  576.         }
  577.         $visitas $newArrayVisitas;
  578.         $xArray = [];
  579.         foreach ($arrayFechaVisitas as $elem) { foreach ($elem as $item) { $xArray[] = $item; } }
  580.         foreach ($xArray as $item) { array_push($reservation$item); }
  581.         $datos = [];
  582.         $datosMontaje = [];
  583.         $datosDesMontaje = [];
  584.         if (!empty($reservation)) {
  585.             foreach ($reservation as $reservaSala) {
  586.                 $loungeDetailsName $xLounge $xLoungeName '';
  587.                 if (!empty($reservaSala->getIdReservation())) {
  588.                     $reserva $em->getRepository(Reservation::class)->findOneById($reservaSala->getIdReservation());
  589.                     if ($reservaSala->getType() == 'Visit') {
  590.                         // Estamos con una visita
  591.                         $reserva->setStatus('Visit');
  592.                         $xLounge $em->getRepository(ReservationLoungeDetails::class)->findOneById($reservaSala->getIdLoungeDetails());
  593.                         $xLounge = empty($xLounge) ? '' $xLounge->getName();
  594.                         $xLoungeName $xLounge;
  595.                         $xLounge str_replace('<br>',' '$xLounge,$reservaSala->getLoungeName());
  596.                         $reserva->setTitle($reservaSala->getLoungeName());
  597.                         $reservaSala->setLoungeName($xLounge);
  598.                         if (!empty($reservaSala->getIdLoungeDetails())){
  599.                             $loungeDetailsName =  $em->getRepository(ReservationLoungeDetails::class)->findOneById($reservaSala->getIdLoungeDetails());
  600.                             $loungeDetailsName = (empty($loungeDetailsName)) ? '' $loungeDetailsName->getName();
  601.                         }
  602.                     }
  603.                 }
  604.                 if ($reservaSala->getDateStart()->format('d') == $reservaSala->getDateEnd()->format('d')) {
  605.                     $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()  .' '$xLoungeName;
  606.                 } else {
  607.                     $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()  .' '$xLoungeName;
  608.                 }
  609.                 if ($reserva->getStatus() == 'Visit'){ $tooltip null; }
  610.                 $logicoVisita false;
  611.                 if (!is_null($reserva->getStatus())) {
  612.                     switch ($reserva->getStatus()) {
  613.                         case 'Bloqueo'//naranja
  614.                             $color "#ffaa00";
  615.                             break;
  616.                         case 'Confirmed'//verde
  617.                             $color "#13ad27";
  618.                             break;
  619.                         case 'Invoiced'//verde
  620.                             $color "#13ad27";
  621.                             break;
  622.                         case 'Deleted'//rojo
  623.                             $color "#ff0000";
  624.                             break;
  625.                         case 'Cotizado'//Rojo claro
  626.                             $color "#faafc3";
  627.                             break;
  628.                         case 'Reservado'//verde, se ha adelantado un pago parcial
  629.                             $color "#13ad27";
  630.                             break;
  631.                         case 'Visit':
  632.                             $logicoVisita true;
  633.                             switch ($reservaSala->getAgentId()) {
  634.                                 case 77$color "#22cbf5"; break;
  635.                                 case 82$color "#f5229a"; break;
  636.                                 case 120$color "#157cc2"; break;
  637.                                 default:
  638.                                     $xAgent $em->getRepository(User::class)->findOneById($reservaSala->getAgentId());
  639.                                     $color = (empty($xAgent)) ? '' : (empty($xAgent->getColor()) ? '' $xAgent->getColor());
  640.                                     break;
  641.                             }
  642.                             break;
  643.                         default:
  644.                             $color "";
  645.                             break;
  646.                     }
  647.                     if (!empty($reservaSala->getType()) and !($reservaSala->getType() == 'Visit')) {
  648.                         //Es un montaje o desmontaje
  649.                         $color "#a5b8a2";
  650.                         // Si es un montaje o desmontaje pero esta cancelado debe prevalecer el color de cancelado
  651.                         if ($reserva->getStatus() == 'Deleted') {
  652.                             $color "#ff0000";
  653.                         }
  654.                         if (($reservaSala->getIdLounge() == 22) or  ($reservaSala->getIdLounge() == 23) or
  655.                         ($reservaSala->getIdLounge() == 24) or ($reservaSala->getIdLounge() == 25)){
  656.                             //Ajustamos el color a una sala de covarrubia
  657.                             switch ($color) {
  658.                                 case '#ffaa00'$color "#b873bf"; break; //naranja (bloqueo) => morado
  659.                                 case '#13ad27'$color "#017362"; break; //verde (Confirmed) => verde olivo
  660.                                 case '#ff0000'$color "#ff0000"; break; //rojo
  661.                                 case '#faafc3'$color "#faafc3"; break; //Rojo claro
  662.                                 default: break; //no modificar el color
  663.                             }
  664.                         }
  665.                     }
  666.                 }
  667.                 $pago1 "";
  668.                 $pago2 "";
  669.                 $ht "";
  670.                 if (!($reserva->getStatus() == 'Visit')) {
  671.                     $paymentsAll $em->getRepository(ReservationPaymentsClient::class)->findOneByReservationId($reserva->getId());
  672.                 } else {
  673.                     $paymentsAll null;
  674.                 }
  675.                 if (!empty($paymentsAll)) {
  676.                     $pago2 "<i class='icon-coin-euro' style='color: #000 !important;'></i>";      //Hay pagos parciales
  677.                 }
  678.                 if (!($reserva->getStatus() == 'Visit')) {
  679.                     $facturas $em->getRepository(ReservationInvoice::class)->findByReservationId($reserva->getId());
  680.                 }
  681.                 if (!empty($facturas)) {
  682.                     foreach ($facturas as $factura) {
  683.                         if ($factura->getMaster() == "master") {
  684.                             $pago1 "<i class='icon-thumbs-up3' style='color: #000 !important;'></i>";// Se ha pagado la totalidad
  685.                         }
  686.                         if ($factura->getMaster() != "master") {
  687.                             $pago2 "<i class='icon-coin-euro' style='color: #000 !important;'></i>";      //Hay pagos parciales
  688.                         }
  689.                     }
  690.                 }
  691.                 if ($reserva->getCateringName() == 'HIGO & TRIGO, S.L.') {
  692.                     $ht "<a style='color: #000 !important;'><strong>H&T</strong></a>";      // Es una reserva con servicio de Catering Higo & Trigo
  693.                 }
  694.                 // Pagos parciales y totales
  695.                 if (!empty($reserva)) {
  696.                     if (!$logicoVisita) {
  697.                         $datos[] = array(
  698. //                            "title" => $reservaSala->getDateStart()->format('H:i') . ' ' . $pago2 . $pago1 . $ht . ' ' . $reservaSala->getType() . '<br>' . $reservaSala->getLoungeName() . '<br>' . '<br>' . $reserva->getTitle(),
  699.                             "title" => $reservaSala->getDateStart()->format('H:i') . ' ' $pago2 $pago1 $ht ' ' $reservaSala->getType() .' '$reservaSala->getLoungeName() . '<br>' $reserva->getTitle(),
  700.                             "titleOne" => $reservaSala->getDateStart()->format('H:i') . ' ' $pago2 $pago1 $ht ' ' $reservaSala->getType(),
  701.                             "titleTwo" => $reservaSala->getLoungeName(),
  702.                             "titleThree" => '' '<br>' $reserva->getTitle(),
  703.                             "type" => $reservaSala->getType(),
  704.                             "id" => $reserva->getId(),
  705.                             "tooltip" => $tooltip,
  706.                             "start" => $reservaSala->getDateStart(),
  707.                             "end" => $reservaSala->getDateEnd(),
  708.                             "color" => $color,
  709.                             "loungeId" => $reservaSala->getIdLounge(),
  710.                             "url" => "/reservations-greenpatio/edit/" $reserva->getId(),
  711.                             "status" => $reserva->getStatus(),
  712.                         );
  713.                     } else {
  714.                         // Es una visita
  715.                         $datos[] = array(
  716.                             "title" => $reservaSala->getLoungeName(),
  717.                             "titleOne" => $reservaSala->getDateStart()->format('H:i') . ' ' ' ' $reservaSala->getType() . '<br>',
  718.                             "titleTwo" => (!empty($xLounge)) ? $xLounge $reservaSala->getLoungeName(),
  719.                             "titleThree" => '' '<br>' '<br>' $reserva->getTitle(),
  720.                             "type" => $reservaSala->getType(),
  721.                             "id" => $reservaSala->getId() . 'V',
  722.                             "tooltip" => $tooltip,
  723.                             "start" => $reservaSala->getDateStart(),
  724.                             "end" => $reservaSala->getDateEnd(),
  725.                             "color" => $color,
  726.                             "loungeId" => $reservaSala->getIdLounge(),
  727.                             "url" => '/reservations-greenpatio/addvisit',
  728.                             "status" => $reserva->getStatus(),
  729.                             "agentId" => $reservaSala->getAgentId(),
  730.                         );
  731.                     }
  732.                 } else {
  733.                     $datos = [];
  734.                 }
  735.             }
  736.         }
  737.         $newDatos = array();
  738.         // INICIO: Se unen las salas en una sola reserva por ID de reserva
  739.         foreach ($datos as $dato) {
  740.             // Inicializamos el arreglo para crear los indices
  741.             switch ($dato['color']){
  742.                 case '#a5b8a2': if ($dato['type'] == 'Montaje'){ $newDatos[$dato['id'].'M'] = null; } else { $newDatos[$dato['id'].'D'] = null; } break;      //Montaje o Desmontaje
  743.                 default: $newDatos[$dato['id']] = null; break;      //Dia de reserva o Visita (la visita ya viene con su indice #V )
  744.             }
  745.         }
  746.         foreach ($datos as $dato) {
  747.             switch ($dato['color']){
  748.                                             //Montaje o Desmontaje
  749.                 case '#a5b8a2':
  750.                     if ($dato['type'] == "Montaje") {
  751.                         if (!empty($newDatos[$dato['id'] . 'M'])) {
  752. //                            if ($newDatos[$dato['id'] . 'M']['start'] > $dato['start']) { $newDatos[$dato['id'] . 'M']['start'] = $dato['start']; }
  753. //                            if ($newDatos[$dato['id'] . 'M']['end'] < $dato['end']) { $newDatos[$dato['id'] . 'M']['end'] = $dato['end']; }
  754.                             // 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)
  755.                             if ($newDatos[$dato['id'] . 'M']['loungeId'] == $dato['loungeId']) {
  756.                                 if ($newDatos[$dato['id'] . 'M']['start'] > $dato['start']) { $newDatos[$dato['id'] . 'M']['start'] = $dato['start']; }
  757.                                 if ($newDatos[$dato['id'] . 'M']['end'] < $dato['end']) { $newDatos[$dato['id'] . 'M']['end'] = $dato['end']; }
  758.                             } else {
  759.                                 if (array_key_exists($dato['id'] . 'M'.$dato['loungeId'],$newDatos)){
  760.                                     if ($newDatos[$dato['id'] . 'M'.$dato['loungeId']]['start'] > $dato['start']) { $newDatos[$dato['id'] . 'M'.$dato['loungeId']]['start'] = $dato['start']; }
  761.                                     if ($newDatos[$dato['id'] . 'M'.$dato['loungeId']]['end'] < $dato['end']) { $newDatos[$dato['id'] . 'M'.$dato['loungeId']]['end'] = $dato['end']; }
  762.                                 } else {
  763.                                     $newDatos[$dato['id'] . 'M'.$dato['loungeId']] = $dato;
  764.                                 }
  765.                             }
  766.                         } else {
  767.                             $newDatos[$dato['id'] . 'M'] = $dato;
  768.                         }
  769.                     } else {
  770.                         if ($dato['type'] == "Desmontaje") {
  771.                             if (!empty($newDatos[$dato['id'] . 'D'])) {
  772.                                 // El Desmontaje esta ocupando mas de 1 dia, se deben unir los dias de desmontaje
  773.                                 if ($newDatos[$dato['id'] . 'D']['start'] > $dato['start']) { $newDatos[$dato['id'] . 'D']['start'] = $dato['start']; }
  774.                                 if ($newDatos[$dato['id'] . 'D']['end'] < $dato['end']) { $newDatos[$dato['id'] . 'D']['end'] = $dato['end']; }
  775.                             } else {
  776.                                 $newDatos[$dato['id'] . 'D'] = $dato;
  777.                             }
  778.                         }
  779.                     }
  780.                     break;
  781.                                             //Visita Almudena (id user 77)
  782.                 case '#22cbf5':
  783.                     if ($dato['type'] == "Visit") {
  784.                         $newDatos[$dato['start']->format('Ymd').'V77'.$dato['id']] = $dato;
  785.                         if (!empty($newDatos[$dato['start']->format('Ymd').'V77'])) {
  786.                             // Hay varias visitas ese mismo dia para el agente
  787. //                            $newDatos[$dato['start']->format('Ymd').'V77']['tooltip'] = $newDatos[$dato['start']->format('Ymd').'V77']['tooltip'] . $dato['tooltip'];
  788.                         } else {
  789. //                            $newDatos[$dato['start']->format('Ymd').'V77'] = $dato;
  790.                         }
  791.                     }
  792.                     break;
  793.                                             //Visita Gabriela (id user 82)
  794.                 case '#f5229a':
  795.                     if ($dato['type'] == "Visit") {
  796.                         $newDatos[$dato['start']->format('Ymd').'V82'.$dato['id']] = $dato;
  797.                         if (!empty($newDatos[$dato['start']->format('Ymd').'V82'])) {
  798.                             // Hay varias visitas ese mismo dia para el agente
  799. //                            $newDatos[$dato['start']->format('Ymd').'V82']['tooltip'] = $newDatos[$dato['start']->format('Ymd').'V82']['tooltip'] . $dato['tooltip'];
  800.                         } else {
  801. //                            $newDatos[$dato['start']->format('Ymd').'V82'] = $dato;
  802.                         }
  803.                     }
  804.                     break;
  805.                 //Visita María (id user 120)
  806.                 case '#157cc2':
  807.                     if ($dato['type'] == "Visit") {
  808.                         $newDatos[$dato['start']->format('Ymd').'V120'.$dato['id']] = $dato;
  809.                         if (!empty($newDatos[$dato['start']->format('Ymd').'V120'])) {
  810.                             // Hay varias visitas ese mismo dia para el agente
  811. //                            $newDatos[$dato['start']->format('Ymd').'V120']['tooltip'] = $newDatos[$dato['start']->format('Ymd').'V120']['tooltip'] . $dato['tooltip'];
  812.                         } else {
  813. //                            $newDatos[$dato['start']->format('Ymd').'V120'] = $dato;
  814.                         }
  815.                     }
  816.                     break;
  817.                                             //Reserva color naranja Bloqueo
  818.                 case '#ffaa00':
  819.                     if (empty($newDatos[$dato['id']])){
  820.                         $newDatos[$dato['id']] = $dato;
  821.                     } else {
  822.                         // Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
  823.                         if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
  824.                         if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
  825.                         $newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' $dato['tooltip'];
  826.                         // Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
  827.                         if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
  828.                             // No se encontro la cadena, debemos agregar
  829.                             $newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' .'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'$dato['titleTwo'];
  830.                             $newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
  831.                         }
  832.                     }
  833.                     break;
  834.                                             //Reserva color Rojo claro Cotizado
  835.                 case '#faafc3':
  836.                     if (empty($newDatos[$dato['id']])){
  837.                         $newDatos[$dato['id']] = $dato;
  838.                     } else {
  839.                         // Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
  840.                         if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
  841.                         if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
  842.                         $newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' $dato['tooltip'];
  843.                         // Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
  844.                         if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
  845.                             // No se encontro la cadena, debemos agregar
  846.                             $newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' .'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'$dato['titleTwo'];
  847.                             $newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
  848.                         }
  849.                     }
  850.                     break;
  851.                                             //Reserva color Rojo Reserva Cancelada
  852.                 case '#ff0000':
  853.                                             //Las canceladas no se muestran en el calendario
  854.                     break;
  855.                                             //Reserva color Verde Reserva Confirmada, Facturada, (se ha adelantado un pago parcial)
  856.                 case '#13ad27':
  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.                 
  873.                 //Reserva color Verde Reserva Confirmada, Facturada, (Covarrubias)
  874.                 case '#017362':
  875.                     if ($newDatos[$dato['id']]['end'] < $dato['end']) {
  876.                         if (empty($newDatos[$dato['id']])){
  877.                                 $newDatos[$dato['id']]['end'] = $dato['end'];
  878.                             $newDatos[$dato['id']] = $dato;
  879.                         } else {
  880.                             // Se verifican la actualizacion de incio y fin, para tener el menor inicio y el mayor fin
  881.                             if ($newDatos[$dato['id']]['start'] > $dato['start']) { $newDatos[$dato['id']]['start'] = $dato['start']; }
  882.                             if ($newDatos[$dato['id']]['end'] < $dato['end']) { $newDatos[$dato['id']]['end'] = $dato['end']; }
  883.                             $newDatos[$dato['id']]['tooltip'] = $newDatos[$dato['id']]['tooltip'] . ' | ' $dato['tooltip'];
  884.                             // Verificamos si la sala ya ha sido previamente agregada a la lista de salas para no repetirla
  885.                             if (strpos($newDatos[$dato['id']]['title'], $dato['titleTwo']) === false) {
  886.                                 // No se encontro la cadena, debemos agregar
  887.                                 $newDatos[$dato['id']]['titleTwo'] = $newDatos[$dato['id']]['titleTwo'] . '<br>' '&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'$dato['titleTwo'];
  888.                                 $newDatos[$dato['id']]['title'] = $newDatos[$dato['id']]['titleOne'] . $newDatos[$dato['id']]['titleTwo'] . $newDatos[$dato['id']]['titleThree'];
  889.                             }
  890.                         }
  891.                     }
  892.                 break;
  893.                                             //Se pondra color a negro para resaltar este cualquier caso que no haya sido considerado (status Pendiente)
  894.                 default:
  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.                     // Se pone en color negro para resaltar este caso que no esta entrando en ninguno de los casos anteriores
  910.                     $newDatos[$dato['id']]['color'] = '#000000';
  911.                     if ($dato['type'] == "Visit") {
  912.                         // Si no es una de los agentes regulares (Gaby, Angie, Cristina) se busca el color del usuario configurado en el perfil
  913.                         $elAgente $em->getRepository(User::class)->findOneById($dato['agentId']);
  914.                         $elAgenteColor = !empty($elAgente) ? $elAgente->getColor() : null;
  915.                         if (!empty($elAgenteColor)){ $newDatos[$dato['id']]['color'] = $elAgenteColor; }
  916.                     }
  917.                     break;
  918.             }
  919.         }
  920.         $datos0 = array();
  921.         foreach ($newDatos as $key => $item) {
  922.             if (!empty($item['id'])) {
  923.                 $datos0[$key] = array('title' => $item['title'],
  924.                     'titleOne' => $item['titleOne'],
  925.                     'titleTwo' => $item['titleTwo'],
  926.                     'titleThree' => $item['titleThree'],
  927.                     'type' => $item['type'],
  928.                     'id' => $item['id'],
  929.                     'tooltip' => $item['tooltip'],
  930.                     'start' => $item['start'],
  931.                     'end' => $item['end'],
  932.                     'color' => $item['color'],
  933.                     'loungeId' => $item['loungeId'],
  934.                     'url' => $item['url']);
  935.             }
  936.         }
  937.         $newDatos $datos0;
  938.         $datos = [];
  939.         foreach ($newDatos as $item) {
  940.             if ($item['color'] != '#ff0000') {
  941.                 // No se agregan al calendario los elementos eliminados oelementos vacios
  942.                 if (!empty($item)) {
  943.                     //INICIO: Verificamos por huecos dentro de la reserva
  944.                     if (empty($item['type'])) {
  945.                         // solo las reservas se van a verificar en este if
  946.                         if ((date_diff($item['start'], $item['end'])->d) > 1) {    //el evento tiene mas de 2 dias, puede haber huecos
  947.                             $resSimples $em->getRepository(ReservationLoungeSimple::class)->findByIdReservation($item['id']);
  948.                             $period = new DatePeriod(
  949.                                 $item['start'],
  950.                                 new DateInterval('P1D'),
  951.                                 $item['end']
  952.                             );
  953.                             $arrayPeriod = [];
  954.                             foreach ($period as $key => $value) { $arrayPeriod[] = $value; }
  955.                             $logAllDiasEnReserva false;
  956.                             $logDiaEnReserva false;
  957.                             //Verificamos que cada dia tenga su reserva de sala para que no haya hueco
  958.                             foreach ($arrayPeriod as $day) {
  959.                                 foreach ($resSimples as $resSimple) {
  960.                                     if ($resSimple->getDateStart()->format('Y-m-d') == $day->format('Y-m-d')) {
  961.                                         $logDiaEnReserva true;
  962.                                         break;
  963.                                     }
  964.                                 }
  965.                                 if (!$logDiaEnReserva) {
  966.                                     //Un dia no se encontraba, hay un hueco
  967.                                     foreach ($resSimples as $resDayToAdd) {
  968.                                         if (empty($resDayToAdd->getType())) {       // Solo se deben agregar salsa los montajes y desmontajes aqui no van
  969.                                             $item['start'] = $resDayToAdd->getDateStart();
  970.                                             $item['end'] = $resDayToAdd->getDateEnd();
  971.                                             $br '<br>';
  972.                                             $br strpos($item['title'], $br);
  973.                                             $tempText substr($item['title'], $br 4);
  974.                                             $item['title'] = $resDayToAdd->getDateStart()->format('H:i') . ' ' '<br>' $tempText;
  975.                                             $datos[] = $item;
  976.                                         }
  977.                                     }
  978.                                     break;
  979.                                 } else {
  980.                                     //Se debe evaluar el siguiente dia
  981.                                     $logDiaEnReserva false;
  982.                                     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
  983.                                         $logAllDiasEnReserva true;
  984.                                     }
  985.                                 }
  986.                             }
  987.                             if ($logAllDiasEnReserva) {
  988.                                 $datos[] = $item;
  989.                             }
  990.                         } else {
  991.                             // El evento es de 1 o 2 dias, no hay posibilidad de hueco
  992.                             $datos[] = $item;
  993.                         }
  994.                     } else {
  995.                         //Es Visita Las visitas son las unicas entradas que no tienen hueco
  996.                         if ($item['type'] == 'Visit'){
  997.                             $datos[] = $item;
  998.                         } else {
  999.                             // es montaje o desmontaje, se va verificar por huecos
  1000.                             if ((date_diff($item['start'], $item['end'])->d) > 1) {    //el item tiene mas de 2 dias, puede haber huecos
  1001.                                 $parameters = array( 'id' => $item['id'], 'type' => $item['type'], );
  1002.                                 $dql 'SELECT i
  1003.                                         FROM GreenPatioBundle:ReservationLoungeSimple i
  1004.                                         WHERE  i.idReservation = :id
  1005.                                           and i.type = :type';
  1006.                                 $query $em->createQuery($dql)->setParameters($parameters);
  1007.                                 $resSimples $query->getResult();
  1008.                                 $period = new DatePeriod(
  1009.                                     $item['start'],
  1010.                                     new DateInterval('P1D'),
  1011.                                     $item['end']
  1012.                                 );
  1013.                                 $arrayPeriod = [];
  1014.                                 foreach ($period as $key => $value) { $arrayPeriod[] = $value; }
  1015.                                 $logAllDiasEnReserva false;
  1016.                                 $logDiaEnReserva false;
  1017.                                 //Verificamos que cada dia tenga su reserva de sala para que no haya hueco
  1018.                                 foreach ($arrayPeriod as $day) {
  1019.                                     foreach ($resSimples as $resSimple) {
  1020.                                         if ($resSimple->getDateStart()->format('Y-m-d') == $day->format('Y-m-d')) {
  1021.                                             $logDiaEnReserva true;
  1022.                                             break;
  1023.                                         }
  1024.                                     }
  1025.                                     if (!$logDiaEnReserva) {
  1026.                                         //Un dia no se encontraba, hay un hueco
  1027.                                         foreach ($resSimples as $resDayToAdd) {
  1028.                                             if (!empty($resDayToAdd->getType())) {       // Solo se deben agregar montajes y desmontajes aqui
  1029.                                                 $item['start'] = $resDayToAdd->getDateStart();
  1030.                                                 $item['end'] = $resDayToAdd->getDateEnd();
  1031.                                                 $br '<br>';
  1032.                                                 $br strpos($item['title'], $br);
  1033.                                                 $tempText substr($item['title'], $br 4);
  1034.                                                 $item['title'] = $resDayToAdd->getDateStart()->format('H:i') . ' ' '<br>' $tempText;
  1035.                                                 $datos[] = $item;
  1036.                                             }
  1037.                                         }
  1038.                                         break;
  1039.                                     } else {
  1040.                                         //Se debe evaluar el siguiente dia
  1041.                                         $logDiaEnReserva false;
  1042.                                         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
  1043.                                             $logAllDiasEnReserva true;
  1044.                                         }
  1045.                                     }
  1046.                                 }
  1047.                                 if ($logAllDiasEnReserva) { $datos[] = $item; }
  1048.                             } else {
  1049.                                 // El montaje o desmontaje es de 1 o 2 dias, no hay posibilidad de hueco
  1050.                                 $datos[] = $item;
  1051.                             }
  1052.                         }
  1053.                     }
  1054.                     //FIN: Verificamos por huecos dentro de la reserva
  1055.                 }
  1056.             }
  1057.         }
  1058.         $return = array( 'reservation' => $datos, );
  1059.         $response = new JsonResponse($return);
  1060.         return $response;
  1061.     }
  1062.     /**
  1063.      * @Route("/delete/{id}", name="reservations_delete")
  1064.      */
  1065.     public function deleteAction($idEntityManagerInterface $emRequest $request)
  1066.     {
  1067.         $reserva $em->getRepository(Reservation::class)->findOneById($id);
  1068.         $hoy = new \DateTime("now"NULL);
  1069.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  1070.         $user_id $user_logueado->getId();
  1071.         $reserva->setUpdatedBy($user_id);
  1072.         $reserva->setUpdatedAt($hoy);
  1073.         $reserva->setStatus('Deleted');
  1074.         try{
  1075.             $em->persist($reserva);
  1076.             $em->flush();
  1077.             $successMessage 'La reserva ha sido actualizada.';
  1078. //            $successMessage = $this->translator->trans($event);
  1079.             $this->addFlash('mensajereservation'$successMessage);
  1080.         } catch (\Exception $e){
  1081.             $event 'An error occurred: '.$e->getMessage();
  1082.             $errorMessage $this->translator->trans($event);
  1083.             $this->addFlash('mensajereservationerror'$errorMessage);
  1084.         }
  1085.         return $this->redirectToRoute('reservations_greenpatio_index');
  1086.     }
  1087.     /**
  1088.      * @Route("/listgpprices", name="reservations_greenpatio_prices")
  1089.      */
  1090.     public function indexPricesAction(EntityManagerInterface $emRequest $request) {
  1091.         $prices $em->getRepository(ReservationLoungeProfile::class)->findBy(
  1092.             array(),
  1093.             array('id' => 'ASC')
  1094.         );
  1095.         $data = [];
  1096.         foreach ($prices as $price){
  1097.             $periodSql $em->getRepository(ReservationPeriod::class)->findOneById($price->getPeriodId());
  1098.             $price->setPeriodId($periodSql->getName());
  1099.             $loungeTemp $em->getRepository(ReservationLoungeDetails::class)->findOneById($price->getLoungeId());
  1100.             if(!is_null($loungeTemp)){ $price->setLoungeId($loungeTemp->getName()); }
  1101.             $data[] = $price;
  1102.         }
  1103.         $reserv = new ReservationLoungeProfile();
  1104.         $form $this->createReservationLoungeProfileCreateForm($reserv);
  1105.         return $this->render('MDS/GreenPatioBundle/reservations/list-reservations-gp-prices.html.twig',
  1106.             array(
  1107.                 'groups' => null,
  1108.                 'prices' => $data,
  1109.                 'form' => $form->createView()
  1110.             )
  1111.         );
  1112.     }
  1113.     /**
  1114.      * @Route("/deletegpprice/{id}", name="reservations_price_delete")
  1115.      */
  1116.     public function deletePriceAction($idEntityManagerInterface $emRequest $request)
  1117.     {
  1118.         $price $em->getRepository(ReservationLoungeProfile::class)->findOneById($id);
  1119.         try{
  1120.             $em->remove($price);
  1121.             $em->flush();
  1122.             $event 'The Item has been Deleted.';
  1123.             $successMessage $this->translator->trans($event);
  1124.             $this->addFlash('mensajereservation'$successMessage);
  1125.         } catch (\Exception $e){
  1126.             $event 'An error occurred: '.$e->getMessage();
  1127.             /* Para el usuario */
  1128.             $errorMessage $this->translator->trans($event);
  1129.             $this->addFlash('mensajereservationerror'$errorMessage);
  1130.         }
  1131.         return $this->redirectToRoute('reservations_greenpatio_prices');
  1132.     }
  1133.     /**
  1134.      * @Route("/addgpprice/",  name="reservations_greenpatio_addgpprice")
  1135.      */
  1136.     public function addReservationGpPriceAction(EntityManagerInterface $emRequest $request)
  1137.     {
  1138.         $reserv = new ReservationLoungeProfile();
  1139.         $form $this->createReservationLoungeProfileCreateForm($reserv);
  1140.         $gpPrices $em->getRepository(ReservationLoungeProfile::class)->findAll();
  1141.         return $this->render('MDS/GreenPatioBundle/reservations/add-reservations-gp-price.html.twig', array('form' => $form->createView(), 'gpPrices' => $gpPrices ));
  1142.     }
  1143.     private function createReservationLoungeProfileCreateForm(ReservationLoungeProfile $entity)
  1144.     {
  1145.         $form $this->createForm(ReservationLoungeProfileType::class, $entity, array(
  1146.             'action' => $this->generateUrl('reservations_greenpatio_price_create'),
  1147.             'method' => 'POST'
  1148.         ));
  1149.         return $form;
  1150.     }
  1151.     /**
  1152.      * @Route("/creategpprice", name="reservations_greenpatio_price_create")
  1153.      */
  1154.     public function createGpPriceAction(EntityManagerInterface $emRequest $request){
  1155.         $reservaGpPrice = new ReservationLoungeProfile();
  1156.         $form $this->createReservationLoungeProfileCreateForm($reservaGpPrice);
  1157.         $form->handleRequest($request);
  1158.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  1159.         $user_id $user_logueado->getId();
  1160.         $hoy = new \DateTime("now"NULL);
  1161.         $reservaGpPrice->setCreatedAt($hoy);
  1162.         $reservaGpPrice->setCreatedId($user_id);
  1163.         $reservaGpPrice->setUpdatedAt($hoy);
  1164.         $reservaGpPrice->setUpdatedId($user_id);
  1165.         $periodSql $em->getRepository(ReservationPeriod::class)->findOneById($form->get('periodId')->getData());
  1166.         if (!empty($periodSql)){ $descTemp $periodSql->getName(); } else { $descTemp null; }
  1167.         $reservaGpPrice->setPeriodId($reservaGpPrice->getPeriodId()->getId());
  1168.         $reservaGpPrice->setLoungeId($reservaGpPrice->getLoungeId()->getId());
  1169.         if ((!is_null($reservaGpPrice->getLoungeId())) and (!is_null($descTemp))){
  1170.             $descriptionSql $em->getRepository(ReservationLoungeDetails::class)->findOneById($form->get('loungeId')->getData());
  1171.             $description $descriptionSql->getName().' - '.$descTemp;
  1172.             $reservaGpPrice->setDescription($description);
  1173.         } else {
  1174.             $reservaGpPrice->setDescription(null);
  1175.         }
  1176.         if($form->isValid())
  1177.         {
  1178.             try{
  1179.                 $em->persist($reservaGpPrice);
  1180.                 $em->flush();
  1181.                 $event 'The Item Price has been created.';
  1182.                 $successMessage $this->translator->trans($event);
  1183.                 $this->addFlash('mensajereservation'$successMessage);
  1184.             } catch (\Exception $e){
  1185.                 $event 'An error occurred: '.$e->getMessage();
  1186.                 $errorMessage $this->translator->trans($event);
  1187.                 $this->addFlash('mensajereservationerror'$errorMessage);
  1188.             }
  1189.         } else {
  1190.             $errorMessage $this->translator->trans('Error, some fields are empty');
  1191.             $this->addFlash('mensajereservationerror'$errorMessage);
  1192.         }
  1193.         return $this->redirectToRoute('reservations_greenpatio_prices');
  1194.     }
  1195.     /**
  1196.      * @Route("/getReservationLoungeProfile", name="get_reservation_lounge_profile")
  1197.      */
  1198.     public function getReservationLoungeProfileAction(EntityManagerInterface $emRequest $request) {
  1199.         $codProfile $_POST['idprofile'];
  1200.         $salasPorPerfil $em->getRepository(ReservationLoungeProfile::class)->findBy( array( 'periodId' => $codProfile ) );
  1201.         $datos = [];
  1202.         if (!empty($salasPorPerfil)){
  1203.             foreach($salasPorPerfil as $sala){
  1204.                 $datos[] = array(
  1205.                     "id" => $sala->getId(),
  1206.                     "idlounge" => $sala->getLoungeId(),
  1207.                     "nameDescription" => $sala->getDescription(),
  1208.                     "price" => $sala->getPrice(),
  1209.                 );
  1210.             }
  1211.         }
  1212.         $return = array( 'salasPerfil' => $datos'id' => $codProfile, );
  1213.         $response = new JsonResponse($return);
  1214.         return $response;
  1215.     }
  1216.     /**
  1217.      * @Route("/getReservationPeriod", name="get_reservation_Period")
  1218.      */
  1219.     public function getReservationPeriodAction(EntityManagerInterface $emRequest $request) {
  1220.         $id $_POST['id'];
  1221.         $period $em->getRepository(ReservationPeriod::class)->findOneById($id);
  1222.         $datos = array();
  1223.         if (!empty($period)){
  1224.             $datos = array(
  1225.                 "id" => $period->getId(),
  1226.                 "hourStart" => is_null($period->getHourStart())?"":$period->getHourStart()->format('H:i'),
  1227.                 "hourEnd" => is_null($period->getHourEnd())?"":$period->getHourEnd()->format('H:i'),
  1228.             );
  1229.         }
  1230.         $return $datos;
  1231.         $response = new JsonResponse($return);
  1232.         return $response;
  1233.     }
  1234.     /**
  1235.      * @Route("/getReservationLoungePrice", name="get_reservation_lounge_price")
  1236.      */
  1237.     public function getReservationLoungePriceAction(EntityManagerInterface $emRequest $request) {
  1238.         $id $_POST['id'];
  1239.         $precio $em->getRepository(ReservationLoungeProfile::class)->findOneById($id);
  1240.         $datos = array();
  1241.         if (!empty($precio)){ $datos = array( "id" => $precio->getId(), "price" => $precio->getPrice() ); }
  1242.         $return $datos;
  1243.         $response = new JsonResponse($return);
  1244.         return $response;
  1245.     }
  1246.     /**
  1247.      * @Route("/addloungedetails/",  name="reservations_greenpatio_addloungedetails")
  1248.      */
  1249.     public function addReservationLoungeDetailsActionRequest $request)
  1250.     {
  1251.         $lounge = new ReservationLoungeDetails();
  1252.         $form $this->createReservationLoungeDetailsCreateForm($lounge);
  1253.         return $this->render('MDS/GreenPatioBundle/reservations/add-reservations-lounge-details.html.twig', array('form' => $form->createView() ));
  1254.     }
  1255.     private function createReservationLoungeDetailsCreateForm(ReservationLoungeDetails $entity)
  1256.     {
  1257.         $form $this->createForm(ReservationLoungeDetailsType::class, $entity, array(
  1258.             'action' => $this->generateUrl('reservations_greenpatio_lounge_details_create'),
  1259.             'method' => 'POST'
  1260.         ));
  1261.         return $form;
  1262.     }
  1263.     /**
  1264.      * @Route("/createloungedetails", name="reservations_greenpatio_lounge_details_create")
  1265.      */
  1266.     public function createLoungeDetailsAction(EntityManagerInterface $emRequest $request)
  1267.     {
  1268.         $lounge = new ReservationLoungeDetails();
  1269.         $form $this->createReservationLoungeDetailsCreateForm($lounge);
  1270.         $form->handleRequest($request);
  1271.         /* Obtengo usuario logueado */
  1272.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  1273.         $user_id $user_logueado->getId();
  1274.         $hoy = new \DateTime("now"NULL);
  1275.         $lounge->setCreatedAt($hoy);
  1276.         $lounge->setCreatedId($user_id);
  1277.         $lounge->setUpdatedAt($hoy);
  1278.         $lounge->setUpdatedId($user_id);
  1279.         if($form->isValid()){
  1280.             try{
  1281.                 $em->persist($lounge);
  1282.                 $em->flush();
  1283.                 $event 'The Lounge has been created.';
  1284.                 $successMessage $this->translator->trans($event);
  1285.                 $this->addFlash('mensajereservation'$successMessage);
  1286.                 $this->reordenarSalas($lounge->getRankLounge(), $lounge->getId());
  1287.             } catch (\Exception $e){
  1288.                 $event 'An error occurred: '.$e->getMessage();
  1289.                 /* Para el usuario */
  1290.                 $errorMessage $this->translator->trans($event);
  1291.                 $this->addFlash('mensajereservationerror'$errorMessage);
  1292.             }
  1293.         } else {
  1294.             $errorMessage $this->translator->trans('Error, some fields are empty');
  1295.             $this->addFlash('mensajereservationerror'$errorMessage);
  1296.         }
  1297.         return $this->redirectToRoute('reservations_greenpatio_list_lounges');
  1298.     }
  1299.     /**
  1300.      * @Route("/listloungedetails", name="reservations_greenpatio_list_lounges")
  1301.      */
  1302.     public function indexLoungesAction(EntityManagerInterface $emRequest $request) {
  1303.         $salas $em->getRepository(ReservationLoungeDetails::class)->findAll();
  1304.         $lounge = new ReservationLoungeDetails();
  1305.         $form $this->createReservationLoungeDetailsCreateForm($lounge);
  1306.         return $this->render('MDS/GreenPatioBundle/reservations/list-reservations-lounges-details.html.twig',
  1307.             array(
  1308.                 'groups' => null,
  1309.                 'salas' => $salas,
  1310.                 'form' => $form->createView()
  1311.             )
  1312.         );
  1313.     }
  1314.     /**
  1315.      * @Route("/editloungedetails/{id}", name="reservations_lounge_details")
  1316.      */
  1317.     public function editLoungeDetailsAction($idEntityManagerInterface $emRequest $request)
  1318.     {
  1319.         $lounge $em->getRepository(ReservationLoungeDetails::class)->findOneById($id);
  1320.         
  1321.         $loungeContracts $em->getRepository(DocContractModel::class)->findBy(array('companyId' => 7'modelId' => $id));
  1322.         $contractsByLanguage = [];
  1323.         foreach ($loungeContracts as $contract) {
  1324.             $contractsByLanguage[$contract->getLanguage()] = $contract;
  1325.         }
  1326.         $loungePictures $em->getRepository(ReservationLoungePicture::class)->findBy( array('loungeId' => $id'title' => null,));
  1327.         $loungeVideos $em->getRepository(ReservationLoungeVideo::class)->findByLoungeId($id);
  1328.         $loungeDescriptions $em->getRepository(ReservationLoungeDescription::class)->findByLoungeId($id);
  1329.         $loungeWebDescriptions $em->getRepository(ReservationLoungeWebDescription::class)->findByLounge($lounge);
  1330.         $descriptionsByLanguage = [];
  1331.         foreach ($loungeWebDescriptions as $description) {
  1332.             $descriptionsByLanguage[$description->getLanguage()] = $description;
  1333.         }
  1334.         /* Obtengo usuario logueado */
  1335.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  1336.         $user_id $user_logueado->getId();
  1337.         /* Gestión de eventos en Log */
  1338.         $user_lastname $user_logueado->getLastname();
  1339.         $user_name $user_logueado->getName();
  1340.         $user_email $user_logueado->getEmail();
  1341.         $user_rol $user_logueado->getRoles();
  1342.         $event_url $request->getPathInfo();
  1343.         $event_complete $user_name.' '.$user_lastname.' - '.$user_email.' - '.$user_rol[0].' | '.$event_url;
  1344.         $hoy = new \DateTime("now"NULL);
  1345.         $form $this->createEditReservationLoungeDetailsForm($lounge$id);
  1346.         // Para evitar le duplicidad de idiomas en las descripciones
  1347.         $loungeDescriptionsPreexistentes $em->getRepository(ReservationLoungeDescription::class)->findByLoungeId($id);
  1348.         $idiomasPreexistentes = array();
  1349.         foreach ($loungeDescriptionsPreexistentes as $item){ $idiomasPreexistentes[] = $item->getLanguage(); }
  1350.         $datos_videos = array();
  1351.         foreach ($loungeVideos as $video){
  1352.             $urvideo_final '<iframe class="embed-responsive-item" src="'.$video->getVideo().'"></iframe>';
  1353.             $datos_videos[] = array(
  1354.                 'id' => $video->getId(),
  1355.                 'urlvideo' => $urvideo_final
  1356.             );
  1357.         }
  1358.         $blueprints $em->getRepository(ReservationLoungePicture::class)->findBy( array('loungeId' => $id'title' => 'Blueprint', ) );
  1359.         $pictTeatro $em->getRepository(ReservationLoungePicture::class)->findBy( array('loungeId' => $id'title' => 'Teatro', ) );
  1360.         if (sizeof($pictTeatro) == 0) {$pictTeatro null;}
  1361.         $pictCoctel $em->getRepository(ReservationLoungePicture::class)->findBy( array('loungeId' => $id'title' => 'Coctel', ) );
  1362.         if (sizeof($pictCoctel) == 0) {$pictCoctel null;}
  1363.         $pictEscuela $em->getRepository(ReservationLoungePicture::class)->findBy( array('loungeId' => $id'title' => 'Escuela', ) );
  1364.         if (sizeof($pictEscuela) == 0) {$pictEscuela null;}
  1365.         $picsMontaje = array (
  1366.             'pictTeatro' => $pictTeatro,
  1367.             'pictCoctel' => $pictCoctel,
  1368.             'pictEscuela' => $pictEscuela
  1369.         );
  1370.         if(empty($picsMontaje['pictTeatro']) and empty($picsMontaje['pictCoctel']) and empty($picsMontaje['pictEscuela'])){ $picsMontaje null; }
  1371.         $loungedimmensions $em->getRepository(ReservationLoungeDetails::class)->findOneById($id);
  1372.         return $this->render('MDS/GreenPatioBundle/reservations/edit-reservations-lounge-details.html.twig',
  1373.             array(
  1374.                 'id' => $id,
  1375.                 'hoy' => $hoy,
  1376.                 'lounge' => $lounge,
  1377.                 'loungeContracts' => $contractsByLanguage,
  1378.                 'descriptions' => $loungeDescriptions,
  1379.                 'loungeWebDesctiptions' => $descriptionsByLanguage,
  1380.                 'languagesWeb' => LanguageConstants::getAvailableLanguages(),
  1381.                 'pictures' => $loungePictures,
  1382.                 'blueprints' => $blueprints,
  1383.                 'picsMontaje' => $picsMontaje,
  1384.                 'loungedimmensions' => $loungedimmensions,
  1385.                 'videos' => $datos_videos,
  1386.                 'idiomasPreexistentes' => $idiomasPreexistentes,
  1387.                 'form' => $form->createView()
  1388.             ));
  1389.     }
  1390.     private function createEditReservationLoungeDetailsForm(ReservationLoungeDetails $entity$id)
  1391.     {
  1392.         $form $this->createForm(ReservationLoungeDetailsType::class, $entity,
  1393.             array(
  1394.                 'action' => $this->generateUrl('reservations_lounge_details_update',
  1395.                     array(
  1396.                         'id' => $id,
  1397.                         'price' => $entity
  1398.                     )
  1399.                 ), 'method' => 'PUT'));
  1400.         return $form;
  1401.     }
  1402.     /**
  1403.      * @Route("/updateloungedetails/{id}", name="reservations_lounge_details_update")
  1404.      */
  1405.     public function updateLoungeDetailsAction($idRequest $request)
  1406.     {
  1407.         $em $this->getDoctrine()->getManager();
  1408.         $lounge $em->getRepository(ReservationLoungeDetails::class)->findOneById($id);
  1409.         $lounge->setName($request->request->get('mds_greenpatiobundle_reservationloungedetails')['name']);
  1410.         $preNumber $lounge->getRankLounge();
  1411.         $postNumber $request->request->get('mds_greenpatiobundle_reservationloungedetails')['rankLounge'];
  1412.         $hoy = new \DateTime("now"NULL);
  1413.         $form $this->createEditReservationLoungeDetailsForm($lounge$id);
  1414.         $form->handleRequest($request);
  1415.         if($form->isValid())
  1416.         {
  1417.             /* Obtengo usuario logueado */
  1418.             $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  1419.             $user_id $user_logueado->getId();
  1420.             /* Gestión de eventos en Log */
  1421.             $user_lastname $user_logueado->getLastname();
  1422.             $user_name $user_logueado->getName();
  1423.             $user_email $user_logueado->getEmail();
  1424.             $user_rol $user_logueado->getRoles();
  1425.             $event_url $request->getPathInfo();
  1426.             $event_complete $user_name.' '.$user_lastname.' - '.$user_email.' - '.$user_rol[0].' | '.$event_url;
  1427.             $lounge->setUpdatedId($user_id);
  1428.             $lounge->setUpdatedAt($hoy);
  1429.             try{
  1430.                 // Reordenar salas si se ha cambiado el rank number de la sala
  1431.                 if (!( $preNumber == $postNumber)){ $this->reordenarSalas($postNumber$lounge->getId()); }
  1432.                 $em->persist($lounge);
  1433.                 $em->flush();
  1434.                 $event 'The lounge has been Updated. Now';
  1435.                 $successMessage $this->translator->trans($event);
  1436.                 $this->addFlash('mensajereservation'$successMessage);
  1437.             } catch (\Exception $e){
  1438.                 $event 'An error occurred: '.$e->getMessage();
  1439.                 /* Para el usuario */
  1440.                 $errorMessage $this->translator->trans($event);
  1441.                 $this->addFlash('mensajereservationerror'$errorMessage);
  1442.             }
  1443.             /* Fin Gestión de eventos en Log */
  1444.             return $this->redirectToRoute('reservations_greenpatio_list_lounges');
  1445.         } else {
  1446.             $errorMessage $this->translator->trans('Error, some fields are empty');
  1447.             $this->addFlash('mensajereservationerror'$errorMessage);
  1448.         }
  1449.         return $this->render('MDS/GreenPatioBundle/reservations/edit-reservations-lounge-details.html.twig',
  1450.             array(
  1451.                 'id' => $lounge->getId(),
  1452.                 'lounge' => $lounge,
  1453.                 'form' => $form->createView()
  1454.             )
  1455.         );
  1456.     }
  1457.     /**
  1458.      * @Route("/deleteloungedetails/{id}", name="reservations_lounge_details_delete")
  1459.      */
  1460.     public function deleteLoungeDetailsAction($idEntityManagerInterface $emRequest $request)
  1461.     {
  1462.         $lounge $em->getRepository(ReservationLoungeDetails::class)->findOneById($id);
  1463.         try{
  1464.             $em->remove($lounge);
  1465.             $em->flush();
  1466.             // INICIO: Eliminamos los precios asociados a la sala
  1467.                 $profiles $em->getRepository(ReservationLoungeProfile::class)->findByLoungeId($id);
  1468.                 foreach ($profiles as $item){
  1469.                     $em->remove($item);
  1470.                     $em->flush();
  1471.                 }
  1472.             // FIN: Eliminamos los precios asociados a la sala
  1473.             $event 'The Reservation has been Deleted. Now';
  1474.             $successMessage $this->translator->trans($event);
  1475.             $this->addFlash('mensajereservation'$successMessage);
  1476.         } catch (\Exception $e){
  1477.             $event 'An error occurred: '.$e->getMessage();
  1478.             /* Para el usuario */
  1479.             $errorMessage $this->translator->trans($event);
  1480.             $this->addFlash('mensajereservationerror'$errorMessage);
  1481.         }
  1482.         /* Fin Gestión de eventos en Log */
  1483.         return $this->redirectToRoute('reservations_greenpatio_list_lounges');
  1484.     }
  1485.     /**
  1486.      * @Route("/deleteloungeelement/{idlounge}/{idtype}/{idelement}", name="reservations_lounge_element_delete")
  1487.      */
  1488.     public function deleteLoungeElementAction($idlounge$idtype$idelementEntityManagerInterface $emRequest $request)
  1489.     {
  1490.         switch ($idtype){
  1491.             case 1$item $em->getRepository(ReservationLoungeDescription::class)->findOneById($idelement); break;      //Descripcion
  1492.             case 2$item $em->getRepository(ReservationLoungePicture::class)->findOneById($idelement); break;      //Imagenes
  1493.             case 3$item $em->getRepository(ReservationLoungeVideo::class)->findOneById($idelement); break;      //Videos
  1494.             default: $item null; break;
  1495.         }
  1496.         try{
  1497.             $em->remove($item);
  1498.             $em->flush();
  1499.             $event 'The Item has been Deleted. Now';
  1500.             $successMessage $this->translator->trans($event);
  1501.             $this->addFlash('mensajereservation'$successMessage);
  1502.         } catch (\Exception $e){
  1503.             $event 'An error occurred: '.$e->getMessage();
  1504.             /* Para el usuario */
  1505.             $errorMessage $this->translator->trans($event);
  1506.             $this->addFlash('mensajereservationerror'$errorMessage);
  1507.         }
  1508.         /* Fin Gestión de eventos en Log */
  1509.         return $this->redirectToRoute('reservations_lounge_details', array( 'id' => $idlounge ));
  1510.     }
  1511.     /**
  1512.      *@Route("/exclamation", name="get_exclamation")
  1513.      */
  1514.     public function exclamationAction(EntityManagerInterface $emRequest $request) {
  1515.         $dateStar $request->request->get('dateStar');
  1516.         $dateEnd $request->request->get('dateEnd');
  1517.         $hourStar $request->request->get('hourStar');
  1518.         $hourEnd $request->request->get('hourEnd');
  1519.         $profileId $request->request->get('profileId');
  1520.         $mountingDate $request->request->get('mountingDate');
  1521.         $mountingHourStart $request->request->get('mountingHourStart');
  1522.         $removalDate $request->request->get('removalDate');
  1523.         $removalHourEnd $request->request->get('removalHourEnd');
  1524.         // INICIO: Si hay montaje o desmontaje  en el evento nuevo las fechas a utilizar son estas y no las del evento
  1525.         if (!empty($mountingDate)){
  1526.             $dateStar $mountingDate;
  1527.             if (!empty($mountingHourStart)){ $hourStar $mountingHourStart; }
  1528.         }
  1529.         if (!empty($removalDate)){
  1530.             $dateEnd $removalDate;
  1531.             if (!empty($removalHourEnd)){ $hourEnd $removalHourEnd; }
  1532.         }
  1533.         // FIN: Si hay montaje o desmontaje  en el evento nuevo las fechas a utilizar son estas y no las del evento
  1534.         $loungeId $em->getRepository(ReservationLoungeProfile::class)->findOneById($profileId);
  1535.         $newdateStar $dateStar.' '.$hourStar.':00';
  1536.         $newdateEnd $dateEnd .' '.$hourEnd.':00';
  1537.         $parameters = array(
  1538.             'dateStar' => $newdateStar,
  1539.             'dateEnd' => $newdateEnd,
  1540.             'idLounge' => $loungeId->getLoungeId(),
  1541.         );
  1542.         $dql 'SELECT i
  1543.                     FROM GreenPatioBundle:ReservationLounge i
  1544.                     WHERE  i.dateStart >= :dateStar
  1545.                       and i.dateStart <= :dateEnd
  1546.                       and i.idLounge = :idLounge';
  1547.         $query $em->createQuery($dql)->setParameters($parameters);
  1548.         $reservationLounge1 $query->getResult();
  1549.         $dql 'SELECT i
  1550.                     FROM GreenPatioBundle:ReservationLounge i
  1551.                     WHERE  i.dateEnd >= :dateStar
  1552.                       and i.dateEnd <= :dateEnd
  1553.                       and i.idLounge = :idLounge';
  1554.         $query $em->createQuery($dql)->setParameters($parameters);
  1555.         $reservationLounge2 $query->getResult();
  1556.         $parameters = array(
  1557.             'dateStar' => $newdateStar,
  1558.             'idLounge' => $loungeId->getLoungeId()
  1559.         );
  1560.         $dql 'SELECT i
  1561.                     FROM GreenPatioBundle:ReservationLounge i
  1562.                     WHERE  :dateStar >= i.dateStart
  1563.                       and :dateStar <= i.dateEnd
  1564.                       and i.idLounge = :idLounge';
  1565.         $query $em->createQuery($dql)->setParameters($parameters);
  1566.         $reservationLounge3 $query->getResult();
  1567.         $parameters = array(
  1568.             'dateEnd' => $newdateEnd,
  1569.             'idLounge' => $loungeId->getLoungeId(),
  1570.         );
  1571.         $dql 'SELECT i
  1572.                     FROM GreenPatioBundle:ReservationLounge i
  1573.                     WHERE  :dateEnd >= i.dateStart
  1574.                       and :dateEnd <= i.dateEnd
  1575.                       and i.idLounge = :idLounge';
  1576.         $query $em->createQuery($dql)->setParameters($parameters);
  1577.         $reservationLounge4 $query->getResult();
  1578.         // INICIO: Si hay montaje o desmontaje  en los eventos de la BD, las fechas a utilizar son estas y no las del evento
  1579.         $parameters = array(
  1580.             'dateStar' => $newdateStar,
  1581.             'dateEnd' => $newdateEnd,
  1582.             'idLounge' => $loungeId->getLoungeId(),
  1583.         );
  1584.         $dql 'SELECT i
  1585.                     FROM GreenPatioBundle:ReservationLounge i
  1586.                     WHERE  i.mountingDate >= :dateStar
  1587.                       and i.mountingDate <= :dateEnd
  1588.                       and i.idLounge = :idLounge';
  1589.         $query $em->createQuery($dql)->setParameters($parameters);
  1590.         $reservationLounge5 $query->getResult();
  1591.         // FIN: Si hay montaje o desmontaje  en los eventos de la BD, las fechas a utilizar son estas y no las del evento
  1592.         $reservationLounge array_merge($reservationLounge1,$reservationLounge2,$reservationLounge3,$reservationLounge4);
  1593.         $data = array();
  1594.         foreach ($reservationLounge as $res){
  1595.             $reservation $em->getRepository(Reservation::class)->findOneById($res->getIdReservation());
  1596.             if (!is_null($reservation->getIdProposal() )){
  1597.                 $proposal $em->getRepository(Proposal::class)->findOneById($reservation->getIdProposal());
  1598.                 $user $em->getRepository(User::class)->findOneById($proposal->getAgentId());
  1599.                 $data[] = array(
  1600.                     'name' => 'Id Proposal',
  1601.                     'idproposal' => $proposal->getId(),
  1602.                     'title' => $proposal->getTitle(),
  1603.                     'Agent' => $user->getName().' '.$user->getLastname(),
  1604.                 );
  1605.             } else {
  1606.                 $user $em->getRepository(User::class)->findOneById($reservation->getCreatedBy());
  1607.                 $data[] = array(
  1608.                     'name' => 'Id Green Patio',
  1609.                     'idproposal' => $reservation->getId(),
  1610.                     'title' => $reservation->getTitle(),
  1611.                     'Agent' => $user->getName().' '.$user->getLastname(),
  1612.                 );
  1613.             }
  1614.         }
  1615.         $return = array( 'reservation' => $data, );
  1616.         $response = new JsonResponse($return);
  1617.         return $response;
  1618.     }
  1619.     /**
  1620.      * @Route("/addperiod/",  name="reservations_greenpatio_addperiod")
  1621.      */
  1622.     public function addReservationPeriodActionRequest $request)
  1623.     {
  1624.         $period = new ReservationPeriod();
  1625.         $form $this->createReservationperiodCreateForm($period);
  1626.         return $this->render('MDS/GreenPatioBundle/reservations/list-reservations-period.html.twig', array('form' => $form->createView() ));
  1627.     }
  1628.     private function createReservationperiodCreateForm(Reservationperiod $entity)
  1629.     {
  1630.         $form $this->createForm(ReservationPeriodType::class, $entity, array(
  1631.             'action' => $this->generateUrl('reservations_greenpatio_period_create'),
  1632.             'method' => 'POST'
  1633.         ));
  1634.         return $form;
  1635.     }
  1636.     /**
  1637.      * @Route("/createperiod", name="reservations_greenpatio_period_create")
  1638.      */
  1639.     public function createPeriodAction(EntityManagerInterface $emRequest $request)
  1640.     {
  1641.         $period = new ReservationPeriod();
  1642.         $form $this->createReservationPeriodCreateForm($period);
  1643.         $form->handleRequest($request);
  1644.         /* Obtengo usuario logueado */
  1645.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  1646.         $user_id $user_logueado->getId();
  1647.         $hoy = new \DateTime("now"NULL);
  1648.         $period->setCreatedAt($hoy);
  1649.         $period->setCreatedId($user_id);
  1650.         $period->setUpdatedAt($hoy);
  1651.         $period->setUpdatedId($user_id);
  1652.         if($form->isValid())
  1653.         {
  1654.             try{
  1655.                 $em->persist($period);
  1656.                 $em->flush();
  1657.                 $event 'The Period has been created.';
  1658.                 $successMessage $this->translator->trans($event);
  1659.                 $this->addFlash('mensajereservation'$successMessage);
  1660.             } catch (\Exception $e){
  1661.                 $event 'An error occurred: '.$e->getMessage();
  1662.                 /* Para el usuario */
  1663.                 $errorMessage $this->translator->trans($event);
  1664.                 $this->addFlash('mensajereservationerror'$errorMessage);
  1665.             }
  1666.         } else {
  1667.             $errorMessage $this->translator->trans('Error, some fields are empty');
  1668.             $this->addFlash('mensajereservationerror'$errorMessage);
  1669.         }
  1670.         return $this->redirectToRoute('reservations_greenpatio_list_period');
  1671.     }
  1672.     /**
  1673.      * @Route("/listperiod", name="reservations_greenpatio_list_period")
  1674.      */
  1675.     public function indexPeriodAction(EntityManagerInterface $emRequest $request) {
  1676.         $periods $em->getRepository(ReservationPeriod::class)->findAll();
  1677.         $period = new ReservationPeriod();
  1678.         $form $this->createReservationPeriodCreateForm($period);
  1679.         return $this->render('MDS/GreenPatioBundle/reservations/list-reservations-period.html.twig',
  1680.             array(
  1681.                 'groups' => null,
  1682.                 'form' => $form->createView(),
  1683.                 'periods' => $periods
  1684.             )
  1685.         );
  1686.     }
  1687.     /**
  1688.      * @Route("/deleteperiod/{id}", name="reservations_period_delete")
  1689.      */
  1690.     public function deletePeriodAction(EntityManagerInterface $em$idRequest $request)
  1691.     {
  1692.         $period $em->getRepository(ReservationPeriod::class)->findOneById($id);
  1693.         try{
  1694.             $em->remove($period);
  1695.             $em->flush();
  1696.             $event 'The Reservation has been Deleted. Now';
  1697.             $successMessage $this->translator->trans($event);
  1698.             $this->addFlash('mensajereservation'$successMessage);
  1699.         } catch (\Exception $e){
  1700.             $event 'An error occurred: '.$e->getMessage();
  1701.             /* Para el usuario */
  1702.             $errorMessage $this->translator->trans($event);
  1703.             $this->addFlash('mensajereservationerror'$errorMessage);
  1704.         }
  1705.         /* Fin Gestión de eventos en Log */
  1706.         return $this->redirectToRoute('reservations_greenpatio_list_period');
  1707.     }
  1708.     /**
  1709.      * @Route("/editperiod/{id}", name="reservations_edit_period")
  1710.      */
  1711.     public function editPeriodAction($idEntityManagerInterface $emRequest $request)
  1712.     {
  1713.         $period $em->getRepository(ReservationPeriod::class)->findOneById($id);
  1714.         /* Obtengo usuario logueado */
  1715.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  1716.         /* Gestión de eventos en Log */
  1717.         $user_lastname $user_logueado->getLastname();
  1718.         $user_name $user_logueado->getName();
  1719.         $user_email $user_logueado->getEmail();
  1720.         $user_rol $user_logueado->getRoles();
  1721.         $event_url $request->getPathInfo();
  1722.         $event_complete $user_name.' '.$user_lastname.' - '.$user_email.' - '.$user_rol[0].' | '.$event_url;
  1723.         $hoy = new \DateTime("now"NULL);
  1724.         $form $this->createEditPeriodForm($period$id);
  1725.         return $this->render('MDS/GreenPatioBundle/reservations/edit-reservations-period.html.twig',
  1726.             array(
  1727.                 'id' => $id,
  1728.                 'hoy' => $hoy,
  1729.                 'period' => $period,
  1730.                 'form' => $form->createView()
  1731.             ));
  1732.     }
  1733.     private function createEditPeriodForm(ReservationPeriod $entity$id)
  1734.     {
  1735.         $form $this->createForm(ReservationPeriodType::class, $entity,
  1736.             array(
  1737.                 'action' => $this->generateUrl('reservations_period_update',
  1738.                     array(
  1739.                         'id' => $id,
  1740.                         'period' => $entity
  1741.                     )
  1742.                 ), 'method' => 'PUT'));
  1743.         return $form;
  1744.     }
  1745.     /**
  1746.      * @Route("/updateperiod/{id}", name="reservations_period_update")
  1747.      */
  1748.     public function updatePeriodAction($idEntityManagerInterface $emRequest $request)
  1749.     {
  1750.         $period $em->getRepository(ReservationPeriod::class)->findOneById($id);
  1751.         $newName $request->request->get('mds_greenpatiobundle_reservationperiod')['name'];
  1752.         $period->setName($newName);
  1753.         $hoy = new \DateTime("now"NULL);
  1754.         $form $this->createEditPeriodForm($period$id);
  1755.         $form->handleRequest($request);
  1756.         if($form->isValid())
  1757.         {
  1758.             /* Obtengo usuario logueado */
  1759.             $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  1760.             $user_id $user_logueado->getId();
  1761.             /* Gestión de eventos en Log */
  1762.             $user_lastname $user_logueado->getLastname();
  1763.             $user_name $user_logueado->getName();
  1764.             $user_email $user_logueado->getEmail();
  1765.             $user_rol $user_logueado->getRoles();
  1766.             $event_url $request->getPathInfo();
  1767.             $event_complete $user_name.' '.$user_lastname.' - '.$user_email.' - '.$user_rol[0].' | '.$event_url;
  1768.             $period->setUpdatedId($user_id);
  1769.             $period->setUpdatedAt($hoy);
  1770.             try{
  1771.                 $em->persist($period);
  1772.                 $em->flush();
  1773.                 $event 'The period has been Updated. Now';
  1774.                 $successMessage $this->translator->trans($event);
  1775.                 $this->addFlash('mensajereservation'$successMessage);
  1776.             } catch (\Exception $e){
  1777.                 $event 'An error occurred: '.$e->getMessage();
  1778.                 /* Para el usuario */
  1779.                 $errorMessage $this->translator->trans($event);
  1780.                 $this->addFlash('mensajereservationerror'$errorMessage);
  1781.             }
  1782.             /* Fin Gestión de eventos en Log */
  1783.             return $this->redirectToRoute('reservations_greenpatio_list_period');
  1784.         } else {
  1785.             $errorMessage $this->translator->trans('Error, some fields are empty');
  1786.             $this->addFlash('mensajereservationerror'$errorMessage);
  1787.         }
  1788.         return $this->render('MDS/GreenPatioBundle/reservations/edit-reservations-period.html.twig',
  1789.             array(
  1790.                 'id' => $id,
  1791.                 'hoy' => $hoy,
  1792.                 'period' => $period,
  1793.                 'form' => $form->createView()
  1794.             )
  1795.         );
  1796.     }
  1797.     /**
  1798.      * @Route("/getperiodos/",  name="reservations_greenpatio_get_periods")
  1799.      */
  1800.     public function addReservationPeriodsAction(EntityManagerInterface $emRequest $request)
  1801.     {
  1802.         $periods $em->getRepository(ReservationPeriod::class)->findAll();
  1803.         $data = array();
  1804.         foreach ($periods as $items){ $data[] = array( 'id' => $items->getId(), 'name' => $items->getName(), ); }
  1805.         $return = array( 'periods' => $data, );
  1806.         $response = new JsonResponse($return);
  1807.         return $response;
  1808.     }
  1809.     /**
  1810.      * @Route("/addsimple/",  name="reservations_greenpatio_add_simple")
  1811.      */
  1812.     public function addReservationSimpleAction(EntityManagerInterface $emRequest $request)
  1813.     {
  1814.         $reserv = new Reservation();
  1815.         $reserv->setComAvGp(10);                       // Valor por defecto de ComAvGg
  1816.         $form $this->createReservationCreateForm($reserv);
  1817.         $parameters = array();
  1818.         $dql 'SELECT p
  1819.                 FROM App:ClientContact p
  1820.                 ORDER BY p.name ASC ';
  1821.         $query $em->createQuery($dql)->setParameters($parameters);
  1822.         $clientsContact $query->getResult();
  1823.         return $this->render('MDS/GreenPatioBundle/reservations/add-reservations-simple.html.twig',
  1824.             array(
  1825.                 'form' => $form->createView(),
  1826.                 'clientsContact' => $clientsContact,
  1827.             ));
  1828.     }
  1829.     private function createReservationCreateForm(Reservation $entity)
  1830.     {
  1831.         $form $this->createForm(ReservationType::class, $entity, array(
  1832.             'action' => $this->generateUrl('reservations_greenpatio_create_simple'),
  1833.             'method' => 'POST'
  1834.         ));
  1835.         return $form;
  1836.     }
  1837.     /**
  1838.      * @Route("/createsimple", name="reservations_greenpatio_create_simple")
  1839.      */
  1840.     public function createSimpleAction(EntityManagerInterface $emRequest $request)
  1841.     {
  1842.         $clientContact $request->request->get('clientContact');
  1843.         $contactUnregistered $request->request->get('contactUnregistered');
  1844.         $nameContactUnregistered $request->request->get('nameContactUnregistered');
  1845.         $phoneContactUnregistered $request->request->get('phoneContactUnregistered');
  1846.         $reserva = new Reservation();
  1847.         $reserva->setComAvGp(10);                       // Valor por defecto de ComAvGg
  1848.         $form $this->createReservationCreateForm($reserva);
  1849.         $form->handleRequest($request);
  1850.         /* Obtengo usuario logueado */
  1851.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  1852.         $user_id $user_logueado->getId();
  1853.         $hoy = new \DateTime("now"NULL);
  1854.         if($form->isValid())
  1855.         {
  1856.             $reserva->setUpdatedBy($user_id);
  1857.             $reserva->setUpdatedAt($hoy);
  1858.             // El proveedor de catering no es obligatorio
  1859.             if (is_null($reserva->getCateringName())){
  1860.                 $reserva->setSupplier(4765);
  1861.                 $reserva->setCateringName('HIGO & TRIGO, S.L.');        // Por defecto se desea el Catering de Higo&Trigo
  1862.             } else {
  1863.                 $reserva->setSupplier($reserva->getCateringName()->getId());
  1864.                 $reserva->setCateringName($reserva->getCateringName()->getName());
  1865.             }
  1866.             if (!empty($reserva->getClient())){
  1867.                 $reserva->setClient($reserva->getClient()->getId());
  1868.             }
  1869.             $reserva->setCreatedAt($hoy);
  1870.             $reserva->setCreatedBy($user_id);
  1871.             if(empty($reserva->getDaysBlock()) or !(is_numeric($reserva->getDaysBlock()))){
  1872.                 $reserva->setDaysBlock(7);
  1873.             }
  1874.             if(is_null($reserva->getPriority()) or empty($reserva->getPriority()) or ($reserva->getPriority() == 'Auto')){
  1875.                 $reserva->setPriority(1);
  1876.             } else {
  1877.                 // Se ha establecido una prioridad y todas las prioridades que coincidan con este evento deben ser alteradas
  1878.                 // PENDIENTE A HABLAR CON RAFA
  1879.             }
  1880.             // No hay salas, se asigna a la reserva la fecha del dia actual
  1881.             $reserva->setDateStart(new \DateTime('2078-01-01'));
  1882.             $reserva->setDateEnd(new \DateTime('2000-01-01'));
  1883.             if(!empty($clientContact)){ $reserva->setClientContact($clientContact); }
  1884.             if(!empty($contactUnregistered)){
  1885. //                if (filter_var($contactUnregistered, FILTER_VALIDATE_EMAIL)) {          // Validamos el correo electronico
  1886.                     $reserva->setContactUnregistered($contactUnregistered);
  1887. //                }
  1888.             }
  1889.             if(!empty($nameContactUnregistered)){
  1890.                 $reserva->setNameContactUnregistered($nameContactUnregistered);
  1891.             }
  1892.             if(!empty($phoneContactUnregistered)){
  1893.                 $reserva->setPhoneContactUnregistered($phoneContactUnregistered);
  1894.             }
  1895.             if(empty($reserva->getStatus())){
  1896.                 $reserva->setStatus('Iniciado');
  1897.             } else {
  1898.                 //No se debe crear un evento con estado confirmado. Salva y Rafa seran quienes confirmen los eventos
  1899.                 if(($reserva->getStatus() == 'Confirmed')){
  1900. //                    $reserva->setStatus('Cotizado');              //Ya no es necesario que Rafa o Salva confirmen
  1901.                 }
  1902.             }
  1903.             // Genera un token único utilizando la función uniqid() de PHP
  1904.             $token uniqid();
  1905.             $reserva->setToken($token);
  1906.             try{
  1907.                 $em->persist($reserva);
  1908.                 $em->flush();
  1909.                 $event 'The Reservation has been created.';
  1910.                 $successMessage $this->translator->trans($event);
  1911.                 $this->addFlash('mensajereservation'$successMessage);
  1912.             } catch (\Exception $e){
  1913.                 $event 'An error occurred: '.$e->getMessage();
  1914.                 $errorMessage $this->translator->trans($event);
  1915.                 $this->addFlash('mensajereservationerror'$errorMessage);
  1916.             }
  1917.             //Envio de correo al cliente y al agente si es un bloqueo
  1918.             if(is_null($reserva->getStatus())){
  1919.                 $reserva->setStatus('Cotizado');
  1920.                 $em->persist($reserva);
  1921.                 $em->flush();
  1922.             } else {
  1923.                 if (($reserva->getStatus() == 'Bloqueo')) {
  1924.                     if(empty($reserva->getDays())){
  1925.                         $now = new \DateTime("now");
  1926.                         $dateLimit date"Y-m-d H:i"strtotime$now->format('Y-m-d H:i') . "+".$reserva->getDaysBlock()." days" ));
  1927.                         $dateLimit = new \DateTime($dateLimit);
  1928.         
  1929.                         $reserva->setDays($dateLimit);
  1930.                     }
  1931.                     if ((!empty($reserva->getClient())) or (!empty($reserva->getClientContact())) or (!empty($reserva->getContactUnregistered()))) {
  1932.                         //Solo se envia correo de notificacion del correo si hay cliente o contacto o contacto no registrado
  1933.                         $client $em->getRepository(Client::class)->findOneById($reserva->getClient());
  1934.                         $mailAddressTo null;
  1935.                         // if (!empty($client) and (!empty($client->getEmail()))){ $mailAddressTo = $client->getEmail(); }         // Si hay cliente con correo se le envia a este
  1936.                         // if (!empty($reserva->getClientContact())){
  1937.                         //     $contacto = $em->getRepository(ClientContact::class)->findOneById($reserva->getClientContact());
  1938.                         //     if (!empty($contacto) and (!empty($contacto->getEmail()))){ $mailAddressTo = $contacto->getEmail(); }   // Si hay un contacto seleccionado tiene prioridad sobre el contacto de cliente
  1939.                         // }
  1940.                         // if (!empty($reserva->getContactUnregistered())){ $mailAddressTo = $reserva->getContactUnregistered(); }     // Si hay correo de contacto no registrado este tiene prioridad sobre todos
  1941.                         if (!empty($mailAddressTo)) {
  1942.                             $agente $em->getRepository(User::class)->findOneById($user_id);
  1943.                             $mailAddressFrom $agente->getEmail();
  1944.                             $mailSubject 'Notificación de Bloqueo - Reserva de espacio en Green Patio';
  1945.                             $mailBody 'Estimado cliente,' .
  1946.                                 '<br><br> Nos ponemos en contacto con usted para confirmarle que su reserva ha quedado registrada en Green Patio para la realización de su próximo evento.' .
  1947.                                 '<br>Le recordamos que esta reserva tiene una validez de ' $reserva->getDaysBlock() . ' días. Si pasado este tiempo no hemos recibido confirmación de vuestra parte, procederemos a la cancelación de la misma.' .
  1948.                                 '<br><br>Reserva: ' $reserva->getId() .' - '$reserva->getTitle();
  1949.                             $mailBody $mailBody '<br><br><br>Muchas gracias por su colaboración.<br><br><br>';
  1950.                             //Se envia el correo al cliente y al agente
  1951.                             $this->sendMail($mailAddressFrom$mailAddressTo$mailSubject$mailBody);
  1952.                             //Se genera el control de la alerta
  1953.                             $this->makeAlert($reserva->getId(), $reserva->getClient(), $mailAddressTo$agente->getId(), $agente->getEmail());
  1954.                         }
  1955.                     }
  1956.                 }
  1957.             }
  1958.         } else {
  1959.             $errorMessagebase $this->translator->trans('Error, some fields are empty');
  1960.             $this->addFlash('mensajetracingerror'$errorMessagebase);
  1961.             $periods $em->getRepository(ReservationPeriod::class)->findAll();
  1962.             return $this->render('MDS/GreenPatioBundle/reservations/add-reservations.html.twig',
  1963.                 array(
  1964.                     'form' => $form->createView(),
  1965.                     'periods' => $periods,
  1966.                 ));
  1967.         }
  1968.         $id $reserva->getId();
  1969.         // Sincronización con HT
  1970.         if (!empty($reserva)) {
  1971.             // Rafa indico que siempre se sincronice al abrir un expediente de GP
  1972.             if (in_array($reserva->getStatus(), [null'''Confirmed''Invoiced''Iniciado''Cotizado''Bloqueo'])) {
  1973. //            if ($reserva->getStatus() == 'Confirmed' or $reserva->getStatus() ==  'Invoiced' or $reserva->getStatus() == 'Iniciado' or $reserva->getStatus() == 'Cotizado' or $reserva->getStatus() ==  'Bloqueo') {
  1974.                 if ($reserva->getCateringName() == 'HIGO & TRIGO, S.L.') {
  1975.                     // Si no se ha creado aun el expediente de HT debemos crearlo
  1976.                     $htFile $em->getRepository(HtFile::class)->findByReservation($reserva);
  1977.                     if (empty($htFile)) { return $this->redirectToRoute('sinc_gp_ht', array('id' => $id,)); }
  1978.                 }
  1979.             }
  1980.         }
  1981.         // Sincronización con Av Express
  1982.         $cotizable $this->laReservaEsCotizable($reserva->getId());
  1983.         if ($cotizable) {
  1984.             // Rafa indico que siempre se sincronice al abrir un expediente de GP
  1985.             if (in_array($reserva->getStatus(), [null'''Confirmed''Invoiced''Iniciado''Cotizado''Bloqueo'])) {
  1986. //            if (in_array($reserva->getStatus(), ['Confirmed', 'Invoiced', 'Iniciado', 'Cotizado', 'Bloqueo'])) {
  1987.                 $AveFile $em->getRepository(AveFiles::class)->findByReservation($reserva);
  1988.                 if (empty($AveFile)) {
  1989.                     // Si no se ha creado aun el expediente de Av Express debemos crearlo
  1990.                     return $this->redirectToRoute('sinc_gp_ave', array('id' => $id,));
  1991.                 }
  1992.             }
  1993.         }
  1994.         return $this->redirectToRoute('reservations_greenpatio_edit_simple', array( 'id' => $id'token' => null ));
  1995.     }
  1996.     /**
  1997.      * @Route("/editsimple/{id}",  name="reservations_greenpatio_edit_simple")
  1998.      */
  1999.     public function editReservationSimpleItemsAction($idEntityManagerInterface $emRequest $request)
  2000.     {
  2001.         $lounges $em->getRepository(ReservationLoungeDetails::class)->findAll();
  2002.         $loungesSimple $em->getRepository(ReservationLoungeSimple::class)->findByIdReservation($id);
  2003.         $services $em->getRepository(ReservationService::class)->findByReservationId($id);
  2004.         $reserva $em->getRepository(Reservation::class)->findOneById($id);
  2005.         $lounge = new ReservationLounge();
  2006.         $lounge->setIdReservation($id);
  2007.         $monDesmon = new ReservationLounge();
  2008.         $monDesmon->setIdReservation($id);
  2009.         $form1 $this->createReservationCreateForm($reserva);
  2010.         $form2 $this->createReservationLoungeCreateForm($lounge);
  2011.         $form3 $this->createReservationLoungeMonDesCreateForm($monDesmon);
  2012.         $arrayLoungesByDay = []; $arrayLoungesInFile = [];
  2013.         $arrayLoungesByDay = [];
  2014.         $arrayLoungesInFile = [];
  2015.         if (!empty($loungesSimple)) {
  2016.             foreach ($loungesSimple as $item) {
  2017.                 // Arreglo por día
  2018.                 $dateStart $item->getDateStart()->format('Ymd');
  2019.                 $arrayLoungesByDay[$item->getRankQuote()][$dateStart][] = $item;
  2020.                 ksort($arrayLoungesByDay[$item->getRankQuote()]);
  2021.                 // Arreglo en archivo
  2022. //                if (empty($item->getType())) {
  2023.                     $arrayLoungesInFile[$item->getRankQuote()][$item->getIdLounge()] = array(
  2024.                         'rankQuote' => $item->getRankQuote(),
  2025.                         'idLounge' => $item->getIdLounge(),
  2026.                         'loungeName' => $item->getLoungeName(),
  2027.                         'loungeImportantDescription' => $item->getImportantDescription(),
  2028.                         'loungeImportantDescGeneralText' => $item->getImportantDescGeneralText(),
  2029.                         'loungeImportantDescSchedules' => $item->getImportantDescSchedules(),
  2030.                         'loungeImportantDescParking' => $item->getImportantDescParking(),
  2031.                         'loungeDocContract' => empty($loungeContract) ? ''$loungeContract->getContractualDocument(),
  2032.                         'loungeDocBookingData' => empty($loungeContract) ? ''$loungeContract->getBookingData(),
  2033.                         'loungeDocDateAt' => empty($loungeContract) ? ''$loungeContract->getDateAt(),
  2034.                         'loungeDocClientProxy' => empty($loungeContract) ? ''$loungeContract->getClientProxy(),
  2035.                         'loungeDocClientJob' => empty($loungeContract) ? ''$loungeContract->getClientJob(),
  2036.                         'loungeDocFullContract' => empty($dataContract['fullContract']) ? ''$dataContract['fullContract'],
  2037.                         'language' => $item->getLanguage(),
  2038.                     );
  2039. //                }
  2040.             }
  2041.         } elseif (!empty($loungesSimple)) {
  2042.             foreach ($loungesSimple as $item) {
  2043.                 $itemTemp = clone $item;
  2044.                 $tempDateStart = clone $item->getDateStart();
  2045.                 $tempDateEnd = clone $item->getDateEnd();
  2046.                 $days = ($tempDateEnd $tempDateStart) ? $tempDateEnd->diff($tempDateStart)->days 1;
  2047.                 for ($i 0$i $days$i++) {
  2048.                     $fecha = clone $tempDateStart;
  2049.                     $fecha->modify("+$i days");
  2050.                     $dateTemp $fecha->format('Ymd');
  2051.                     $arrayLoungesByDay[$item->getRankQuote()][$dateTemp][] = $item;
  2052.                 }
  2053.                 ksort($arrayLoungesByDay[$item->getRankQuote()]);
  2054.             }
  2055.         }
  2056.         // FIN: Se forma el arreglo para las salas dia a dia
  2057.         $numeroItems sizeof($arrayLoungesByDay);
  2058.         $data $this->CalculosTotalesEditSimple($reserva->getId());
  2059.         $client $em->getRepository(Client::class)->findOneById($reserva->getClient());
  2060.         if (!empty($client)){ $clientId $client->getId(); } else { $clientId 0; }
  2061.         $clients $em->getRepository(Client::class)->findAll();
  2062.         /* CONSULTAMOS PARA SUMAR  */
  2063.         $parameters = array( 'tags' => 'CATERING''company' => 'HIGO & TRIGO, S.L.',  );
  2064.         $dql 'SELECT p
  2065.                 FROM App\Entity\Supplier p
  2066.                 WHERE (p.tags LIKE :tags) AND (p.company <> :company) 
  2067.                 ORDER BY p.company ASC ';
  2068.         $query $em->createQuery($dql)->setParameters($parameters);
  2069.         $caterings $query->getResult();
  2070.         // Agregamos el catering de Higo & Trigo de primero
  2071.         $catHigoTrigo $em->getRepository(Supplier::class)->findOneById(4765);
  2072.         array_unshift($caterings$catHigoTrigo);
  2073.         $userCreatedBy $em->getRepository(User::class)->findOneById($reserva->getCreatedBy());
  2074.         $createdBy $userCreatedBy->getName().' '.$userCreatedBy->getLastName();
  2075.         $parameters = [];
  2076.         $dql 'SELECT p
  2077.                 FROM GreenPatioBundle:ReservationLoungeDetails p
  2078.                 ORDER BY p.rankLounge ASC ';
  2079.         $query $em->createQuery($dql)->setParameters($parameters);
  2080.         $loungesPre $query->getResult();
  2081.         $loungesNames $em->getRepository(ReservationLoungeDetails::class)->findAll();
  2082.         $query $em->createQuery('SELECT s.id, s.company FROM App\Entity\Supplier s');
  2083.         $listSupplier $query->getResult();
  2084.         $em $this->getDoctrine()->getManager();
  2085.         $invoiced $em->getRepository(ReservationInvoice::class)->findByReservationId($id);
  2086.         $invoicedRec $em->getRepository(ReservationInvoiceRec::class)->findByReservationId($id);
  2087.         foreach ($invoicedRec as $item){ array_push($invoiced$item); }
  2088.         $invoicedCvr $em->getRepository(CvrReservationInvoice::class)->findByReservationId($id);
  2089.         $invoicedBlv $em->getRepository(BlvReservationInvoice::class)->findByReservationId($id);
  2090.         $invoicedLine = empty($invoicedCvr) ? (empty($invoicedBlv) ? 'GP' 'BLV') : 'CVR';
  2091.         foreach ($invoicedCvr as $item){ array_push($invoiced$item); }
  2092.         $invoicedCvrRec $em->getRepository(CvrReservationInvoiceRec::class)->findByReservationId($id);
  2093.         foreach ($invoicedCvrRec as $item){ array_push($invoiced$item); }
  2094.         foreach ($invoicedBlv as $item){ array_push($invoiced$item); }
  2095.         $invoicedBlvRec $em->getRepository(BlvReservationInvoiceRec::class)->findByReservationId($id);
  2096.         foreach ($invoicedBlvRec as $item){ array_push($invoiced$item); }
  2097.         $sumatoriaTotalNet 0$sumatoriaTotalVat 0$sumatoriaTotal 0;
  2098.         $resultados = array( 'totalNeto' => 0'vat' => 0'total' => 0, );
  2099.         foreach ($invoiced as $idArray => $item){
  2100.             $reserva $em->getRepository(Reservation::class)->findOneById($item->getReservationId());
  2101.             $invoiced[$idArray]->setNumber($reserva->getTitle());
  2102.             $client $em->getRepository(Client::class)->findOneById($reserva->getClient());
  2103.             if(!empty($client)){ $invoiced[$idArray]->setPrefix($client->getName()); } else { $invoiced[$idArray]->setPrefix(''); }
  2104.             if ($item->getType() == 'Invoice Deposit'){
  2105.                 // INICIO: Verificamos el uso de la factura de deposito dentro de una factura, en este caso se usa el valor absoluto del balance para evitar la resta doble
  2106.                 $paymentItem $em->getRepository(ReservationPaymentsClient::class)->findOneByInvoiceId($item->getId());
  2107.                 if (!empty($paymentItem)){
  2108.                     $invoiceElementItem $em->getRepository(ReservationInvoiceItems::class)->findOneByPayControlId($paymentItem->getId());
  2109.                     if (!empty($invoiceElementItem)) {
  2110.                         // Solo nos interesa evaluar las facturas y no las facturas de deposito
  2111.                         $invoiceOfItem $em->getRepository(ReservationInvoice::class)->findOneById($invoiceElementItem->getInvoiceId());
  2112.                         if (!empty($invoiceOfItem)) { if ($invoiceOfItem->getType() == 'Invoice') { $invoiced[$idArray]->setBalance(0); } }
  2113.                     }
  2114.                 }
  2115.                 // FIN: Verificamos el uso de la factura de deposito dentro de una factura, en este caso se usa el valor absoluto del balance para evitar la resta doble
  2116.                 $invoicedDepositItems $em->getRepository(ReservationInvoiceDepositItems::class)->findByControlId($item->getMaster());
  2117.                 foreach ($invoicedDepositItems as $itemDep){
  2118.                     $invoiced[$idArray]->setTotalNet($invoiced[$idArray]->getTotalNet() + $itemDep->getAmount());
  2119.                     $invoiced[$idArray]->setVat($invoiced[$idArray]->getVat() + (($itemDep->getAmount() * $itemDep->getIva())/100));
  2120.                     $invoiced[$idArray]->setTotal($invoiced[$idArray]->getTotal() + ($itemDep->getAmount() + (($itemDep->getAmount() * $itemDep->getIva())/100)));
  2121.                 }
  2122.             }
  2123.             // Valores Netos
  2124.             if ($item->getType()=='Invoice'){
  2125.                 $sumatoriaTotalNet $sumatoriaTotalNet $item->getTotalNet();
  2126.             } else {
  2127.                 if ($item->getType()=='Invoice Deposit'){
  2128.                     //Factura de deposito
  2129.                     $sumatoriaTotalNet $sumatoriaTotalNet 0;  //$item->getTotalNet();   // Las facturas de deposito no deben computar en este calculo
  2130.                 } else {
  2131.                     if ($item->getType()=='Invoice Deposit Rec'){
  2132.                         //Factura de Deposito rectificativa
  2133.                         $sumatoriaTotalNet $sumatoriaTotalNet 0;
  2134.                     } else {
  2135.                         //Factura rectificativa
  2136.                         $sumatoriaTotalNet $sumatoriaTotalNet $item->getTotalNet();     // Se han llenado de datos negativos las rectificativas, solo es necesario sumar
  2137.                     }
  2138.                 }
  2139.             }
  2140.             //Valores Iva
  2141.             if ($item->getType()=='Invoice') {
  2142.                 $sumatoriaTotalVat $sumatoriaTotalVat $item->getVat();
  2143.             } else {
  2144.                 if ($item->getType()=='Invoice Deposit'){
  2145.                     //Factura de deposito
  2146.                     $sumatoriaTotalVat $sumatoriaTotalVat 0;  //$item->getVat();  // Las facturas de deposito no deben computar en este calculo
  2147.                 } else {
  2148.                     if ($item->getType()=='Invoice Deposit Rec'){
  2149.                         //Factura de Deposito rectificativa
  2150.                         $sumatoriaTotalNet $sumatoriaTotalNet 0;
  2151.                     } else {
  2152.                         //Factura rectificativa
  2153.                         $sumatoriaTotalVat $sumatoriaTotalVat $item->getVat();      // Se han llenado de datos negativos las rectificativas, solo es necesario sumar
  2154.                     }
  2155.                 }
  2156.             }
  2157.             if (($item->getType()=='Invoice Deposit') or ($item->getType()=='Invoice Deposit Rec')) {
  2158.                 $sumatoriaTotal $sumatoriaTotal 0;                              // Las facturas de deposito o de deposito rectificativas no deben computar en este calculo
  2159.             } else {
  2160.                 $sumatoriaTotal $sumatoriaTotal $item->getTotal();
  2161.             }
  2162.             $resultados = array( 'totalNeto' => $sumatoriaTotalNet'vat' => $sumatoriaTotalVat'total' => $sumatoriaTotal, );
  2163.         }
  2164.         $paymentsAll $em->getRepository(ReservationPaymentsClient::class)->findByReservationId($id);
  2165.         // Verificamos pagos aun sin facturar
  2166.         $paymentNotIvoiced = [];
  2167.         foreach ($paymentsAll as $item){
  2168.             $isInvoiced $em->getRepository(ReservationInvoiceItems::class)->findBy(array('reservationId' => $id'payControlId' => $item->getId()));
  2169.             if (empty($isInvoiced)){ array_push($paymentNotIvoiced$item); }
  2170.         }
  2171.         //Buscamos los agentes y seleccionamos por defecto el usuario logeado
  2172.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  2173.         $user_id $user_logueado->getId();
  2174.         $parameters = array( 'clientId' => $clientId, );
  2175.         $dql 'SELECT p
  2176.                 FROM App:ClientContact p
  2177.                 WHERE p.clientId = :clientId
  2178.                 ORDER BY p.name ASC ';
  2179.         $query $em->createQuery($dql)->setParameters($parameters);
  2180.         $clientsContact $query->getResult();
  2181.         // Fecha de notificacion en caso de ser un bloqueo
  2182.         $reservationMailAlertClient $em->getRepository(ReservationMailAlertClient::class)->findOneByReservationId($id);
  2183.         $nextMailAlert null;
  2184.         if (!empty($reservationMailAlertClient)){
  2185.             if (!($reservationMailAlertClient->getAlertSended())){
  2186.                 // La proxima fecha es la de la alerta
  2187.                 $nextMailAlert $reservationMailAlertClient->getAlertDateTime();
  2188.             } else {
  2189.                 if (!($reservationMailAlertClient->getCancelSended())){
  2190.                     // La proxima fecha es la de la cancelacion (paso a cotización)
  2191.                     $nextMailAlert $reservationMailAlertClient->getCancelDateTime();
  2192.                 }
  2193.             }
  2194.         }
  2195.         $parameters = array( 'status' => 1, );
  2196.         $dql 'SELECT c
  2197.                 FROM  App\Entity\User c
  2198.                 WHERE c.status = :status
  2199.                 ORDER BY c.name ASC ';
  2200.         $query $em->createQuery($dql)->setParameters($parameters);
  2201.         $allUsersActive $query->getResult();
  2202.         //Agregamos los FreeLance
  2203.         $freeLances $em->getRepository(ExternalUser::class)->findAll();
  2204.         foreach ($freeLances as $item){
  2205.             $item->setTeam(($item->getId() * (-1)));
  2206.             $allUsersActive[] = $item;
  2207.         }
  2208.         // Buscamos todos los servicios y los separmos por facturados y no facturados
  2209.         $datax $this->benefitForReservation($id);
  2210.         // Se quitan los clientes que no son de Green Patio
  2211. //        $parameters = array();
  2212. //        $dql = 'SELECT p
  2213. //                FROM App:Client p
  2214. //                WHERE p.isClientGreenPatio = TRUE
  2215. //                ORDER BY p.name ASC ';
  2216. //
  2217. //        $query = $em->createQuery($dql)->setParameters($parameters);
  2218. //        $clients = $query->getResult();
  2219.         $parameters = [];
  2220.         $dql 'SELECT p.id, p.name
  2221.         FROM App:Client p
  2222.         WHERE p.isClientGreenPatio = TRUE
  2223.         ORDER BY p.name ASC';
  2224.         $query $em->createQuery($dql)->setParameters($parameters);
  2225.         $clients $query->getArrayResult();
  2226.         $depositsAll $em->getRepository(ReservationDeposit::class)->findByReservationId($id);
  2227.         $confirmable $this->laReservaEsConfirmable($id);
  2228.         $cotizable $this->laReservaEsCotizable($id);
  2229.         $htFile in_array($user_logueado->getUserrol(),[9,23,24,37,47,49,51,53]) ? $em->getRepository(HtFile::class)->findOneByReservation($reserva) : null;
  2230.         $aveFile in_array($user_logueado->getUserrol(),[9,23,24,37,47,49,51,53]) ? $em->getRepository(AveFiles::class)->findOneByReservation($reserva) : null;
  2231.         if ($reserva) { 
  2232.             if ($this->getParameter('cotizacion_url') == 'https://dev-cotizacion.mante.solutions'){
  2233.                 $urlCotizacion $this->getParameter('cotizacion_url')."/index.php?token=".$reserva->getToken() . '&env=dev';
  2234.             } else {
  2235.                 $urlCotizacion $this->getParameter('cotizacion_url')."/index.php?token=".$reserva->getToken();
  2236.             }
  2237.         }
  2238.         $viewContract false;
  2239.         //Generamos el arreglo de contratos
  2240.         if (in_array($reserva->getStatus(), ['Confirmed''Invoiced'])) { $viewContract true; }
  2241.         $languagesWeb LanguageConstants::getAvailableLanguages();
  2242.         return $this->render('MDS/GreenPatioBundle/reservations/edit-reservations-simple.html.twig',
  2243.             array(
  2244.                 'form' => $form1->createView(),
  2245.                 'form2' => $form2->createView(),
  2246.                 'form3' => $form3->createView(),
  2247.                 'id' => $id,
  2248.                 'clients' => $clients,
  2249.                 'clientId' => $clientId,
  2250.                 'caterings' => $caterings,
  2251.                 'loungesPre' => $loungesPre,
  2252.                 'loungesNames' => $loungesNames,
  2253.                 'arrayLoungesInFile' => $arrayLoungesInFile,
  2254.                 'facturas' => $invoiced,
  2255.                 'numeroItems' => $numeroItems,
  2256.                 'arrayLoungesByDay' => $arrayLoungesByDay,
  2257.                 'totales_global_con_iva' => $data['totales_global_con_iva'],
  2258.                 'totales_global_iva' => $data['totales_global_iva'],
  2259.                 'totales_global_neto' => $data['totales_global_neto'],
  2260.                 'totales_global_servicios_con_iva' => $data['totales_global_servicios_con_iva'],
  2261.                 'totales_global_servicios_neto' => $data['totales_global_servicios_neto'],
  2262.                 'totales_global_servicios_iva' => $data['totales_global_servicios_iva'],
  2263.                 'sumatoria_totales_global_con_iva' => $data['sumatoria_totales_global_con_iva'],
  2264.                 'sumatoria_totales_global_neto' => $data['sumatoria_totales_global_neto'],
  2265.                 'sumatoria_totales_global_iva' => $data['sumatoria_totales_global_iva'],
  2266.                 'reserva' => $reserva,
  2267.                 'createdBy' => $createdBy,
  2268.                 'arraySalas' => null,
  2269.                 'lounges' => $lounges,
  2270.                 'salasReserva' => $lounges,
  2271.                 'periods' => null,
  2272.                 'services' => $services,
  2273.                 'loungesNumbers' => sizeof($lounges),
  2274.                 'listSupplier' => $listSupplier,
  2275.                 'resultados' => $resultados,
  2276.                 'paymentsAll' => $paymentsAll,
  2277.                 'paymentNotIvoiced' => $paymentNotIvoiced,
  2278.                 'allUsersActive' => $allUsersActive,
  2279.                 'userLog' => $user_id,
  2280.                 'clientsContact' => $clientsContact,
  2281.                 'nextMailAlert' => $nextMailAlert,
  2282.                 'benefit' => $datax['benefit'],
  2283.                 'percBenefit' => $datax['percBenefit'],
  2284.                 'payedLounges' => $datax['payedLounges'],
  2285.                 'payedServices' => $datax['payedServices'],
  2286.                 'unPayedServices' => $datax['unPayedServices'],
  2287.                 'depositsAll' => $depositsAll,
  2288.                 'confirmable' => $confirmable,
  2289.                 'cotizable' => $cotizable,
  2290.                 'invoicedLine' => $invoicedLine,
  2291.                 'htFile' => $htFile,
  2292.                 'aveFile' => $aveFile,
  2293.                 'urlCotizacion' => $urlCotizacion,
  2294.                 'viewContract' => $viewContract,
  2295.                 'languagesWeb' => $languagesWeb,
  2296.             ));
  2297.     }
  2298.     private function createReservationLoungeCreateForm(ReservationLounge $entity)
  2299.     {
  2300.         $form $this->createForm(ReservationLoungeType::class, $entity, array(
  2301.             'action' => $this->generateUrl('reservations_greenpatio_create_simple_lounge', array( 'id' => $entity->getIdReservation(), ) ),
  2302.             'method' => 'POST'
  2303.         ));
  2304.         return $form;
  2305.     }
  2306.     private function createReservationLoungeMonDesCreateForm(ReservationLounge $entity)
  2307.     {
  2308.         $form $this->createForm(ReservationLoungeType::class, $entity, array(
  2309.             'action' => $this->generateUrl('reservations_greenpatio_create_simple_lounge_mondes', array( 'id' => $entity->getIdReservation(), )),
  2310.             'method' => 'POST'
  2311.         ));
  2312.         return $form;
  2313.     }
  2314.     /**
  2315.      * @Route("/contract/{id}", name="reservations_contract")
  2316.      */
  2317.     public function goContractAction($idEntityManagerInterface $emRequest $request){
  2318.         $reservationLounge $em->getRepository(ReservationLoungeSimple::class)->findByIdReservation($id);
  2319.         $arrayLounges =[];
  2320.         //Buscamos el modelo de contrato mas reciente de las salas de la reserva
  2321.         foreach ($reservationLounge as $item){ $arrayLounges[$item->getIdLounge()] = $item->getIdLounge(); }
  2322.         if (!empty($arrayLounges)) { $parameters['stringLounges'] = $arrayLounges; } else { $parameters['stringLounges'] = []; }
  2323.         $dql 'SELECT p
  2324.                 FROM App:DocContractModel p
  2325.                 WHERE p.modelId IN (:stringLounges)
  2326.                 ORDER BY p.updatedAt DESC';
  2327.         $query $em->createQuery($dql)->setParameter('stringLounges'$parameters['stringLounges']);
  2328.         $contractModel $query->getResult();
  2329.         if(!empty($contractModel)){ $loungeId $contractModel[0]->getModelId(); } else { $loungeId 0; }
  2330.         $dataContract $this->docContractService->contractReservation($id,$loungeId);
  2331.         return $this->render('MDS/GreenPatioBundle/reservations/print-contract-gp.html.twig', array( 'dataContract' => $dataContract['fullContract'], ));
  2332.     }
  2333.     /**
  2334.      * @Route("/updateloungegrid", name="reservations_greenpatio_updateloungegrid")
  2335.      */
  2336.     public function updateLoungeGridAction(EntityManagerInterface $emRequest $request)
  2337.     {
  2338.         $loungeGrid $request->request->get('lounge');
  2339.         $reservationGlobalLounge $request->request->get('reservation_global_lounge');
  2340.         $id $request->request->get('reservationId');     //aqui se guardara el ID de la reserva
  2341.         $reserva $em->getRepository(Reservation::class)->findOneById($id);
  2342.         // Movemos las fechas de la reserva para que tomen los valosres de las salas
  2343.         $reserva->setDateStart(new DateTime('2999-01-01'));
  2344.         $reserva->setDateEnd(new DateTime('2000-01-01'));
  2345.         $now = new DateTime('now');
  2346.         /* Obtengo usuario logueado */
  2347.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  2348.         $user_id $user_logueado->getId();
  2349.         foreach ($loungeGrid as $idreservationlounge => $loungeData) {
  2350.             foreach ($loungeData as $dia => $items) {
  2351.                 foreach ($items as $name => $item) {
  2352.                     $reservationLounge $em->getRepository(ReservationLoungeSimple::class)->findOneById($idreservationlounge);
  2353.                     if (empty($reservationLounge)) { $reservationLounge = new ReservationLoungeSimple(); }
  2354.                     // Autocompletacion HH:mm en Start
  2355.                     switch (strlen($item['dateHourMinStart'])) {
  2356.                         case 0:
  2357.                             // Vacio
  2358.                             $hourStart '00';
  2359.                             $minStart '00';
  2360.                             $hourMinStart '00:00';
  2361.                             break;
  2362.                         case 1:
  2363.                             // H  -> 0H:00
  2364.                             if (is_numeric($item['dateHourMinStart'])) {
  2365.                                 $hourStart '0' $item['dateHourMinStart'];
  2366.                                 $minStart '00';
  2367.                                 $hourMinStart $hourStart ':' $minStart;
  2368.                             } else {
  2369.                                 $hourStart '00';
  2370.                                 $minStart '00';
  2371.                                 $hourMinStart '00:00';
  2372.                             }
  2373.                             break;
  2374.                         case 2:
  2375.                             // HH  -> HH:00
  2376.                             if (is_numeric($item['dateHourMinStart'])) {
  2377.                                 $hourStart $item['dateHourMinStart'];
  2378.                                 $minStart '00';
  2379.                                 $hourMinStart $hourStart ':' $minStart;
  2380.                             } else {
  2381.                                 $hourStart '00';
  2382.                                 $minStart '00';
  2383.                                 $hourMinStart '00:00';
  2384.                             }
  2385.                             break;
  2386.                         case 3:
  2387.                             // Hmm  -> 0H:mm
  2388.                             if (is_numeric($item['dateHourMinStart'])) {
  2389.                                 $hourStart '0' substr($item['dateHourMinStart'], 01);
  2390.                                 $minStart substr($item['dateHourMinStart'], 12);
  2391.                                 $hourMinStart $hourStart ':' $minStart;
  2392.                             } else {
  2393.                                 $hourStart '00';
  2394.                                 $minStart '00';
  2395.                                 $hourMinStart '00:00';
  2396.                             }
  2397.                             break;
  2398.                         case 4:
  2399.                             // HHmm  -> HH:mm
  2400.                             if (is_numeric($item['dateHourMinStart'])) {
  2401.                                 $hourStart substr($item['dateHourMinStart'], 02);
  2402.                                 $minStart substr($item['dateHourMinStart'], 22);
  2403.                                 $hourMinStart $hourStart ':' $minStart;
  2404.                             } else {
  2405.                                 $hourStart '00';
  2406.                                 $minStart '00';
  2407.                                 $hourMinStart '00:00';
  2408.                             }
  2409.                             break;
  2410.                         case 5:
  2411.                             // HH:mm
  2412.                             if (is_numeric(substr($item['dateHourMinStart'], 02)) and (substr($item['dateHourMinStart'], 21) == ':') and is_numeric(substr($item['dateHourMinStart'], 02))) {
  2413.                                 $hourStart substr($item['dateHourMinStart'], 02);
  2414.                                 $minStart substr($item['dateHourMinStart'], 32);
  2415.                                 $hourMinStart $hourStart ':' $minStart;
  2416.                             } else {
  2417.                                 $hourStart '00';
  2418.                                 $minStart '00';
  2419.                                 $hourMinStart '00:00';
  2420.                             }
  2421.                             break;
  2422.                         default:
  2423.                             // XXXXyyy
  2424.                             $hourStart '00';
  2425.                             $minStart '00';
  2426.                             $hourMinStart '00:00';
  2427.                             break;
  2428.                     }
  2429.                     // Autocompletacion HH:mm en End
  2430.                     switch (strlen($item['dateHourMinEnd'])) {
  2431.                         case 0:
  2432.                             // Vacio
  2433.                             $hourEnd '00';
  2434.                             $minEnd '00';
  2435.                             $hourMinEnd '00:00';
  2436.                             break;
  2437.                         case 1:
  2438.                             // H  -> 0H:00
  2439.                             if (is_numeric($item['dateHourMinEnd'])) {
  2440.                                 $hourEnd '0' $item['dateHourMinEnd'];
  2441.                                 $minEnd '00';
  2442.                                 $hourMinEnd $hourEnd ':' $minEnd;
  2443.                             } else {
  2444.                                 $hourEnd '00';
  2445.                                 $minEnd '00';
  2446.                                 $hourMinEnd '00:00';
  2447.                             }
  2448.                             break;
  2449.                         case 2:
  2450.                             // HH  -> HH:00
  2451.                             if (is_numeric($item['dateHourMinEnd'])) {
  2452.                                 $hourEnd $item['dateHourMinEnd'];
  2453.                                 $minEnd '00';
  2454.                                 $hourMinEnd $hourEnd ':' $minEnd;
  2455.                             } else {
  2456.                                 $hourEnd '00';
  2457.                                 $minEnd '00';
  2458.                                 $hourMinEnd '00:00';
  2459.                             }
  2460.                             break;
  2461.                         case 3:
  2462.                             // Hmm  -> 0H:mm
  2463.                             if (is_numeric($item['dateHourMinEnd'])) {
  2464.                                 $hourEnd '0' substr($item['dateHourMinEnd'], 01);
  2465.                                 $minEnd substr($item['dateHourMinEnd'], 12);
  2466.                                 $hourMinEnd $hourEnd ':' $minEnd;
  2467.                             } else {
  2468.                                 $hourEnd '00';
  2469.                                 $minEnd '00';
  2470.                                 $hourMinEnd '00:00';
  2471.                             }
  2472.                             break;
  2473.                         case 4:
  2474.                             // HHmm  -> HH:mm
  2475.                             if (is_numeric($item['dateHourMinEnd'])) {
  2476.                                 $hourEnd substr($item['dateHourMinEnd'], 02);
  2477.                                 $minEnd substr($item['dateHourMinEnd'], 22);
  2478.                                 $hourMinEnd $hourEnd ':' $minEnd;
  2479.                             } else {
  2480.                                 $hourEnd '00';
  2481.                                 $minEnd '00';
  2482.                                 $hourMinEnd '00:00';
  2483.                             }
  2484.                             break;
  2485.                         case 5:
  2486.                             // HH:mm
  2487.                             if (is_numeric(substr($item['dateHourMinEnd'], 02)) and (substr($item['dateHourMinEnd'], 21) == ':') and is_numeric(substr($item['dateHourMinEnd'], 02))) {
  2488.                                 $hourEnd substr($item['dateHourMinEnd'], 02);
  2489.                                 $minEnd substr($item['dateHourMinEnd'], 32);
  2490.                                 $hourMinEnd $hourEnd ':' $minEnd;
  2491.                             } else {
  2492.                                 $hourEnd '00';
  2493.                                 $minEnd '00';
  2494.                                 $hourMinEnd '00:00';
  2495.                             }
  2496.                             break;
  2497.                         default:
  2498.                             // XXXXyyy
  2499.                             $hourEnd '00';
  2500.                             $minEnd '00';
  2501.                             $hourMinEnd '00:00';
  2502.                             break;
  2503.                     }
  2504.                     $dateStart $item['newDate'] . ' ' $hourMinStart;
  2505.                     $dateEnd $item['newDate'] . ' ' $hourMinEnd;
  2506.                     $loungeDetails $em->getRepository(ReservationLoungeDetails::class)->findOneByName($name);
  2507.                     $price $item['price'];
  2508.                     $ivaNew $item['iva'];
  2509.                     $pax 0;
  2510.                     $type null;
  2511.                     if (array_key_exists('iva'$item)) {
  2512.                         if (empty($item['iva']) && !is_numeric($item['iva'])) {
  2513.                             $ivaNew 21;
  2514.                             $this->addFlash('mensajereservationerror''Revisa el IVA de la sala: '.$reservationLounge->getLoungeName());
  2515.                         } else {
  2516.                             $ivaNew $item['iva'];
  2517.                         }
  2518.                     }
  2519.                     if (isset($item['pax'])) { $pax $item['pax']; if (empty($pax)){$pax 0;} } else { $type $item['type']; }
  2520.                     $reservationLounge->setIdReservation($id);
  2521.                     if ((!empty($loungeDetails)) and (isset($reservationGlobalLounge[$loungeDetails->getId()]))){
  2522.                         $reservationLounge->setIdLounge($loungeDetails->getId());
  2523.                         //Actualizamos el Resumen Descriptivo
  2524.                         $reservationLounge->setImportantDescription($reservationGlobalLounge[$loungeDetails->getId()]['importantDescription']);
  2525.                         $reservationLounge->setImportantDescGeneralText($reservationGlobalLounge[$loungeDetails->getId()]['importantDescGeneralText']);
  2526.                         $reservationLounge->setImportantDescSchedules($reservationGlobalLounge[$loungeDetails->getId()]['importantDescSchedules']);
  2527.                         $reservationLounge->setImportantDescParking($reservationGlobalLounge[$loungeDetails->getId()]['importantDescParking']);
  2528.                     } else {
  2529.                         // No se encontro el elemento por Nombre (Se ha modificado el campo nombre de la sala, probablemente por ser una DEVOLUCION)
  2530.                         $reservationLounge->setIdLounge(0);
  2531.                     }
  2532.                     $reservationLounge->setDateStart(new DateTime($dateStart));
  2533.                     $reservationLounge->setDateEnd(new DateTime($dateEnd));
  2534.                     $reservationLounge->setType($type);
  2535.                     $reservationLounge->setPax($pax);
  2536.                     $reservationLounge->setServicePrice($price);
  2537.                     $reservationLounge->setIva($ivaNew);
  2538.                     $reservationLounge->setOpIva(1);
  2539.                     $reservationLounge->setLoungeName($name);
  2540.                     $reservationLounge->setHourStart($hourStart);
  2541.                     $reservationLounge->setMinStart($minStart);
  2542.                     $reservationLounge->setHourEnd($hourEnd);
  2543.                     $reservationLounge->setMinEnd($minEnd);
  2544.                     if (array_key_exists('language',$reservationGlobalLounge)){ $reservationLounge->setLanguage($reservationGlobalLounge['language']); } else { $reservationLounge->setLanguage(1); }
  2545.                     $reservationLounge->setUpdatedBy($user_id);
  2546.                     $reservationLounge->setCreatedBy($user_id);
  2547.                     try {
  2548.                         $em->persist($reservationLounge);
  2549.                         $em->flush();
  2550.                         $successMessage 'The Item has been updated.';
  2551.                         $this->addFlash('mensajereservation'$successMessage);
  2552.                     } catch (\Exception $e) {
  2553.                         $event 'An error occurred: ' $e->getMessage();
  2554.                         $errorMessage $this->translator->trans($event);
  2555.                         $this->addFlash('mensajereservationerror'$errorMessage);
  2556.                     }
  2557.                     // INICIO: Verificamos si es necesario actualizar las fechas de la reserva
  2558.                     $boolReserva false;
  2559.                     if ($reservationLounge->getDateStart() < $reserva->getDateStart()){
  2560.                         $reserva->setDateStart($reservationLounge->getDateStart());
  2561.                         $boolReserva true;
  2562.                     }
  2563.                     if ($reserva->getDateEnd() < $reservationLounge->getDateEnd()){
  2564.                         $reserva->setDateEnd($reservationLounge->getDateEnd());
  2565.                         $boolReserva true;
  2566.                     }
  2567.                     if ($boolReserva){
  2568.                         $em->persist($reserva);
  2569.                         $em->flush();
  2570.                     }
  2571.                     // Sincronizacion global
  2572.                     $data $this->sincGpHtAvService->sincGlobalGpHtAv($id);
  2573.                     // FIN: Verificamos si es necesario actualizar las fechas de la reserva
  2574.                     // INICIO: Verificamos si es necesario actualizar el contrato de la reserva
  2575.                     $loungeContract $em->getRepository(DocContract::class)->findBy(array('companyId' => 7'fileId' => $id'modelId' => $reservationLounge->getIdLounge()));
  2576.                     if (empty($loungeContract)){
  2577.                         $loungeContract = new DocContract();
  2578.                         $loungeContract->setCompanyId(7);
  2579.                         $loungeContract->setModelId($reservationLounge->getIdLounge());
  2580.                         if (!empty($reserva->getClient())){ $loungeContract->setClientId($reserva->getClient()); }
  2581.                         $loungeContract->setFileId($reserva->getId());
  2582.                         $loungeContract->setCreatedId($user_id);
  2583.                         $loungeContract->setCreatedAt($now);
  2584.                     } else {
  2585.                         $loungeContract $loungeContract[0];
  2586.                     }
  2587.                     if ((isset($reservationGlobalLounge[$loungeDetails->getId()]))) {
  2588.                         $loungeContract->setContractualDocument($reservationGlobalLounge[$loungeDetails->getId()]['contract']);
  2589.                         $loungeContract->setBookingData($reservationGlobalLounge[$loungeDetails->getId()]['booking']);
  2590.                         $loungeContract->setDateAt(new DateTime($reservationGlobalLounge[$loungeDetails->getId()]['othersDateContract']));
  2591.                         $loungeContract->setClientProxy($reservationGlobalLounge[$loungeDetails->getId()]['othersClientProxy']);
  2592.                         $loungeContract->setClientJob($reservationGlobalLounge[$loungeDetails->getId()]['othersClientJob']);
  2593.                         $loungeContract->setUpdatedId($user_id);
  2594.                         $loungeContract->setUpdatedAt($now);
  2595.                     }
  2596.                     if (in_array($reserva->getStatus(), ['Confirmed''Invoiced'])) {       // Solo hacer el contrato si est confirmado o facturado
  2597.                         $em->persist($loungeContract);
  2598.                         $em->flush();
  2599.                     }
  2600.                 }
  2601.             }
  2602.         }
  2603.         return $this->redirectToRoute('reservations_greenpatio_edit_simple', array( 'id' => $id'token' => null'_fragment' => 'btn_quotes' ));
  2604.     }
  2605.     /**
  2606.      * @Route("/deleteitemservice/{idService}/{idReservation}", name="reservations_greenpatio_deleteitemservice")
  2607.      */
  2608.     public function deleteItemServiceAction($idService$idReservationEntityManagerInterface $emRequest $request)
  2609.     {
  2610.         $service $em->getRepository(ReservationService::class)->findOneById($idService);
  2611.         $em->remove($service);
  2612.         $em->flush();
  2613.         $event 'The Item has been deleted.';
  2614.         $successMessage $this->translator->trans($event);
  2615.         $this->addFlash('mensajereservation'$successMessage);
  2616.         return $this->redirectToRoute('reservations_greenpatio_edit_simple', array( 'id' => $idReservation'token' => null ));
  2617.     }
  2618.     /**
  2619.      * @Route("/updateservicegrid/{id}", name="reservations_greenpatio_updateservicegrid")
  2620.      */
  2621.     public function updateServiceGridAction($idEntityManagerInterface $emRequest $request)
  2622.     {
  2623.         $services $request->request->get('services');
  2624.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  2625.         $user_id $user_logueado->getId();
  2626.         $reserva $em->getRepository(Reservation::class)->findOneById($id);
  2627.         $comAvGp $request->request->get('comAvGp');
  2628.         $comHtGp $request->request->get('comHtGp');
  2629.         if (!empty($comAvGp)){
  2630.             if ($reserva->getComAvGp() !== $comAvGp){
  2631.                 $reserva->setComAvGp($comAvGp);
  2632.                 $em->persist($reserva);
  2633.                 $em->flush();
  2634.             }
  2635.         }
  2636.         if (!empty($comHtGp)){
  2637.             if ($reserva->getComHtGp() !== $comHtGp){
  2638.                 $reserva->setComHtGp($comHtGp);
  2639.                 $em->persist($reserva);
  2640.                 $em->flush();
  2641.             }
  2642.         }
  2643.         foreach ($services as $idService => $service) {
  2644.             $serviceOriginal $em->getRepository(ReservationService::class)->findOneById($idService);
  2645.             if (empty($serviceOriginal)){ $serviceOriginal = new ReservationService(); }
  2646.             $serviceOriginal->setSupplierId($service['supplier']);
  2647.             if ($serviceOriginal->getServiceCatId() == 15){
  2648.                 // Asistencia
  2649.                 if (array_key_exists('agent',$service)){
  2650.                     if (!empty($service['agent']) and ($service['agent'] > 0)){
  2651.                         $userx $em->getRepository("App\Entity\User")->findOneById($service['agent']);
  2652.                         $serviceOriginal->setName($userx->getName().' '.$userx->getLastName());
  2653.                         $serviceOriginal->setAssistantId($service['agent']);
  2654.                     } else {
  2655.                         //Asistencia de un FreeLance
  2656.                         if (!empty($service['agent']) and ($service['agent'] < 0)){
  2657.                             // FreeLance registrado en el sistema
  2658.                             $idUserFree = ($service['agent'] * (-1));
  2659.                             $userx $em->getRepository(ExternalUser::class)->findOneById($idUserFree);
  2660.                             $serviceOriginal->setName($userx->getName().' '.$userx->getLastName());
  2661.                             $serviceOriginal->setAssistantId($service['agent']);
  2662.                         } else {
  2663.                             $serviceOriginal->setName($service['name']);
  2664.                             $serviceOriginal->setAssistantId(null);
  2665.                         }
  2666.                     }
  2667.                 }
  2668.             } else {
  2669.                 $serviceOriginal->setName($service['name']);
  2670.             }
  2671.             $price $service['price'];
  2672.             if ($price === null) {
  2673.                 $priceToSet 0;
  2674.             } else {
  2675.                 $price str_replace('.'''$price);
  2676.                 $price str_replace(',''.'$price);
  2677.                 if (is_numeric($price)) {
  2678.                     $priceToSet $price;
  2679.                 } else {
  2680.                     $priceToSet $serviceOriginal->getPrice();
  2681.                 }
  2682.             }
  2683.             $serviceOriginal->setPrice($priceToSet);
  2684.             $serviceOriginal->setCurrency($service['currency']);
  2685.             $serviceOriginal->setUnits($service['units']);
  2686.             $serviceOriginal->setPax($service['pax']);
  2687.             $serviceOriginal->setOpCommission($service['opCommission']);
  2688.             $commission $service['commission'];
  2689.             if ($commission === null) {
  2690.                 $commissionToSet 0;
  2691.             } else {
  2692.                 $commission str_replace(',''.'$commission);
  2693.                 if (is_numeric($commission)) {
  2694.                     $commissionToSet $commission;
  2695.                 } else {
  2696.                     $commissionToSet $serviceOriginal->getCommission();
  2697.                 }
  2698.             }
  2699.             $serviceOriginal->setCommission($commissionToSet);
  2700.             $serviceOriginal->setOpOver($service['opOver']);
  2701.             $over $service['over'];
  2702.             if ($over === null) {
  2703.                 $overToSet 0;
  2704.             } else {
  2705.                 $over str_replace('.'''$over);
  2706.                 $over str_replace(',''.'$over);
  2707.                 if (is_numeric($over)) {
  2708.                     $overToSet $over;
  2709.                 } else {
  2710.                     $overToSet $serviceOriginal->getOver();
  2711.                 }
  2712.             }
  2713.             $serviceOriginal->setOver($overToSet);
  2714.             $serviceOriginal->setOpIva($service['opIva']);
  2715.             $serviceOriginal->setIva($service['iva']);
  2716.             if (array_key_exists('toinvoice',$service)){ $serviceOriginal->setToinvoice(true); } else { $serviceOriginal->setToinvoice(false); }
  2717.             if (array_key_exists('viewinfo',$service)){ $serviceOriginal->setViewInfo(true); } else { $serviceOriginal->setViewInfo(false); }
  2718.             $serviceOriginal->setDateInAt(new DateTime($service['dateInAt']. ' ' $service['start']));
  2719.             $serviceOriginal->setDateOutAt(new DateTime($service['dateOutAt']. ' ' $service['end']));
  2720.             $serviceOriginal->setUpdatedId($user_id);
  2721.             $serviceOriginal->setUpdatedAt(new DateTime('now'));
  2722.             try{
  2723.                 $em->persist($serviceOriginal);
  2724.                 $em->flush();
  2725.                 $event 'The Item has been updated.';
  2726.                 $successMessage $this->translator->trans($event);
  2727.                 $this->addFlash('mensajereservation'$successMessage);
  2728.             } catch (\Exception $e){
  2729.                 $event 'An error occurred: '.$e->getMessage();
  2730.                 $errorMessage $this->translator->trans($event);
  2731.                 $this->addFlash('mensajereservationerror'$errorMessage);
  2732.             }
  2733.             if(($serviceOriginal->getServiceCatId()==11) and ($serviceOriginal->getSupplierId()==4765)){
  2734.                 //Es un Catering de Higo&Trigo
  2735.                 $reserva->setCateringName('HIGO & TRIGO, S.L.');
  2736.                 $em->persist($reserva);
  2737.                 $em->flush();
  2738.             }
  2739.         }
  2740.         // Sincronizacion global
  2741.         $data $this->sincGpHtAvService->sincGlobalGpHtAv($id);
  2742.         // Sincronización con HT
  2743.         if (!empty($reserva)) {
  2744.             // Rafa indico que siempre se sincronice al abrir un expediente de GP
  2745.             if (in_array($reserva->getStatus(), [null'''Confirmed''Invoiced''Iniciado''Cotizado''Bloqueo'])) {
  2746.                 if ($reserva->getCateringName() == 'HIGO & TRIGO, S.L.') {
  2747.                     // Si no se ha creado aun el expediente de HT debemos crearlo
  2748.                     $htFile $em->getRepository(HtFile::class)->findByReservation($reserva);
  2749.                     if (empty($htFile)) {
  2750.                         return $this->redirectToRoute('sinc_gp_ht', array('id' => $id,));
  2751.                     }
  2752.                 }
  2753.             }
  2754.         }
  2755.         return $this->redirectToRoute('reservations_greenpatio_edit_simple', array( 'id' => $id'token' => null'_fragment' => 'btn_srv' ));
  2756.     }
  2757.     /**
  2758.      * @Route("/addloungegeneral", name="reservations_greenpatio_add_lounge_general")
  2759.      */
  2760.     public function addLoungeGeneralAction(EntityManagerInterface $emRequest $request)
  2761.     {
  2762.         $lounge $request->request->get('lounge_price');
  2763.         $yaExisteLounge $em->getRepository(ReservationLoungeDetails::class)->findOneByName($lounge['name']);
  2764.         if (!empty($yaExisteLounge)){
  2765.             //Si ya existe la sala con ese nombre se envia a la pantalla de edicion de la sala en cuestion
  2766.             $id $yaExisteLounge->getId();
  2767.             return $this->redirectToRoute('reservations_lounge_details', array( 'id' => $id ));
  2768.         }
  2769.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  2770.         $user_id $user_logueado->getId();
  2771.         $now = new DateTime('now');
  2772.         $loungeNew = new ReservationLoungeDetails();
  2773.         $loungeNew->setName($lounge['name']);
  2774.         $loungeNew->setMeters($lounge['meters']);
  2775.         $loungeNew->setLength($lounge['length']);
  2776.         $loungeNew->setWidth($lounge['width']);
  2777.         $loungeNew->setHeight($lounge['height']);
  2778.         $loungeNew->setCapSchool($lounge['capschool']);
  2779.         $loungeNew->setCapTheater ($lounge['captheater']);
  2780.         $loungeNew->setCapCocktail($lounge['capcocktail']);
  2781.         $loungeNew->setCapBanquet ($lounge['capbanquet']);
  2782.         $loungeNew->setCapImperial($lounge['capimperial']);
  2783.         $loungeNew->setCreatedId($user_id);
  2784.         $loungeNew->setCreatedAt($now);
  2785.         $loungeNew->setUpdatedId($user_id);
  2786.         $loungeNew->setUpdatedAt($now);
  2787.         try {
  2788.             $em->persist($loungeNew);
  2789.             $em->flush();
  2790.             $event 'The Item has been created.';
  2791.             $successMessage $this->translator->trans($event);
  2792.             $this->addFlash('mensajereservation'$successMessage);
  2793.         } catch (\Exception $e) {
  2794.             $event 'An error occurred: ' $e->getMessage();
  2795.             $errorMessage $this->translator->trans($event);
  2796.             $this->addFlash('mensajereservationerror'$errorMessage);
  2797.         }
  2798.         if (!empty($loungeNew->getId())){
  2799.             // Esto pertenece a otra entidad
  2800.             $loungeNewDescription = new ReservationLoungeDescription();
  2801.             $loungeNewDescription->setLoungeId($loungeNew->getId());
  2802.             $loungeNewDescription->setLanguage($lounge['language']);
  2803.             $loungeNewDescription->setDescription($lounge['description']);
  2804.             $loungeNewDescription->setCreatedId($user_id);
  2805.             $loungeNewDescription->setCreatedAt($now);
  2806.             $loungeNewDescription->setUpdatedId($user_id);
  2807.             $loungeNewDescription->setUpdatedAt($now);
  2808.             try {
  2809.                 $em->persist($loungeNewDescription);
  2810.                 $em->flush();
  2811.                 $event 'The Item has been created.';
  2812.                 $successMessage $this->translator->trans($event);
  2813.                 $this->addFlash('mensajereservation'$successMessage);
  2814.             } catch (\Exception $e) {
  2815.                 $event 'An error occurred: ' $e->getMessage();
  2816.                 $errorMessage $this->translator->trans($event);
  2817.                 $this->addFlash('mensajereservationerror'$errorMessage);
  2818.             }
  2819.             return $this->redirectToRoute('reservations_lounge_details', array( 'id' => $loungeNew->getId() ));
  2820.         }
  2821.         return $this->redirectToRoute('reservations_greenpatio_edit_general');
  2822.     }
  2823.     /**
  2824.      * @Route("/addloungedescription/{id}", name="reservations_greenpatio_add_lounge_description")
  2825.      */
  2826.     public function addLoungeDescriptionAction($idRequest $request)
  2827.     {
  2828.         $em $this->getDoctrine()->getManager();
  2829.         /* Obtengo usuario logueado */
  2830.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  2831.         $user_id $user_logueado->getId();
  2832.         $now = new DateTime('now');
  2833.         $loungeDescriptoin $request->request->get('lounge_description');
  2834.         if (empty($loungeDescriptoin['language']) or empty($loungeDescriptoin['description'])){ return $this->redirectToRoute('reservations_lounge_details', array('id' => $id)); }
  2835.         $newLoungeDescription = new reservationLoungeDescription();
  2836.         $newLoungeDescription->setLoungeId($id);
  2837.         $newLoungeDescription->setLanguage($loungeDescriptoin['language']);
  2838.         $newLoungeDescription->setDescription($loungeDescriptoin['description']);
  2839.         $newLoungeDescription->setCreatedId($user_id);
  2840.         $newLoungeDescription->setUpdatedId($user_id);
  2841.         $newLoungeDescription->setCreatedAt($now);
  2842.         $newLoungeDescription->setUpdatedAt($now);
  2843.         try {
  2844.             $em->persist($newLoungeDescription);
  2845.             $em->flush();
  2846.             $event 'The Item has been created.';
  2847.             $successMessage 'El elemento ha sido creado.';
  2848.             $this->addFlash('mensajereservation'$successMessage);
  2849.         } catch (\Exception $e) {
  2850.             $event 'An error occurred: ' $e->getMessage();
  2851.             $errorMessage $this->translator->trans($event);
  2852.             $this->addFlash('mensajereservationerror'$errorMessage);
  2853.         }
  2854.         return $this->redirectToRoute('reservations_lounge_details', array('id' => $id));
  2855.     }
  2856.     /**
  2857.      * @Route("/addwebinfo/{id}", name="reservations_greenpatio_add_web_info")
  2858.      * Actualiza la información de la sala a presentar en la web, que esta almacenada por defecto
  2859.      * Actualiza la información del contrato
  2860.      */
  2861.     public function addLoungeWebInfoAction($idEntityManagerInterface $emRequest $request)
  2862.     {
  2863.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  2864.         $user_id $user_logueado->getId();
  2865.         $now = new \DateTimeImmutable('now');
  2866.         $lounge $em->getRepository(ReservationLoungeDetails::class)->findOneById($id);
  2867.         if (empty($lounge)) {
  2868.             $this->addFlash('mensajereservationerror''Error, no se ha encontrado la sala con ID: '.$id);
  2869.             return $this->redirectToRoute('reservations_greenpatio_edit_general');
  2870.         }
  2871.         $loungeWebDescription $request->request->get('lounge_web_description') ?? [];
  2872.         foreach ($loungeWebDescription as $key => $descriptions) {
  2873.             $loungeDetail $em->getRepository(ReservationLoungeWebDescription::class)->findOneBy(array('lounge' => $lounge'language' => $key));
  2874.             if (empty($loungeDetail)) {
  2875.                 $loungeDetail = new ReservationLoungeWebDescription();
  2876.                 $loungeDetail->setLounge($lounge);
  2877.                 $loungeDetail->setLanguage($key);
  2878.                 $loungeDetail->setCreatedId($user_logueado);
  2879.             }
  2880.             $loungeDetail->setImportantDescription($descriptions['importantDescription']);
  2881.             $loungeDetail->setImportantDescGeneralText($descriptions['importantDescGeneralText']);
  2882.             $loungeDetail->setImportantDescSchedules($descriptions['importantDescSchedules']);
  2883.             $loungeDetail->setImportantDescParking($descriptions['importantDescParking']);
  2884.             $loungeDetail->setUpdatedId($user_logueado);
  2885.             $em->persist($loungeDetail);
  2886.             
  2887.             $loungeContract $em->getRepository(DocContractModel::class)->findOneBy(array('modelId' => $id'companyId' => 7'language' => $key));
  2888.             if (empty($loungeContract)){
  2889.                 $loungeContract = new DocContractModel();
  2890.                 $loungeContract->setModelId($id);
  2891.                 $loungeContract->setLanguage($key);
  2892.                 $loungeContract->setCompanyId(7);
  2893.                 $loungeContract->setCreatedId($user_id);
  2894.             }
  2895.             $loungeContract->setContractualDocument($descriptions['contractualDocument']);
  2896.             $loungeContract->setUpdatedId($user_id);
  2897.     
  2898.             $em->persist($loungeContract);
  2899.         }
  2900.         $em->flush();
  2901.         return $this->redirectToRoute('reservations_lounge_details', array('id' => $id));
  2902.     }
  2903.     /**
  2904.      * @Route("/updatedescritiongrid/{id}", name="reservations_greenpatio_updatedescriptiongrid")
  2905.      */
  2906.     public function updateDescriptionGridAction($idRequest $request)
  2907.     {
  2908.         $descriptions $request->request->get('description');
  2909.         $em $this->getDoctrine()->getManager();
  2910.         /* Obtengo usuario logueado */
  2911.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  2912.         $user_id $user_logueado->getId();
  2913.         foreach ($descriptions as $idDesc => $description) {
  2914.             $descriptionOriginal $em->getRepository(ReservationLoungeDescription::class)->findOneById($idDesc);
  2915.             $descriptionOriginal->setLanguage($description['language']);
  2916.             $descriptionOriginal->setDescription($description['text']);
  2917.             $descriptionOriginal->setUpdatedId($user_id);
  2918.             $descriptionOriginal->setUpdatedAt(new DateTime('now'));
  2919.             try{
  2920.                 $em->persist($descriptionOriginal);
  2921.                 $em->flush();
  2922.                 $event 'The Item has been updated.';
  2923.                 $successMessage 'El elemento ha sido actualizado.';
  2924.                 $this->addFlash('mensajereservation'$successMessage);
  2925.             } catch (\Exception $e){
  2926.                 $event 'An error occurred: '.$e->getMessage();
  2927.                 $errorMessage $this->translator->trans($event);
  2928.                 $this->addFlash('mensajereservationerror'$errorMessage);
  2929.             }
  2930.         }
  2931.         return $this->redirectToRoute('reservations_lounge_details', array( 'id' => $id ));
  2932.     }
  2933.     /**
  2934.      * @Route("/addloungepicture/{id}", name="reservations_greenpatio_add_lounge_picture")
  2935.      */
  2936.     public function addLoungePictureAction($idEntityManagerInterface $emRequest $request//, LoggerInterface $logger)
  2937.     {
  2938.         /* Obtengo usuario logueado */
  2939.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  2940.         $user_id $user_logueado->getId();
  2941.         $now = new DateTime('now');
  2942.         $picturefiles $request->files->all();
  2943.         $loungeId $id;
  2944.         $imagenes $picturefiles['loungepicturegallery'];
  2945.         $data $loungeId;
  2946.         if(!empty($imagenes['image1']) || !empty($imagenes['image2']) || !empty($imagenes['image3']) || !empty($imagenes['image4']) || !empty($imagenes['image5'])){
  2947.             $num 0;
  2948.             foreach($imagenes as $img){
  2949.                 $num $num;
  2950.                 if (!is_null($img)){ $data $this->CargarImgGalleryAction($loungeId$img$num$request); } //, $logger);
  2951.             }
  2952.         } else {
  2953.             $errorMessage $this->translator->trans('Error, some fields are empty');
  2954.             $this->addFlash('mensajegalleryerror'$errorMessage);
  2955.         }
  2956.         return $this->redirectToRoute('reservations_lounge_details', array('id' => $id));
  2957.     }
  2958.     protected function CargarImgGalleryAction($loungeId$image$numRequest $request//, LoggerInterface $logger)
  2959.     {
  2960.         $gallery = new ReservationLoungePicture();
  2961.         $gallery->setLoungeId($loungeId);
  2962.         $gallery->setCreatedAt(new DateTime('now'));
  2963.         $gallery->setUpdatedAt(new DateTime('now'));
  2964.         $gallery->setTitle(null);
  2965.         if ($num == -1){$gallery->setTitle('Blueprint');}
  2966.         if ($num == 'TEATRO'){$gallery->setTitle('Teatro');}
  2967.         if ($num == 'COCTEL'){$gallery->setTitle('Coctel');}
  2968.         if ($num == 'ESCUELA'){$gallery->setTitle('Escuela');}
  2969.         $id $loungeId;
  2970.         /* Carga de imagenes */
  2971.         $calidad "90";
  2972.         $calidadpng "9";
  2973.         $imageName md5(rand() * time());
  2974.         $camino "assets/images/greenpatio/lounges/";
  2975.         $extension $image->guessExtension();
  2976.         $entrada 'si';
  2977.         $image_id $imageName.'.'.$extension;
  2978.         $image_temp $id.'-'.$imageName.'.'.$extension;
  2979.         $image->move($camino$image_temp);
  2980.         // Nombres image
  2981.         $s="small-";
  2982.         $m="medium-";
  2983.         $l="large-";
  2984.         ########################
  2985.         # Copiar imagen 300 x Altura
  2986.         ########################
  2987.         $datos getimagesize($camino.$image_temp);
  2988.         $anchura "300";
  2989.         $altura "190";
  2990.         $thumb imagecreatetruecolor($anchura,$altura);
  2991.         switch ($extension) {
  2992.             case 'jpeg':
  2993.                 $img imagecreatefromjpeg($camino.$image_temp);
  2994.                 imagecopyresampled ($thumb$img0000$anchura$altura$datos[0], $datos[1]);
  2995.                 imagejpeg($thumb,$camino.$s.$image_id$calidad);
  2996.                 break;
  2997.             case 'png':
  2998.                 $img imagecreatefrompng($camino.$image_temp);
  2999.                 imagecopyresampled ($thumb$img0000$anchura$altura$datos[0], $datos[1]);
  3000.                 imagepng($thumb,$camino.$s.$image_id$calidadpng);
  3001.                 break;
  3002.             case 'gif':
  3003.                 $img imagecreatefromgif($camino.$image_temp);
  3004.                 imagecopyresampled ($thumb$img0000$anchura$altura$datos[0], $datos[1]);
  3005.                 imagegif($thumb,$camino.$s.$image_id);
  3006.                 break;
  3007.         }
  3008.         ########################
  3009.         # Copiar imagen 600 x Altura
  3010.         ########################
  3011.         $datos2 getimagesize($camino.$image_temp);
  3012.         $anchura2="600";
  3013.         $ratio2 = ($datos2[0] / $anchura2);
  3014.         $altura2 round($datos2[1] / $ratio2);
  3015.         $thumb2 imagecreatetruecolor($anchura2,$altura2);
  3016.         switch ($extension) {
  3017.             case 'jpeg':
  3018.                 $img2 imagecreatefromjpeg($camino.$image_temp);
  3019.                 imagecopyresampled ($thumb2$img20000$anchura2$altura2$datos2[0], $datos2[1]);
  3020.                 imagejpeg($thumb2,$camino.$m.$image_id$calidad);
  3021.                 break;
  3022.             case 'png':
  3023.                 $img2 imagecreatefrompng($camino.$image_temp);
  3024.                 imagecopyresampled ($thumb2$img20000$anchura2$altura2$datos2[0], $datos2[1]);
  3025.                 imagepng($thumb2,$camino.$m.$image_id$calidadpng);
  3026.                 break;
  3027.             case 'gif':
  3028.                 $img2 imagecreatefromgif($camino.$image_temp);
  3029.                 imagecopyresampled ($thumb2$img20000$anchura2$altura2$datos2[0], $datos2[1]);
  3030.                 imagegif($thumb2,$camino.$m.$image_id);
  3031.                 break;
  3032.         }
  3033.         ########################
  3034.         # Copiar imagen 1600 x Altura
  3035.         ########################
  3036.         $datos3 getimagesize($camino.$image_temp);
  3037.         $anchura3="1600";
  3038.         $ratio3 = ($datos3[0] / $anchura3);
  3039.         $altura3 round($datos3[1] / $ratio3);
  3040.         $thumb3 imagecreatetruecolor($anchura3,$altura3);
  3041.         switch ($extension) {
  3042.             case 'jpeg':
  3043.                 $img3 imagecreatefromjpeg($camino.$image_temp);
  3044.                 imagecopyresampled ($thumb3$img30000$anchura3$altura3$datos3[0], $datos3[1]);
  3045.                 imagejpeg($thumb3,$camino.$l.$image_id$calidad);
  3046.                 break;
  3047.             case 'png':
  3048.                 $img3 imagecreatefrompng($camino.$image_temp);
  3049.                 imagecopyresampled ($thumb3$img30000$anchura3$altura3$datos3[0], $datos3[1]);
  3050.                 imagepng($thumb3,$camino.$l.$image_id$calidadpng);
  3051.                 break;
  3052.             case 'gif':
  3053.                 $img3 imagecreatefromgif($camino.$image_temp);
  3054.                 imagecopyresampled ($thumb3$img30000$anchura3$altura3$datos3[0], $datos3[1]);
  3055.                 imagegif($thumb3,$camino.$l.$image_id);
  3056.                 break;
  3057.         }
  3058.         ########################
  3059.         # borrar imagen original
  3060.         ########################
  3061.         $imagen_borrar$camino.$image_temp;
  3062.         unlink($imagen_borrar);
  3063.         $gallery->setImageSmall($s.$image_id);
  3064.         $gallery->setImageMedium($m.$image_id);
  3065.         $gallery->setImageLarge($l.$image_id);
  3066.         /* Fin Carga de imagenes */
  3067.         /* Obtengo usuario logueado */
  3068.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  3069.         $user_id $user_logueado->getId();
  3070.         $gallery->setCreatedId($user_id);
  3071.         $gallery->setUpdatedId($user_id);
  3072.         $em $this->getDoctrine()->getManager();
  3073.         /* Gestión de eventos en Log */
  3074.         $user_lastname $user_logueado->getLastname();
  3075.         $user_name $user_logueado->getName();
  3076.         $user_email $user_logueado->getEmail();
  3077.         $user_rol $user_logueado->getRoles();
  3078.         $event_url $request->getPathInfo();
  3079.         $event_complete $user_name.' '.$user_lastname.' - '.$user_email.' - '.$user_rol[0].' | '.$event_url;
  3080.         try{
  3081.             $em->persist($gallery);
  3082.             $em->flush();
  3083.             $event 'Images from this supplier have been uploaded.';
  3084.             $successMessage $this->translator->trans($event);
  3085.             $this->addFlash('mensajegallery'$successMessage);
  3086.         } catch (\Exception $e){
  3087.             $event 'An error occurred: '.$e->getMessage().' | transport';
  3088.             /* Para el usuario */
  3089.             $errorMessage $this->translator->trans($event);
  3090.             $this->addFlash('mensajegalleryerror'$errorMessage);
  3091.         }
  3092.         /* Fin Gestión de eventos en Log */
  3093.         return $id;
  3094.     }
  3095.     /**
  3096.      * @Route("/addloungevideo/{id}", name="reservations_greenpatio_add_lounge_video")
  3097.      */
  3098.     public function addLoungeVideoAction($idEntityManagerInterface $emRequest $request//, LoggerInterface $logger)
  3099.     {
  3100.         /* Obtengo usuario logueado */
  3101.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  3102.         $user_id $user_logueado->getId();
  3103.         $now = new DateTime('now');
  3104.         $urlvideo $request->request->get('loungevideo');
  3105.         $urlvideo $urlvideo['urlvideo'];
  3106.         $loungeId $id;
  3107.         if(!empty($urlvideo)){
  3108.             switch (true) {
  3109.                 case strpos($urlvideo'youtube'):
  3110.                     $patron '%^ (?:https?://)? (?:www\.)? (?: youtu\.be/ | youtube\.com (?: /embed/ | /v/ | /watch\?v= ) ) ([\w-]{10,12}) ($|&).* $%x';
  3111.                     preg_match($patron$urlvideo$parte);
  3112.                     $urvideo_final 'https://www.youtube.com/embed/'$parte[1];
  3113.                     break;
  3114.                 case strpos($urlvideo'youtu'):
  3115.                     $patron '%^ (?:https?://)? (?:www\.)? (?: youtu\.be/ | youtube\.com (?: /embed/ | /v/ | /watch\?v= ) ) ([\w-]{10,12}) ($|&).* $%x';
  3116.                     preg_match($patron$urlvideo$parte);
  3117.                     $urvideo_final 'https://www.youtube.com/embed/'$parte[1];
  3118.                     break;
  3119.                 case strpos($urlvideo'vimeo'):
  3120.                     $patron '%^https?:\/\/(?:www\.|player\.)?vimeo.com\/(?:channels\/(?:\w+\/)?|groups\/([^\/]*)\/videos\/|album\/(\d+)\/video\/|video\/|)(\d+)(?:$|\/|\?)(?:[?]?.*)$%im';
  3121.                     preg_match($patron$urlvideo$parte);
  3122.                     $urvideo_final 'https://player.vimeo.com/video/'$parte[3];
  3123.                     break;
  3124.             }
  3125.             if(!empty($urlvideo) && !empty($urvideo_final) ){
  3126.                 $video = new ReservationLoungeVideo();
  3127.                 $video->setCreatedId($user_id);
  3128.                 $video->setUpdatedId($user_id);
  3129.                 $video->setVideo($urvideo_final);
  3130.                 $video->setLoungeId($loungeId);
  3131.                 $video->setCreatedAt($now);
  3132.                 $video->setUpdatedAt($now);
  3133.                 $em->persist($video);
  3134.                 $em->flush();
  3135.             }
  3136.         }
  3137.         if (empty($urlvideo)){
  3138.             $errorMessage $this->translator->trans('Error, some fields are empty');
  3139.             $this->addFlash('mensajegalleryerror'$errorMessage);
  3140.         }
  3141.         return $this->redirectToRoute('reservations_lounge_details', array('id' => $id));
  3142.     }
  3143.     /**
  3144.      * @Route("/deleteloungevideo/{id}", name="reservations_greenpatio_delete_lounge_video")
  3145.      */
  3146.     public function deleteLoungeVideoAction($idEntityManagerInterface $emRequest $request//, LoggerInterface $logger)
  3147.     {
  3148.         $video $em->getRepository(ReservationLoungeVideo::class)->findOneById($id);
  3149.         $idLounge $video->getLoungeId();
  3150.         try{
  3151.             $em->remove($video);
  3152.             $em->flush();
  3153.             $successMessage 'El elemento ha sido eliminado.';
  3154.             $this->addFlash('mensajereservation'$successMessage);
  3155.         } catch (\Exception $e){
  3156.             $event 'An error occurred: '.$e->getMessage();
  3157.             $errorMessage $this->translator->trans($event);
  3158.             $this->addFlash('mensajereservationerror'$errorMessage);
  3159.         }
  3160.         return $this->redirectToRoute('reservations_lounge_details', array('id' => $idLounge));
  3161.     }
  3162.     /**
  3163.      * @Route("/addloungeblueprints/{id}", name="reservations_greenpatio_add_lounge_blueprints")
  3164.      */
  3165.     public function addLoungeBlueprintsAction($idEntityManagerInterface $emRequest $request//, LoggerInterface $logger)
  3166.     {
  3167.         /* Obtengo usuario logueado */
  3168.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  3169.         $user_id $user_logueado->getId();
  3170.         $now = new DateTime('now');
  3171.         $picturefiles $request->files->all();
  3172.         $loungeId $id;
  3173.         $imagen $picturefiles['loungepicturegalleryblueprints'];
  3174.         $data $loungeId;
  3175.         if(!empty($imagen)){
  3176.             $num = -1;
  3177.             $data $this->CargarImgGalleryAction($loungeId$imagen$num$request); //, $logger);
  3178.         } else {
  3179.             $errorMessage $this->translator->trans('Error, some fields are empty');
  3180.             $this->addFlash('mensajegalleryerror'$errorMessage);
  3181.         }
  3182.         return $this->redirectToRoute('reservations_lounge_details', array('id' => $id));
  3183.     }
  3184.    /**
  3185.      * @Route("/addpicturemounting/{id}", name="reservations_greenpatio_add_lounge_picture_mounting")
  3186.      */
  3187.     public function addLoungePictureMountingAction($idEntityManagerInterface $emRequest $request//, LoggerInterface $logger)
  3188.     {
  3189.         /* Obtengo usuario logueado */
  3190.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  3191.         $user_id $user_logueado->getId();
  3192.         $now = new DateTime('now');
  3193.         $picturefiles $request->files->all();
  3194.         $loungeId $id;
  3195.         $imagen $picturefiles['picturemounting'];
  3196.         $data $loungeId;
  3197.         if(!empty($imagen)){
  3198.             $num $request->request->get('picturemounting');
  3199.             $num $num['type'];
  3200.             $data $this->CargarImgGalleryAction($loungeId$imagen$num$request); //, $logger);
  3201.         }else{
  3202.             $errorMessage $this->translator->trans('Error, some fields are empty');
  3203.             $this->addFlash('mensajegalleryerror'$errorMessage);
  3204.         }
  3205.         return $this->redirectToRoute('reservations_lounge_details', array('id' => $id));
  3206.     }
  3207.    /**
  3208.      * @Route("/updatedimmensions/{id}", name="update_dimmensions")
  3209.      */
  3210.     public function updateDimmensionsAction($idEntityManagerInterface $emRequest $request)
  3211.     {
  3212.         $lounge $em->getRepository(ReservationLoungeDetails::class)->findOneById($id);
  3213.         $newData $request->request->get('loungedimmensions');
  3214.         $lounge->setMeters($newData['meters']);
  3215.         $lounge->setLength($newData['length']);
  3216.         $lounge->setWidth($newData['width']);
  3217.         $lounge->setHeight($newData['height']);
  3218.         $lounge->setCapSchool($newData['capSchool']);
  3219.         $lounge->setCapTheater($newData['capTheater']);
  3220.         $lounge->setCapCocktail($newData['capCocktail']);
  3221.         $lounge->setCapBanquet($newData['capBanquet']);
  3222.         $lounge->setCapImperial($newData['capImperial']);
  3223.         /* Obtengo usuario logueado */
  3224.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  3225.         $user_id $user_logueado->getId();
  3226.         $now = new DateTime('now');
  3227.         $lounge->setUpdatedId($user_id);
  3228.         $lounge->setUpdatedAt($now);
  3229.         try{
  3230.             $em->persist($lounge);
  3231.             $em->flush();
  3232.             $event 'The Note has been created succesfully.';
  3233.             $successMessage $this->translator->trans($event);
  3234.             $this->addFlash('mensaje'$successMessage);
  3235.         } catch (\Exception $e){
  3236.             $event 'An error occurred: '.$e->getMessage();
  3237.             /* Para el usuario */
  3238.             $errorMessage $this->translator->trans($event);
  3239.             $this->addFlash('mensajeerror'$errorMessage);
  3240.         }
  3241.         return $this->redirectToRoute('reservations_lounge_details', array('id' => $id));
  3242.     }
  3243.     /**
  3244.      * @Route("/addvisit", name="reservations_greenpatio_addvisit")
  3245.      */
  3246.     public function addVisitAction(EntityManagerInterface $emRequest $request)
  3247.     {
  3248.         $year date('Y') - 1;
  3249.         $diaInicio = new DateTime($year.'-01-01 00:00:00');
  3250.         // Se buscan las visitas del año pasado en adelante (RAFA)
  3251.         $parameters = array( 'diaInicio' => $diaInicio, );
  3252.         $dql 'SELECT i
  3253.                 FROM GreenPatioBundle:ReservationVisit i
  3254.                 WHERE  i.dateStart > :diaInicio';
  3255.         $query $em->createQuery($dql)->setParameters($parameters);
  3256.         $visitas $query->getResult();
  3257.         $qb $em->createQueryBuilder();
  3258.         $qb->select('r.id, r.title')
  3259.             ->from(Reservation::class, 'r');
  3260.         $listAllReservas $qb->getQuery()->getArrayResult();
  3261.         $agentsGp = [];     //arreglo con los agentes de Green Patio
  3262.         $allUsers[] = $em->getRepository(User::class)->findAll();
  3263.         $agentsGp $em->getRepository(User::class)->findBy(['userrol' => [49,53]]);
  3264.         $parameters = [];
  3265.         $dql 'SELECT i
  3266.                 FROM GreenPatioBundle:ReservationLoungeDetails i
  3267.                 ORDER BY i.rankLounge';
  3268.         $query $em->createQuery($dql)->setParameters($parameters);
  3269.         $loungeDetails $query->getResult();
  3270.         return $this->render('MDS/GreenPatioBundle/reservations/add-visit.html.twig',
  3271.             array(
  3272.                 'visitas' => $visitas,
  3273.                 'agentsGp' => $agentsGp,
  3274.                 'listAllReservas' => $listAllReservas,
  3275.                 'loungeDetails' => $loungeDetails,
  3276.             )
  3277.         );
  3278.     }
  3279.     /**
  3280.      * @Route("/createvisit", name="reservations_greenpatio_createvisit")
  3281.      */
  3282.     public function createVisitAction(EntityManagerInterface $emRequest $request)
  3283.     {
  3284.         $newRequest $request->request->get('visit');
  3285.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  3286.         $user_id $user_logueado->getId();
  3287.         if (!empty($newRequest['date']) and !empty($newRequest['time'])){ $dateStart = new DateTime ($newRequest['date']. ' '.$newRequest['time']); } else { $dateStart = new DateTime ('now'); }
  3288.         if (!empty($newRequest['time'])) {
  3289.             $hourStart substr($newRequest['time'], 02);
  3290.             $minStart substr($newRequest['time'], 32);
  3291.             $hourEnd substr($newRequest['time'],0,2) + 1;
  3292.             $minEnd substr($newRequest['time'],3,2);
  3293.         } else {
  3294.             $hourStart '12';
  3295.             $minStart '00';
  3296.             $hourEnd '13';
  3297.             $minEnd '00';
  3298.         }
  3299.         if (!empty($newRequest['agent'])) { $agent $em->getRepository(User::class)->findOneById($newRequest['agent']); } else { $agent $em->getRepository(User::class)->findOneById(82); }
  3300.         $title '';
  3301.         if (!empty($newRequest['name'])){ $title $newRequest['name']; }
  3302.         if (!empty($newRequest['idreservation'])){
  3303.             $res $em->getRepository(Reservation::class)->findOneById($newRequest['idreservation']);
  3304.             if (!empty($title)) { $title $title ' - ' $res->getTitle(); } else { $title $res->getTitle(); }
  3305.         } else {
  3306.             // NO SE ESPECIFICO LA RESERVA
  3307.             if (!empty($title)) { $title 'NO SE ESPECIFICO LA RESERVA - '$title; } else { $title 'NO SE ESPECIFICO LA RESERVA'; }
  3308.         }
  3309.         $newVisit = new ReservationVisit();
  3310.         $newVisit->setAgentId($agent->getId());
  3311.         $newVisit->setDateStart($dateStart);
  3312.         $newVisit->setDateEnd($dateStart);
  3313.         if (!empty($newRequest['time'])) {
  3314.             $newVisit->setHourStart($hourStart);
  3315.             $newVisit->setMinStart($minStart);
  3316.             $newVisit->setHourEnd($hourEnd);
  3317.             $newVisit->setMinEnd($minEnd);
  3318.         } else {
  3319.             $newVisit->setHourStart($hourStart);
  3320.             $newVisit->setMinStart($minStart);
  3321.             $newVisit->setHourEnd($hourEnd);
  3322.             $newVisit->setMinEnd($minEnd);
  3323.         }
  3324.         $newVisit->setLoungeName($title.' - '.'Visita '.$agent->getName());
  3325.         if (!empty($newRequest['loungeIdDetais'])){ $newVisit->setIdLoungeDetails($newRequest['loungeIdDetais']); }
  3326.         if (!empty($newRequest['idreservation'])) { $newVisit->setIdReservation($newRequest['idreservation']); } else { $newVisit->setIdReservation(null); }
  3327.         $newVisit->setType('Visit');
  3328.         $newVisit->setCreatedAt(new DateTime ('now'));
  3329.         $newVisit->setCreatedId($user_id);
  3330.         $newVisit->setUpdatedAt(new DateTime ('now'));
  3331.         $newVisit->setUpdatedId($user_id);
  3332.         $location = (!empty($newRequest['location'])) ? $newRequest['location'] : 0;
  3333.         $newVisit->setIdLounge($location);
  3334.         $em->persist($newVisit);
  3335.         $em->flush();
  3336.         return $this->redirectToRoute('reservations_greenpatio_addvisit');
  3337.     }
  3338.     /**
  3339.      * @Route("/deletevisit/{id}", name="get_reservations_deletevisit")
  3340.      */
  3341.     public function deleteVisitAction($idEntityManagerInterface $emRequest $request) {
  3342.         $visit $em->getRepository(ReservationVisit::class)->findOneById($id);
  3343.         if (!empty($visit)){
  3344.             $em->remove($visit);
  3345.             $em->flush();
  3346.         }
  3347.         return $this->redirectToRoute('reservations_greenpatio_addvisit');
  3348.     }
  3349.     /**
  3350.      * @Route("/sendconfirmationrequestmail/{id}/{initStatus}", name="reservations_greenpatio_send_confirmation_request_mail")
  3351.      * Enviar correo a Salvador y Rafael Guerrero para que la reserva (id) pase al estado confirmado. Con un status previo de initStatus
  3352.      */
  3353.     public function sendConfirmationRequestMailAction($id$initStatusEntityManagerInterface $emRequest $request){
  3354.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  3355.         $user_id $user_logueado->getId();
  3356.         $mailArrayTo = []; $mailAlert = [];
  3357.         $mailArrayTo['salvador@avexpress.tv'] = 'salvador@avexpress.tv';
  3358.         $mailArrayTo['rafael.guerrero@inout-travel.com'] = 'rafael.guerrero@inout-travel.com';
  3359.         $dataGP $this->disponibilidadGreenPatio($id$initStatus);
  3360.         $dataAV $this->disponibilidadAvExpress($id);
  3361.         $dataLounges = array();
  3362.         foreach ($dataGP as $item){
  3363.             $lounges $em->getRepository(ReservationLoungeSimple::class)->findBy(array('idReservation'=>$item->getId(),'type'=>null));
  3364.             foreach ($lounges as $elem){ $dataLounges[$item->getId()][] = $elem; }
  3365.         }
  3366.         $reserva $em->getRepository(Reservation::class)->findOneById($id);
  3367.         $agente $em->getRepository(User::class)->findOneById($user_id);
  3368.         $mailAddressFrom $agente->getEmail();
  3369.         $mailSubject 'Confirmación de reserva: '.$reserva->getTitle();
  3370.         $mensajePopup '';
  3371.         $mailBody 'Estimado administrador,'.
  3372.             '<br><br>'$agente->getName().' '$agente->getLastName(). ' ha solicitado la confirmación de la reserva:'.
  3373.             '<br><br>'.$reserva->getTitle(). ' con ID: '.$reserva->getId().
  3374.             '<br>Este evento incia el día '.$reserva->getDateStart()->format('d/m/Y').' a las '.$reserva->getDateStart()->format('H:i'). ' y finaliza el día '.$reserva->getDateEnd()->format('d/m/Y').' a las '.$reserva->getDateEnd()->format('H:i').'<br><br><br>';
  3375.         if (!empty($dataGP) or !empty($dataAV)){
  3376.             if(!empty($dataGP)){
  3377.                 $mensajePopup .= 'No se puede CONFIRMAR, conflicto con:'.'<br><br>';
  3378.                 // Conflictos con otros eventos en Green Patio
  3379.                 $mailSubject '⚠️ ALERTA️ ‼️ DOBLE CONFIRMADO MISMA SALA' $mailSubject;
  3380.                 $mailBody $mailBody 'Este evento coincide con la(s) reserva(s): <br>';
  3381.                 foreach ($dataGP as $res){
  3382.                     $mailBody $mailBody 'Reserva: '.$res->getTitle().', con ID: '.$res->getId().', fecha de inicio: '.$res->getDateStart()->format('d/m/Y').' a las '.$res->getDateStart()->format('H:i').', fecha de finalización: '.$res->getDateEnd()->format('d/m/Y').' a las '.$res->getDateEnd()->format('H:i');
  3383.                     if(!empty($dataLounges[$res->getId()])){
  3384.                         $mailBody $mailBody .', Salas: ';
  3385.                         foreach ($dataLounges[$res->getId()] as $loungeItem){ $mailBody $mailBody $loungeItem->getLoungeName().', '; }
  3386.                         $mailBody $mailBody .'<br>';
  3387.                     }
  3388.                     $mensajePopup .='Reserva: '.$res->getTitle().', con ID: '.$res->getId().'<br>';
  3389.                 }
  3390.                 $mailBody $mailBody '<br><br>';
  3391.             }
  3392.             if(!empty($dataAV)){
  3393.                 // Conflictos con otros eventos de AvExpress
  3394.                 $mailBody $mailBody 'Este evento coincide en AV con el expediente(s): <br>';
  3395.                 foreach ($dataAV as $file){
  3396.                     $mailBody $mailBody 'Expediente: '.$file->getTitle().', con ID: '.$file->getId().', fecha de inicio: '.$file->getDateStart()->format('d/m/Y H:i').', fecha de finalización: '.$file->getDateEnd()->format('d/m/Y H:i').'<br>';
  3397.                 }
  3398.             }
  3399.             $mailAlert = array('mailBody' => $mailBody'mailSubject' => $mailSubject);
  3400.         }
  3401.         $mailBody $mailBody .'<br><br><a href="https://inout.mante.solutions/reservations-greenpatio/">CALENDARIO GREEN PATIO</a>';
  3402.         $mailBody $mailBody .'<br><br> <a href="https://inout.mante.solutions/reservations-greenpatio/adminconfirmres/y/'.$id.'">"SI"</a> deseo confirmar la reserva.';
  3403.         $mailBody $mailBody .'<br><br> <a href="https://inout.mante.solutions/reservations-greenpatio/adminconfirmres/n/'.$id.'">"NO"</a> deseo confirmar la reserva.';
  3404.         $mailBody $mailBody .'<br><br><br> <a href="https://inout.mante.solutions">"PARA QUE LOS ENLACES FUNCIONEN, ANTES DEBES INCIAR SESION"</a><br><br>';
  3405.         // Se envia el correo pidiendo la confirmacion
  3406.         $this->sendMailLot($mailAddressFrom$mailArrayTo$mailSubject$mailBody);
  3407.         //Alerta a Gabriela, Agente modificador del expediente y Mariale
  3408.         if (!empty($dataGP)){
  3409.             $mailArrayTo = [];
  3410.             $agentAlert $em->getRepository(User::class)->findOneById($reserva->getUpdatedBy());
  3411.             if (!empty($agentAlert) and ($agentAlert->getStatus() == 1)){ $mailArrayTo[$agentAlert->getEmail()] = $agentAlert->getEmail(); }
  3412.             $agentAlert $em->getRepository(User::class)->findOneById(82);         // Gabriela Bracho
  3413.             if (!empty($agentAlert) and ($agentAlert->getStatus() == 1)){ $mailArrayTo[$agentAlert->getEmail()] = $agentAlert->getEmail(); }
  3414.             $agentAlert $em->getRepository(User::class)->findOneById(129);         // Maria Alejandra Martinez
  3415.             if (!empty($agentAlert) and ($agentAlert->getStatus() == 1)){ $mailArrayTo[$agentAlert->getEmail()] = $agentAlert->getEmail(); }
  3416.             $this->sendMailLot($mailAddressFrom$mailArrayTo$mailSubject$mailAlert['mailBody']);
  3417.         }
  3418.         if (!empty($mensajePopup)){ $this->addFlash('mensajereservationerror'$mensajePopup); }
  3419.         // Sincronización con HT
  3420.         if (!empty($reserva)) {
  3421.             // Rafa indico que siempre se sincronice al abrir un expediente de GP
  3422.             if (in_array($reserva->getStatus(), [null'''Confirmed''Invoiced''Iniciado''Cotizado''Bloqueo'])) {
  3423.                 if ($reserva->getCateringName() == 'HIGO & TRIGO, S.L.') {
  3424.                     // Si no se ha creado aun el expediente de HT debemos crearlo
  3425.                     $htFile $em->getRepository(HtFile::class)->findByReservation($reserva);
  3426.                     if (empty($htFile)) { return $this->redirectToRoute('sinc_gp_ht', array('id' => $id,)); }
  3427.                 }
  3428.             }
  3429.         }
  3430.         // Sincronización con Av Express
  3431.         $cotizable $this->laReservaEsCotizable($reserva->getId());
  3432.         if ($cotizable) {
  3433.             $AveFile $em->getRepository(AveFiles::class)->findByReservation($reserva);
  3434.             // Rafa indico que siempre se sincronice al abrir un expediente de GP
  3435.             if (in_array($reserva->getStatus(), [null'''Confirmed''Invoiced''Iniciado''Cotizado''Bloqueo'])) {
  3436.                 if (empty($AveFile)) {
  3437.                     // Si no se ha creado aun el expediente de Av Express debemos crearlo
  3438.                     return $this->redirectToRoute('sinc_gp_ave', array('id' => $id,));
  3439.                 }
  3440.             }
  3441.         }
  3442.         return $this->redirectToRoute('reservations_greenpatio_edit_simple', array( 'id' => $id'token' => null ));
  3443.     }
  3444.     /**
  3445.      * @Route("/adminconfirmres/{op}/{id}", name="reservations_greenpatio_admin_confirm_res")
  3446.      * Confirmacion del administrador, positiva o negativa (op) de la reserva (id)
  3447.      */
  3448.     public function adminConfirmationReservationAction($op$idEntityManagerInterface $emRequest $request){
  3449.         /* Obtengo usuario logueado */
  3450.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  3451.         $user_id $user_logueado->getId();
  3452.         $reserva $em->getRepository(Reservation::class)->findOneById($id);
  3453.         $mailArrayTo = array();
  3454.         $mailArrayTo['salvador@avexpress.tv'] = 'salvador@avexpress.tv';
  3455.         $mailArrayTo['rafael.guerrero@inout-travel.com'] = 'rafael.guerrero@inout-travel.com';
  3456.         $mailArrayTo['comercial@greenpatio.es'] = 'comercial@greenpatio.es';
  3457.         $mailArrayTo['comercial2@greenpatio.es'] = 'comercial2@greenpatio.es';
  3458. //        $mailArrayTo['gustavo.ayala@develup.solutions'] = 'gustavo.ayala@develup.solutions';
  3459.         $agente $em->getRepository(User::class)->findOneById($user_id);
  3460.         $mailAddressFrom $agente->getEmail();
  3461.         $mailSubject 'Confirmación de reserva: '.$reserva->getTitle();
  3462.         switch ($op) {
  3463.             case 'y':
  3464.                 // Se va a Confirmar la reserva
  3465.                 $reserva->setStatus('Confirmed');
  3466.                 $reserva->setUpdatedBy($user_id);
  3467.                 $reserva->setUpdatedAt(new DateTime('now'));
  3468.                 $em->persist($reserva);
  3469.                 $em->flush();
  3470.                 $mailBody 'Estimado agente,'.
  3471.                     '<br><br>'$agente->getName().' '$agente->getLastName(). ' ha confirmado la reserva:'.
  3472.                     '<br><br>'.$reserva->getTitle(). ' con ID: '.$reserva->getId().
  3473.                     '<br>Este evento incia el día '.$reserva->getDateStart()->format('d/m/Y H:i'). ' y finaliza el día '.$reserva->getDateEnd()->format('d/m/Y H:i').'<br><br><br>';
  3474. //                $mailBody = $mailBody .'<br><br> <a href="http://127.0.0.1:8000/reservations-greenpatio/editsimple/'.$id.'">Ir a la reserva</a>';
  3475.                 $mailBody $mailBody .'<br><br> <a href="https://inout.mante.solutions/reservations-greenpatio/editsimple/'.$id.'">Ir a la reserva</a>';
  3476.                 break;
  3477.             case 'n':
  3478.                 // No se va a Confirmar la reserva - Pasa a un editar (para ajustar fechas etc)
  3479.                 $reserva->setStatus('Cotizado');
  3480.                 $reserva->setUpdatedBy($user_id);
  3481.                 $reserva->setUpdatedAt(new DateTime('now'));
  3482.                 $em->persist($reserva);
  3483.                 $em->flush();
  3484.                 $mailBody 'Estimado agente,'.
  3485.                     '<br><br>'$agente->getName().' '$agente->getLastName(). ' ha rechazado la confirmación de la reserva:'.
  3486.                     '<br><br>'.$reserva->getTitle(). ' con ID: '.$reserva->getId().
  3487.                     '<br>Este evento inciaba el día '.$reserva->getDateStart()->format('d/m/Y H:i'). ' y finalizaba el día '.$reserva->getDateEnd()->format('d/m/Y H:i').'<br><br><br>'.
  3488.                     '<br>POR FAVOR, PONGANSE EN CONTACTO PARA DETEMINAR UN NUEVO HORARIO<br><br><br>';
  3489. //                $mailBody = $mailBody .'<br><br> <a href="http://127.0.0.1:8000/reservations-greenpatio/editsimple/'.$id.'">Ir a la reserva</a>';
  3490.                 $mailBody $mailBody .'<br><br> <a href="http://inout.mante.solutions/reservations-greenpatio/editsimple/'.$id.'">Ir a la reserva</a>';
  3491.                 break;
  3492.             default:
  3493.                 break;
  3494.         }
  3495.         // Enviar correo al agente (envia a las 2 agentes? enviar al creador de la reserva?)
  3496.         $this->sendMailLot($mailAddressFrom$mailArrayTo$mailSubject$mailBody);
  3497.         echo 'Ha finalizado correctamente su sesión. Puede cerrar la aplicación'; exit();
  3498.     }
  3499.     /**
  3500.      * @Route("/viewcontract/{id}", name="reservations_greenpatio_view_contract")
  3501.      * Vista del contrato de la reserva (id)
  3502.      */
  3503.     public function viewContractReservationAction($idEntityManagerInterface $emRequest $request){
  3504.         // El cliente es obligatorio y no puede ser null
  3505.         // El contacto es obligatorio y no puede ser null, será el representante del cliente en el contrato
  3506.         // En el expediente solo deben estar las salas definitivas para el contrato
  3507.         $reserva $em->getRepository(Reservation::class)->findOneById($id);
  3508.         $contractOrigin $reserva->getContract();
  3509.         $dateStart $reserva->getDateStart();
  3510.         $dateEnd $reserva->getDateEnd();
  3511.         //Buscamos el representante
  3512.         $representante $reserva->getClientContact();
  3513.         $representante $em->getRepository(ClientContact::class)->findOneById($representante);
  3514.         $representanteCorreo $representante->getEmail();
  3515.         $representante $representante->getName().' '.$representante->getLastName();
  3516.         //Buscamos el cliente
  3517.         $client $reserva->getClient();
  3518.         $client $em->getRepository(Client::class)->findOneById($client);
  3519.         // La fecha de inicio y fin del evento incluyen montaje y desmontaje
  3520.         // Determinamos el primer y ultimo dia del evento y lo modificamos en la reserva sin tocar la base de datos
  3521.         $allOnlySalasReservadas $em->getRepository(ReservationLoungeSimple::class)->findBy(array('idReservation'=>$id,'type'=>null));
  3522.         if (!empty($allOnlySalasReservadas)){
  3523.             $reserva->setDateStart($allOnlySalasReservadas[0]->getDateStart());
  3524.             $reserva->setDateEnd($allOnlySalasReservadas[0]->getDateEnd());
  3525.             foreach ($allOnlySalasReservadas as $item){
  3526.                 if ($item->getDateStart() < $reserva->getDateStart()){ $reserva->setDateStart($item->getDateStart()); }
  3527.                 if ($item->getDateEnd() > $reserva->getDateEnd()){ $reserva->setDateEnd($item->getDateEnd()); }
  3528.             }
  3529.         }
  3530.         //Generamos la fecha actual
  3531.         $fechaActual = new DateTime('now');
  3532.         $mesActual $fechaActual->format('m');
  3533.         switch ($mesActual){
  3534.             case '01'$mesActual 'enero'; break;
  3535.             case '02'$mesActual 'febrero'; break;
  3536.             case '03'$mesActual 'marzo'; break;
  3537.             case '04'$mesActual 'abril'; break;
  3538.             case '05'$mesActual 'mayo'; break;
  3539.             case '06'$mesActual 'jumio'; break;
  3540.             case '07'$mesActual 'julio'; break;
  3541.             case '08'$mesActual 'agosto'; break;
  3542.             case '09'$mesActual 'septiembre'; break;
  3543.             case '10'$mesActual 'octubre'; break;
  3544.             case '11'$mesActual 'noviembre'; break;
  3545.             case '12'$mesActual 'diciembre'; break;
  3546.             default:   $mesActual ''; break;
  3547.         }
  3548.         $contract00 '';
  3549.         $contract01 '';
  3550.         $contract02 '';
  3551.         $contract03 '';
  3552.         $contract04 '';
  3553.         $contract05 '';
  3554.         //Generamos la fecha de inicio
  3555.         $fechaInicio $reserva->getDateStart()->format('m');
  3556.         switch ($fechaInicio){
  3557.             case '01'$mesInicio 'enero'; break;
  3558.             case '02'$mesInicio 'febrero'; break;
  3559.             case '03'$mesInicio 'marzo'; break;
  3560.             case '04'$mesInicio 'abril'; break;
  3561.             case '05'$mesInicio 'mayo'; break;
  3562.             case '06'$mesInicio 'jumio'; break;
  3563.             case '07'$mesInicio 'julio'; break;
  3564.             case '08'$mesInicio 'agosto'; break;
  3565.             case '09'$mesInicio 'septiembre'; break;
  3566.             case '10'$mesInicio 'octubre'; break;
  3567.             case '11'$mesInicio 'noviembre'; break;
  3568.             case '12'$mesInicio 'diciembre'; break;
  3569.             default:   $mesInicio ''; break;
  3570.         }
  3571.         $fechaInicio $reserva->getDateStart()->format('d'). ' de '.$mesInicio.' del '.$reserva->getDateStart()->format('Y').' ';
  3572.         $contract06 ='';
  3573.         $horaInicio $reserva->getDateStart()->format('H:i').' ';
  3574.         $contract07 ='';
  3575.         //Generamos la fecha de fin
  3576.         $fechaFin $reserva->getDateEnd()->format('m');
  3577.         switch ($fechaFin){
  3578.             case '01'$mesFin 'enero'; break;
  3579.             case '02'$mesFin 'febrero'; break;
  3580.             case '03'$mesFin 'marzo'; break;
  3581.             case '04'$mesFin 'abril'; break;
  3582.             case '05'$mesFin 'mayo'; break;
  3583.             case '06'$mesFin 'jumio'; break;
  3584.             case '07'$mesFin 'julio'; break;
  3585.             case '08'$mesFin 'agosto'; break;
  3586.             case '09'$mesFin 'septiembre'; break;
  3587.             case '10'$mesFin 'octubre'; break;
  3588.             case '11'$mesFin 'noviembre'; break;
  3589.             case '12'$mesFin 'diciembre'; break;
  3590.             default:   $mesFin ''; break;
  3591.         }
  3592.         if ($reserva->getDateStart()->format('ymd') != $reserva->getDateEnd()->format('ymd')){
  3593.             $fechaFin ' el día '.$reserva->getDateEnd()->format('d'). ' de '.$mesFin.' del '.$reserva->getDateEnd()->format('Y').' a las '.$reserva->getDateEnd()->format('H:i').' ';
  3594.             $contractAlfa '';
  3595.             $contract08 $fechaFin.$contractAlfa;
  3596.         } else {
  3597.             // El evento empieza y termina el mismo dia
  3598.             $horaFin ' las '.$reserva->getDateEnd()->format('H:i').' ';
  3599.             $contractAlfa '';
  3600.             $contract08 $horaFin.$contractAlfa;
  3601.         }
  3602.         // Buscamos las salas
  3603.         $allSalasReservadas $em->getRepository(ReservationLoungeSimple::class)->findByIdReservation($id);
  3604.         $arrayTextoSalas = [];
  3605.         foreach ($allSalasReservadas as $item){ $arrayTextoSalas[$item->getIdLounge()] = $item->getIdLounge(); }
  3606.         $textoSalas '';
  3607.         $logAllGreen false;       // Si se asigna el edificio completo no hay que verificar mas salas
  3608.         foreach ($arrayTextoSalas as $item){
  3609.             $sala $em->getRepository(ReservationLoungeDetails::class)->findOneById($item);
  3610.             switch ($sala->getId()){
  3611.                 case '1'$textoSalas '<b>TODO EL EDIFICIO EN EXCLUSIVA</b>'$logAllGreen true; break;
  3612.                 case '16': if (empty($textoSalas)){ $textoSalas '<b>Sala Plenaria La Imprenta, Sala Invernadero</b>'; } else { $textoSalas $textoSalas.'<b>Sala Plenaria La Imprenta, Sala Invernadero</b>'; } break;
  3613.                 case '17': if (empty($textoSalas)){ $textoSalas '<b>Sala Plenaria La Imprenta, Sala Invernadero, Sala Escenario</b>'; } else { $textoSalas $textoSalas.'<b>Sala Plenaria La Imprenta, Sala Invernadero, Sala Escenario</b>'; } break;
  3614.                 default: if (!$logAllGreen){ if (empty($textoSalas)){ $textoSalas '<b>'.$sala->getName().'</b>'; } else { $textoSalas $textoSalas.'<b>, '.$sala->getName().'</b>'; } } break;
  3615.             }
  3616.         }
  3617.         $contract09 '';
  3618.         $cierre $reserva->getDateEnd()->format('H:i').' horas del día '.$reserva->getDateEnd()->format('d').' de '.$mesFin.' del '.$reserva->getDateEnd()->format('Y');
  3619.         $contract10 ='';
  3620.         $pax $reserva->getPax();
  3621.         $contract11 '';
  3622.         $contract12 '</span></span><b><span lang="ES-TRAD" style="font-size:12.0pt"><o:p></o:p></span></b></font></p><p class="MsoListParagraph"><!--[if !supportLists]--><font face="Arial"><span lang="ES-TRAD" style="font-size:12.0pt">-<span style="font-variant-numeric: normal; font-variant-east-asian: normal; font-stretch: normal; font-size: 7pt; line-height: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><!--[endif]--><span class="Hyperlink1"><span lang="ES-TRAD" style="font-size:12.0pt">Salas a utilizar: </span></span><span class="Ninguno"><b><u><span lang="ES-TRAD">';
  3623.         $contract13 '</span></u></b></span><b><span lang="ES-TRAD" style="font-size:12.0pt"><o:p></o:p></span></b></font></p>';
  3624.         // Se asume que los montajes seran como maximo de dos dias
  3625.         $montaje = []; $mesInicioMontaje ''$mesFinMontaje '';
  3626.         foreach ($allSalasReservadas as $item){
  3627.             if ($item->getType() == 'Montaje'){
  3628.                 if (empty($montaje)){
  3629.                     $montaje[0] = $item->getDateStart();
  3630.                     switch ($item->getDateStart()->format('m')){
  3631.                         case '01'$mesInicioMontaje 'enero'; break;
  3632.                         case '02'$mesInicioMontaje 'febrero'; break;
  3633.                         case '03'$mesInicioMontaje 'marzo'; break;
  3634.                         case '04'$mesInicioMontaje 'abril'; break;
  3635.                         case '05'$mesInicioMontaje 'mayo'; break;
  3636.                         case '06'$mesInicioMontaje 'jumio'; break;
  3637.                         case '07'$mesInicioMontaje 'julio'; break;
  3638.                         case '08'$mesInicioMontaje 'agosto'; break;
  3639.                         case '09'$mesInicioMontaje 'septiembre'; break;
  3640.                         case '10'$mesInicioMontaje 'octubre'; break;
  3641.                         case '11'$mesInicioMontaje 'noviembre'; break;
  3642.                         case '12'$mesInicioMontaje 'diciembre'; break;
  3643.                         default:   $mesInicioMontaje ''; break;
  3644.                     }
  3645.                 } else {
  3646.                     $montaje[1] = $item->getDateEnd();
  3647.                     switch ($item->getDateEnd()->format('m')){
  3648.                         case '01'$mesFinMontaje 'enero'; break;
  3649.                         case '02'$mesFinMontaje 'febrero'; break;
  3650.                         case '03'$mesFinMontaje 'marzo'; break;
  3651.                         case '04'$mesFinMontaje 'abril'; break;
  3652.                         case '05'$mesFinMontaje 'mayo'; break;
  3653.                         case '06'$mesFinMontaje 'jumio'; break;
  3654.                         case '07'$mesFinMontaje 'julio'; break;
  3655.                         case '08'$mesFinMontaje 'agosto'; break;
  3656.                         case '09'$mesFinMontaje 'septiembre'; break;
  3657.                         case '10'$mesFinMontaje 'octubre'; break;
  3658.                         case '11'$mesFinMontaje 'noviembre'; break;
  3659.                         case '12'$mesFinMontaje 'diciembre'; break;
  3660.                         default:   $mesFinMontaje ''; break;
  3661.                     }
  3662.                 }
  3663.             }
  3664.         }
  3665.         switch (sizeof($montaje)){
  3666.             case 1$textoMontaje $montaje[0]->format('d').' de '.$mesInicioMontaje.' del '.$montaje[0]->format('Y'); break;
  3667.             case 2:
  3668.                 if ($mesInicioMontaje == $mesFinMontaje){
  3669.                     // Dos dias de montaje en el mismo mes
  3670.                     $textoMontaje $montaje[0]->format('d').' y '.$montaje[1]->format('d'). ' de '.$mesInicioMontaje.' del '.$montaje[0]->format('Y');
  3671.                 } else {
  3672.                     // Dos dias de montaje con diferentes meses, ejemplo 31/03 y 01/04
  3673.                     $textoMontaje $montaje[0]->format('d').' de '.$mesInicioMontaje.' y '.$montaje[1]->format('d').' de '.$mesFinMontaje.' del '.$montaje[0]->format('Y');
  3674.                 }
  3675.                 break;
  3676.             default: $textoMontaje null; break;
  3677.         }
  3678.         if (!empty($textoMontaje)){
  3679.             $textoMontaje '<p class="MsoListParagraph"><!--[if !supportLists]--><font face="Arial"><span lang="ES-TRAD" style="font-size:12.0pt">-<span style="font-variant-numeric: normal; font-variant-east-asian: normal; font-stretch: normal; font-size: 7pt; line-height: normal;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span><!--[endif]--><span class="Hyperlink1"><span lang="ES-TRAD" style="font-size:12.0pt">MONTAJE: '.$textoMontaje.'</span></span><b><span lang="ES-TRAD" style="font-size:12.0pt"><o:p></o:p></span></b></font></p>';
  3680.         }
  3681.         // Se asume que los desmontajes seran como maximo de dos dias
  3682.         $desmontaje = array(); $mesInicioDesmontaje ''$mesFinDesmontaje '';
  3683.         foreach ($allSalasReservadas as $item){
  3684.             if ($item->getType() == 'Desmontaje'){
  3685.                 if (empty($desmontaje)){
  3686.                     $desmontaje[0] = $item->getDateStart();
  3687.                     switch ($item->getDateStart()->format('m')){
  3688.                         case '01'$mesInicioDesmontaje 'enero'; break;
  3689.                         case '02'$mesInicioDesmontaje 'febrero'; break;
  3690.                         case '03'$mesInicioDesmontaje 'marzo'; break;
  3691.                         case '04'$mesInicioDesmontaje 'abril'; break;
  3692.                         case '05'$mesInicioDesmontaje 'mayo'; break;
  3693.                         case '06'$mesInicioDesmontaje 'jumio'; break;
  3694.                         case '07'$mesInicioDesmontaje 'julio'; break;
  3695.                         case '08'$mesInicioDesmontaje 'agosto'; break;
  3696.                         case '09'$mesInicioDesmontaje 'septiembre'; break;
  3697.                         case '10'$mesInicioDesmontaje 'octubre'; break;
  3698.                         case '11'$mesInicioDesmontaje 'noviembre'; break;
  3699.                         case '12'$mesInicioDesmontaje 'diciembre'; break;
  3700.                         default:   $mesInicioDesmontaje ''; break;
  3701.                     }
  3702.                 } else {
  3703.                     $desmontaje[1] = $item->getDateEnd();
  3704.                     switch ($item->getDateEnd()->format('m')){
  3705.                         case '01'$mesFinDesmontaje 'enero'; break;
  3706.                         case '02'$mesFinDesmontaje 'febrero'; break;
  3707.                         case '03'$mesFinDesmontaje 'marzo'; break;
  3708.                         case '04'$mesFinDesmontaje 'abril'; break;
  3709.                         case '05'$mesFinDesmontaje 'mayo'; break;
  3710.                         case '06'$mesFinDesmontaje 'jumio'; break;
  3711.                         case '07'$mesFinDesmontaje 'julio'; break;
  3712.                         case '08'$mesFinDesmontaje 'agosto'; break;
  3713.                         case '09'$mesFinDesmontaje 'septiembre'; break;
  3714.                         case '10'$mesFinDesmontaje 'octubre'; break;
  3715.                         case '11'$mesFinDesmontaje 'noviembre'; break;
  3716.                         case '12'$mesFinDesmontaje 'diciembre'; break;
  3717.                         default:   $mesFinDesmontaje ''; break;
  3718.                     }
  3719.                 }
  3720.             }
  3721.         }
  3722.         switch (sizeof($desmontaje)){
  3723.             case 1$textoDesmontaje $desmontaje[0]->format('d').' de '.$mesInicioDesmontaje.' del '.$desmontaje[0]->format('Y'); break;
  3724.             case 2:
  3725.                 if ($mesInicioDesmontaje == $mesFinDesmontaje){
  3726.                     // Dos dias de montaje en el mismo mes
  3727.                     $textoDesmontaje $desmontaje[0]->format('d').' y '.$desmontaje[1]->format('d'). ' de '.$mesInicioDesmontaje.' del '.$desmontaje[0]->format('Y');
  3728.                 } else {
  3729.                     // Dos dias de montaje con diferentes meses, ejemplo 31/03 y 01/04
  3730.                     $textoDesmontaje $desmontaje[0]->format('d').' de '.$mesInicioDesmontaje.' y '.$desmontaje[1]->format('d').' de '.$mesFinDesmontaje.' del '.$desmontaje[0]->format('Y');
  3731.                 }
  3732.                 break;
  3733.             default: $textoDesmontaje 'Mismo día al finalizar el evento desde las 17 horas hasta las 00:00 horas'; break;
  3734.         }
  3735.         if (!empty($textoDesmontaje)){
  3736.             $textoDesmontaje '';
  3737.         }
  3738.         $contract14 '';
  3739.         if (empty($mesInicioMontaje)){
  3740.             switch ($dateStart->format('m')){
  3741.                 case '01'$mesInicioMontajeZ 'enero'; break;
  3742.                 case '02'$mesInicioMontajeZ 'febrero'; break;
  3743.                 case '03'$mesInicioMontajeZ 'marzo'; break;
  3744.                 case '04'$mesInicioMontajeZ 'abril'; break;
  3745.                 case '05'$mesInicioMontajeZ 'mayo'; break;
  3746.                 case '06'$mesInicioMontajeZ 'jumio'; break;
  3747.                 case '07'$mesInicioMontajeZ 'julio'; break;
  3748.                 case '08'$mesInicioMontajeZ 'agosto'; break;
  3749.                 case '09'$mesInicioMontajeZ 'septiembre'; break;
  3750.                 case '10'$mesInicioMontajeZ 'octubre'; break;
  3751.                 case '11'$mesInicioMontajeZ 'noviembre'; break;
  3752.                 case '12'$mesInicioMontajeZ 'diciembre'; break;
  3753.                 default:   $mesInicioMontajeZ ''; break;
  3754.             }
  3755.             $tiempoCedido $dateStart->format('H:i').' horas del día '.$dateStart->format('d').' de '.$mesInicioMontajeZ.' del '.$dateStart->format('Y').' hasta las ';
  3756.         } else {
  3757.             $tiempoCedido $dateStart->format('H:i').' horas del día '.$dateStart->format('d').' de '.$mesInicioMontaje.' del '.$dateStart->format('Y').' hasta las ';
  3758.         }
  3759.         if (empty($mesInicioDesmontaje)){
  3760.             switch ($dateStart->format('m')){
  3761.                 case '01'$mesInicioDesmontajeZ 'enero'; break;
  3762.                 case '02'$mesInicioDesmontajeZ 'febrero'; break;
  3763.                 case '03'$mesInicioDesmontajeZ 'marzo'; break;
  3764.                 case '04'$mesInicioDesmontajeZ 'abril'; break;
  3765.                 case '05'$mesInicioDesmontajeZ 'mayo'; break;
  3766.                 case '06'$mesInicioDesmontajeZ 'jumio'; break;
  3767.                 case '07'$mesInicioDesmontajeZ 'julio'; break;
  3768.                 case '08'$mesInicioDesmontajeZ 'agosto'; break;
  3769.                 case '09'$mesInicioDesmontajeZ 'septiembre'; break;
  3770.                 case '10'$mesInicioDesmontajeZ 'octubre'; break;
  3771.                 case '11'$mesInicioDesmontajeZ 'noviembre'; break;
  3772.                 case '12'$mesInicioDesmontajeZ 'diciembre'; break;
  3773.                 default:   $mesInicioDesmontajeZ ''; break;
  3774.             }
  3775.             $tiempoCedido $tiempoCedido $dateEnd->format('H:i').' horas del día '.$dateEnd->format('d').' de '.$mesInicioDesmontajeZ.' del '.$dateEnd->format('Y');
  3776.         } else {
  3777.             $tiempoCedido $tiempoCedido $dateEnd->format('H:i').' horas del día '.$dateEnd->format('d').' de '.$mesInicioDesmontaje.' del '.$dateEnd->format('Y');
  3778.         }
  3779.         $contract15 '';
  3780.         // 5. Normas de Seguridad
  3781.         $contract16 '';
  3782.         // 6. Coste, plazo y forma de pago
  3783.         $data $this->CalculosTotalesEditSimple($reserva->getId());
  3784.         $contract17 '';
  3785.         // 8. Reserva
  3786.         $contract18 '';
  3787.         // 9. Confidencialidad y publicidad
  3788.         // 11. Derechos de imagen y propiedad intelectual
  3789.         // 12. Prevencion de la corrupcion
  3790.         // 13. Proteccion de datos personales
  3791.         // 14. Responsabilidad
  3792.         $contract19 '';
  3793.         // 15. Comunicaciones
  3794.         $contract20 '';
  3795.         // 16. Cesión
  3796.         // 17. Nulidad Parcial
  3797.         // 18. Fuerza Mayor
  3798.         // 19. Acuerdo Completo
  3799.         $contract21 '';
  3800.         // Normas de uso
  3801.         $contract22 '';
  3802.         // Logotipo de Green Patio centrado
  3803.         $contract23 '
  3804.         <div class="col-md-4 col-xs-6" ></div><div class="col-md-4 col-xs-6" ><p class="MsoNormal" align="right" style="margin-bottom: background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial;"><b><span lang="EN-US" style="font-size: 9pt;"><font face="Arial"><o:p><br></o:p></font></span></b></p><p class="MsoNormal" align="right" style="margin-bottom: 7.5pt; text-align: right; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial;"><b><span lang="EN-US" style="font-size: 9pt;"><font face="Arial"><o:p><br></o:p></font></span></b></p><p class="MsoNormal" align="right" style="margin-bottom: 7.5pt; text-align: right; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial;"><img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVYAAAEJCAYAAADPdw+hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAAFxEAABcRAcom8z8AACVdSURBVHhe7d0JmFxVmTfwBBAQUWTfZJFdliTdde+t6iw2MpCJyA4BEhgFSQJ8GCCEJN3p7jp3qeqq3tNhF2ZAGRyfOAoyOmFkWAQZB0FxPkb8RPlAVhFFw2IEMtT839tvNV3Vt7qW7oRO5/97nvN03XPPPXc7973nLlU9iYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIho3Gs2dVPcwL40CJx56fS03TWbiIhqYXzrXD/lvN+eTeQyHQ0517fvRfZWA2OJiKhqxrNezHY25BBcc0E6npMAizxfRxMRUTW8wElmOhveloCKz2GSwIpe6zpjErtoMSIiqsSiRbGPGN/+z86eGYNBVZL0XDMdiXfdwLlZixIRUSUQVBcEaWf90N5qPnV2N+SM7/yHMUduq8WJiKgc9Ex7evqmDwuqklLt8RyC7uvGWOdqcSIiKsd49rXdvdGBVZIEXde3rtHiREQ0kjbPakxn4i9JzzQqqErSoNutkxAR0UjcwLm4d1XhQ6vi1NUzXV67+uqaNXO31smIiKgUN4hfKIEzKqDmU9ibTTmvGeMcp5MREW2ZjInN7O2dfl5ra+xEzRrG+PELygVWSZ3d03PJZOwinWwYz7PO7L921nktLfUHaxYR0cSCoOqkM/HXVq2emQtSzgZj6i/XUQWMZ19SSWDtQmB1XScysLq+vaKjqyG3+tpZuXQ28TjmfYSOIiKaGBDY9vcC+yn5eqrrO7l0JpHLdiTeRwBcqkUGIbA2SVCMCqZDkwRfuW2gk4X6Fx+yHcZlM5iP3C6QefX2z8wlXesKLUJENDGk0/Epmc5Ezk998KRfgmtHZ2KD68eXZrOxnbToJATgVRKA8+VKpYHA+kGPtc2zG4xvPyj1Dn2jIAywnv371tb4oVqUiGjz5/v2UfJ11KGBNR/0kN53A/txE8SO9X3r/CAdf1fKDi0XlTIdCQRM604PARX1L/BT9nr5LYHib2vJPCXf952pujhERJu/UoE1H/gkwEpPU1JUmVJJgmh+uqivv0qS+sIy6DXr4hARbf6MsY4O0tGBNZ8GAm/0uJFSuek04L5lTAMfYBHRxCE91nKBdWMluV+b9GNdxjRur4tDRLT5W7z4kO3cwO7r6Cr/GtVYJ3nI1ebZp+uiEBFNHJ4XOyHTkXinlsv9WlP4epdnP93aWn+MLgYR0cQhv/qPIPf97r4Z4fulUYFwLJPcW0Ug/6v8tqsuAhHRxOP7Vl22I/Gr9mz591RHm+QWQNKzH21qt3fV2RMRTUxJ37pBgt7GvCUg762m2uPPyUMznS0R0cQlPUg/sB+SH1GJCoqjTXILQN6LTSZji3WWREQTX1PTzJ0RXP9zYwTXrh75n1jWXUuWJD6qsyMi2jLID7P4aeexTvnO/xg8zJI6unpm5PyU/aMuM2UPnQ0R0cRhzJE7GmOdEgTWfpo1jDHxA9PZxJj0XOW+bSYbf9CYun20+mFMKubIv37RQSKizUf426tZ5yeeb7+eao8/6Qb2t/xM9LukK1bE9m/PxB+t5BetSqVMR0OuPeM8vHJl/d5a7VCTXd9qbu9I3Ifl+W22I/GyG1iX5XKTJut4IqLxz/fjp/StnplLZ+LhS/ryS1Qd3YlXg7TjN2WO2VmLDWr1rfP9lPOWPHSKCpwjpfAXrVLO00vMkbtodYNSKdtyffuudCbxP9IrlrIShLOdiXdMwH/rQkSbEQTWE7NFP1YtQS38+b6U/ZDnWZ/XooNcz/6/CHgF01SSJGgnk9aPtZqQ3A5AL3khAvl7Ub98Ff6X15RzqhYnIhr/ogKrJHl3dSC4SqCzW93AuSzpOhdL8nznZenhFk9TLkkv1/WsF41vLWr16xdIneilPigBN5AecMT7st29M3JtKf5+ABFtRlKpxMldA//7PzJJgJVLc+k5SgDuwOdSv6daSZIAKvXIfymQoCnBO6qcJLkV4KftHxsz9UBdXCKi8S+dju+J4HlvJf+7aixTJd/mkmAu/1dLF5WIaPNhWusXdHRO/8toeqJjnSTQI/g+w6+6EtFmy/Xsr3V0b9pea6kk92KznQ3vG8+6WhePiGjzY4LYTNe335Z/Rx0V7DZV0p8QzCGo+rpoRESbL9+PnxGknfXy2lNU0NvYSf4ljLxLi6D6DSwOvxRARBNDW5t1pp9y3pMn8pvynqtc/subAug19zU1Df9iAhHRZq3VxE50A/tJeTVqpNehilP4nmpgP+UGzlPVfDNLXufKdiY2+O22Z0zjNroYREQTi3mgcRs35QTpbOLP8qMp5QKl/GJVT9+MnOfbX/d85/rOMg/CpLxc9ssDs2xHw498316qsyYimtjkv6b6KeerXmC/JYEzf/+1+D1U6dlmOxK/DwLnONe3MmGQHTJeyueT3Gbo7Z+R8wP7x7j0TxsT20FnR0S05UDAnN2ejV+IHukvpAcrAVZ6sZLks/x2gPHszkVm7x2MqZ8dpOP/T3qtQ8uEX11Ny9da7duzXfEL5XdetXoioi2XMdZBnX3TG9q8+s8ZP/aP0pPFpf9zyD9Dfg3LSzlz2zznCy1B/cEIqL2pdPwtL7BecP1Yi9duy3TxpUunfEyrIyKioYw5YHvTae+FnudumjUJl/Ztru8Y+Tx37qStOzE+nZ62eziSiIiqh95pEr1YVweJiGi0hvZYiYhoDDCwEhGNMQZWIqIxxsBKRDTGJLAaz27VQSIiGi0E1hYT2L06SEREo+UFznIE1/uMadxRs4iIaDR8P77UDeyfy//S0iwiIhoNz3NWGt/6QxDUHaBZREQ0Gl7KOdX1nWX8XVUiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiKiLUX/4kO2S7r2pV5gr/JT8dWe76w2ntVrAuc4LVKzxYvnbOe61jnGm9Zkgvqri5Pr1y8zXmy58a1T5s6dtK1OVrPcpEmTUdcZMr+k1B0xz8iE8l6q7ivGNG6vVVXEBNOOx3xMZJ0lEtYZ5adN1yoqYozzCePVtbaYqcdqVsWa00fvKevX5tUnfX/aoZq9SRgz7XiD+UZtBy+ILXf9uiXGxGZq8TGXTsf3NEHsKtl2xkzZQ7OrZsxhu2E9rsTyrohal3JJ9nkQ1H1WqxuRl66flXTrAzeov3TRothHNHvUWoL6g3Fc+65v9fspZ7Uc78bYlyzuP2Q7LUJjwfj2Sa7v3OMHzhOp9nhu1eqZuf5rZoV/e/tn5LDh16XSzsMIjHemcXDqZFXJZmM7YUc+1J6N5yRlOxORyfXtvyKgP5Fuj/9QdnytB0EuN2my61lrZV7pEeZXnLp6GmR93zEmsYtWVRHPt67vWTU9l+mIrjcqXXPdzJwJ7HatoiJB0HBA0O5gPvGXg2DqbM2uSJsfj8n26O6dnvNS9umavUmE26evxPbpSoT52O5/9ALnMazfg2iPAU6wW+vkoxYE8WMzHQ3hvBBUbunvn1NTEDGmboqfdsJ2Urwesg4p7JsA40u1A9nnfmD3aXUj8gIru/ramTnPt19b2jXlY5pdk5tuin0E653MdjY8gO38bFfPdD3OZ4Z/5bj3Us7PcKzc53l1f2MaG7fRSalaK1fW740gdn1HV+K93n7swMBej8D2ItJzHyRH/v4O4zb09M2QBvOy7zu3NaMHoNVURAPrD6XBoc4/o7G8MDw5zyO9jPm9Lju6d9UMNELnmeUrpzpaTcXCwOrH/jU8YFPO29HzG54wX1mGJ1dkj99Jq6qIbMdubB9Z/qh6o1JX7/TnsS2WaBUVkcCKaTZIcHQD67/Ry9tfR5U1EFgTCKwzcm3epg6sDgKrnKSdV4ZvC+z3IPyMdua8joM/19OHAJSy7zdm6jTZl1pNTboQlJKudb/UK8EVHYl3m4x1kI6uiu9bh7uB/fRAOylaD6wb2u6GII0gVaId6D5v1upGNBBYZ+Vcz/n9aAJr0nXmoaPynAT2zm60G9/5A5b1tx8c42GS4/4vcsylMwkcL85jy0zdPloFVUouk7GjfyuNHY3kVTdwvuP7dZ+RM1tU8rz6OBrUd2XDy9kOwfXLWlVFBgKr/UCfBPBU/PKoeQxNuDQ5O51NPNDZ3YAebuKVFlNf1e2IgcBqfU/mhx7CdVHzKJUWIWk1FXM9+yY5cFta6g+OqrNUmjt3blW9MgmsxnPelROGHCTGq7zHa1KJejlhhdP5zmmavUngBHnDQLuxj4raDkMTAsESBKfHV62eJT3Ap006doRWUxPpZSJYIKBYT+Bk9EtZDvTeVuvoak2OWmZJra0SdK2fyzbGFc8hUWUkVbrPcbJpl94kgtwrtQZWCaqyPFIPetK/9jy7FSfjHaKWq6nJPgzb5TaU3yBXrOi9/mzFiqkHalVUjtxjSfrWOtnY6YzzU68tNkNHleUF9SlMa9aYuVXdBx0aWBGgL9XssnAwZORAQHD9hUnV12t2WYWB1enX7I0mH1hxEG/Us7wEVvQ2NiD9Dpekrw7M0/o/OnpE4yGwBmh7mjUiY47cET21tQMnYvubxjTUfF8UHYhvrL5uFoKps8oEU47r6E68irb4x6VL9xzV5XUxuXpA2/6ZbONUKrGvZtdstIHV9+PnpjPxDalMPIe2srbJTDlMR40ombT+DuvwG+lE4bh7THrpOopGkvTs28PL+s6GR6WHpdkbVWFgdS7T7LLCyzjPWhdeEvl2WrPLKuqxXqPZG80HgbXyS/NaSGANb2/g0jrp2tfJ+rXjwEkm7YVapKTx0WOt/CA1Qf1xcssj7GEaJ6HZVZHeGQLrumxXw4ue58ySPATsR7TX6oeFxghOcAdJr1i2sewnza7ZaAKrXH1iWf4g0yfd2CMrVsSqurXV3Fb3N15g/WUVeq64ur1NtqOOoig4AC+V+0yZbPyPCKpVPfwYjVoD602LcGnoW3eFPZfAdjW7rIkcWDu65AGb0y33yHHJ/Fh48AX2ujbPatRikTa7wGoSuwTtzh0D94QHgmK1kq7Vj+nfN779A82a5Kft+bKvsA0fM2bsHtKMp8CKY60vvM2Xjv9/WS7Nrorx6xfISRy91rc8Lx7XbIqCnfV9uX9iXPtHmrVJ1BpYhdwPlssSTO9pVlkTPrD69o0ybIy9l59y/ksOwKA9fsdIT9I3t8Aq0NtaIfvQBPYczapYc3ra7n4q/ius83tyn1Wzsc0at0FbehZt6h30Wq/W7FEbL4G1tTV+KLb3k+1ZaY/18zW7asYcua3chuldFW7/3rE8CU0o2qAewllog/FjX9TsTWKUgfX80QXWTXePdeXKqaO+tzaSfGB1fecGzcJ+nXYkTh7runrQQ0nFu5AV+RR9cwys2IfL+hBcagmsxnNSEpiwb36qWYNc175UenTp9vj3Uqn6vTV7VMZLYPU868qB48V5p7s7tptm18R49iXhMes7747FOk1ILYF1vJdyXpfXLcbyHcFK1BpY5YsFxo09KNOhodV0KwC9u2slz5hJW42UGhsnyRm5pld7PuixDjxFjao/n2Tby/KFE1YpKrDKU2Z5R7ELAVOCpus6GR1VYHMLrC0tR+2HfXdvVy+WN6juywPyBQg/7Tzc0TU91+rHhq2rMdP3Sfr2+lWrZ2Bb2DX36oYaN4E1sK6WkxGOt2eqfR+7GNrSvGxH4n/Q3t5nYC0h6TvBwAv/zkub+mZ0rYE1uwLTedab8vBKeiCaXVY+sIYPegL7WTewv4X1/peREgLj9/MPOKolr3R1InC4gfXvWM+7ourPJ+klIWDcUu27wCIqsIqmzDE7y3zlsi2VjiNYRASTze4ea92cHgRVOWGlTKyqd5kRLC+QoNnmWetxSbuXZg+Sb9ahZ5cMe3ae/W0cD6Pq2YnxEljl9oYG1r41a6p7na8Y1ulo49q/kXdzGVhLwEHdLfdX8bemwCrTIEDdjZ32MILjRZpdkaGB1fjxRZo9IpkfGtc/SeOXd1oxXPH9y3xgDRs5krzHWC5JUMJ6zdMqqiK9YulZyfyi6h6awl6lb7/YlKn+oUKpwCqaMjN3Rv3hu8borT3R1HTErjoqNB4CaxDUVXRwGmMfhnb6lOwTX75abRp31FFltbTUHYAT5E/lSy+4lL1c7hXqqAKeZzdksvH35EsT8lmzazaObgXkA+tSzapZKjV1X5ykfiKvbDGwltCashe0oyFhg79ay6WofE8dO/svN361Meen4h2aXZF8YJWD3gTykrLzqZbA2m9oMiZ+oO/HD5WUTNYvDdLOyz1hkLBfbDVTTtKqKpIPrDI/L2X/g7xfWi51dEzfZ0lP4qNaRVXkYZL0rNCo7ai6hyaZj+lq2KOW3sRIgVVc1mTviu32M7kywd9/Xrr0gwNyPARWXNIfW7zfg3DfWweFl+/Y9wiGLtrZ6+H90cB+aaWpr+pVqzYvdoLcFkEv6zUE5amaPYzcZvLRqxv4dpN15+LFo/uu/HgJrBJQ9dbZt3tqbM95Jqj7bJCyf4fjnbcCSpHLHRyQsuPf9lvtozS7YggIH8fOejXc2YFT1TuA+cAqPTYcLH/CWVC+Rvd8PmH4eVySve4HcQka72NHIgBIALEfQrAa8TWiKPnAKg0Ml+kVfTd7NPL3WJuba/sthUqVC6yi1cTO8nHpNtBzjX9DToiSL19p/bACa9ijH7hV8gr2v3ydcnDfI+8F7Ks3g5STk3WTfdY+8K7umpaW6n6k5tZbG7dHW/qBfGsLVx8Xa3ZJbW318a7uhhewnd6VE7tm12Tc9FgDu0neP8XfN0f78MoN4gvlIZ8cj0HgfFqzqRga2z2ys4xnrdGsio1FYJV7NRKA5KCX3mg+yXBX7wwJuuF4Sa5r3Sq/uKVVVKUosE64161GCqzCde0ueUugs3d6Lula4cMsk45P+bADq7zwP3S/D+z7mTn5nQW0jz/L6z24NO+WX3TSSatiMlMPRNvcMHC7xbkbaRmGl5dKxnOuxHyfzGKbyjJqNTUZL4EVJ5azM52JN7HuOFk4n9LsmmB9rpBjE9voF83N03bXbCqGwHWdvHCNRvRstWfosQiscnBh2ttxJrxwaArkr2t/qS1lnez51ho5S3qp2D+uwHRaRVW29MAqbx/I5bfsa/x9S95tNO2JQz68wOpcH/ZYfac5at/jkvwCuU0gy62T1ARXN7elMwP3uWV+0lbLJQmq4Ynct18odT+2EuMlsEpZ49r/Gh5Dnn2LZletBT3U9kz8F9KG9PXMUf0YzoQmv0uJwPaMfBsFl91VXSKPRWCVaY0fv0CzIxkz9Vg/Zb/f2dOQazLVv78otvTAKuSHNVJp5x9kG6D8D9F7me3jcvvDvMfaNYrfQi1HXs/Cvn4D6/gGeukXygOpShOm+SV6z++gjcp7wDUZL4FVJH17hbylIm/FJN1pV2h2xdCOd0ga6zth2wmc3zcb50gdRaXg7HNWOitPpxs2BGm7tZpfWEJAfWU0gVV31IivW8lDHePZV+GycT0a6Uu+X3+MjqoYA+uANm+ajZPUqwO9RftP2G/hfcwPK7BW+wWBarie9bWwfXnOI5pVMeNZKblNEaSdn6TTtV3yjqfAKg9h0SbvDN8CStlPV/OV4GXLDv940rVXyNsS2Gfv4PPCan+FbYskZyMcWGukoctZLUjFeyt5QBS023NwZv/zNdfNyrkpp0ezK1JNYM2Te17hQwjf/jV6sZ/U7IrkA6s0TASWmnshlfogsA48KNpYqg2sos2zrpRlk9+ImKiBVd4mQED7OdbznVbfOl+zKybHBPbhn+SHn9HeWjS7KuMpsApj5m7rBnbYucAx97abspqxniM+zPL9xDGpjPNtaS8duLIJqvglOgK5rEevsBMH2hv94S9HOe+iQbWl2p1mHHRflAcdJrCmm5TzRQTTZnzuRtl35dWUTDbxkufFT9CqKlJLYG316z6DZXxDDsg2E2vS7IrkA6tMi8Z1v5t2LsLfheWSSdmXhOtf5b02rNMNAwHPXoE6FkTVXZywbpe4QWxeucY+VC2BVRjPuVoCqzw8nIiBFdvd09em1s1dU/23CqVHhp6ZJ8uY9KwHKn3fdqjxFliFnOixbe6WE4bcc8XJ49/kGEf7W+y11X8OJ6E6z4udarx4kxdYSZR9Vn5iUQIryjCo1kr+nxV6rI/LfTfZibIDpGEgiD6D9Ip8lvyw54feTjYbvwo7q+qfcJPAanz7RwPfoIpfrtll+WnnNASEd7t6Gl73UvEzNbssDaz3yD0mue0hSV7hKZfkFS806PXysr1WVRH0rm/s658xUE+l88JBjHm9ZlJ1llZTljxwDP97gOfcrFkVc10rI78iLweY/LCNZm8SaEs3y9NlnERG9aPVUdraLDtIOb+WoIgTyFdq/bZR0G3tJw++av2aq/wEJzog/y1tbrSvbglcaXXI1SEC6x9qDaxCgmumM/FF41lPhccyjvGBtyasPyKQymuPf5UvU8iXCqRtYV/dvqn/w8SEtHz5MZ9q72qwcZBfhQb1XJB23sLn97CB30lnEm9hwz+CoPZ5Yyr/oeli/f04c+KypHfVzHVuEC/726FDtZn6yzu6G9ajN/JEpT0eCazydgF6aJif/QZ6eFiP8gknkjfRkJ83fY1V3XrA2b4bgXIdtpm85hJZd3HCtn0T2/mX6OFO02rKCoJZ+6E3sQ77pOp3c+X/h/mB/Wh3z4x12M9VfeFitDDfPhzM6+SSXbPGjATBjq7puOKy/iQPZzW7auF9Sd8yXb3TsX2ce+TLHDqqIhJMsV8eRhtaJ/tJs2smy4Jgtw69zKfNTaP/Crr8jkW2u2E6ttfXcYy/4aWcv8pxjs/rccX1StK3lkkcGPqlEhojGfTU5KVio6m7u3G3ar5OWIoEOum1dt/UuNuSJdV/GyRcHmPv1V/Ff5KUM/XQdakkSfn2dntXWV6tpiLGHLljuK2K6hsphctmErtU83NsxpitRrNP5BaQ7IPRvFZUC1leWe7Rfnc9Cure/qZwnWJjUr8sp/ziVbX/GVVuJzQ1HTNw/GA/aXbNpJcq69XUZMtXk8fsVSfZ94XHeGy3JrR5HU1ERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERES0kZxyyin7nHrqqcfq4DCLFy/e7qyzzpp7xhlnHKBZIZkO+SfoYEVOOumkHVDPRXPnzt1fPp922mlfRh2H6+gCKLPXmWeeOVsHZXh/lD2nsbFxG80adPrpp09FsnVwGNSzEMmSzyiXQLoM9e0YjlSod3vk1+Pj5IGcD2DaOqQpOjgIeUdhmr11cBhZZmynuA4OI8tw9tlnn6iDVZk3b95u2B5zdDCS1I8yp+tgAYzbCfv9QB0MYX/sKkkHS0KdTn57DoX8E6Rd6GABaT9Y18/pYKUmY3kuGbLvTsE8zovFYh8Jx6rzzjvvE0O3I6Y5DGUv1MFIqHM62uBuOhgJ2yiG+TWjrj3weWuZN6Ybdqxg3T6LcYfoIG3pcGB9Eg1iARrGDWgwn9fsAlIG495GSmlWCMOzke7VwbLQ+PfGfM5BfctPPvnkT59//vkfwwFwKfKWfuELXzhIiw3Cch2H+u/XQVmOAzHcjnSJZg1CWYP8VTpYAPO4CvPowsGR0OGZqGspAsDHwwJKDjKUyxpjttKsQTiozsc8foN5FARXDK/ANMfrYAHMYz/Mqx/zvRx/P6PZBVDnp5Eew8dhwbwczDuOaR/WwUhYbjk5fU0HB2F5DpbtjlSw3ZEfk2CigyWhzo5zzjnnJalfs0LIvxdp8GQ4FJZV3K2DFcE+qsN2XJnfd/h7Fur/8qJFiwoCK+o9HOlRHZT1+AzKpZC3TLMKyD7D+Hb8NaWCKwL1DEx/C5J/4okn7iWBVeaNZRjWmUD+N2WcDtKWDg3wMDSua9F4TkD6u6igIg0P4+5Hg5IgcgWywiCAz59DY/qOfK4EpneRFujgIATZo1DP1+fMmbOdZoWQNwvzvUsHQ7J8WObZmHdBQEC55SjfroODkL8MZVt1cESod1eUTUZtA9QzB/X3YfmvHBpMkCdBs1EHC2C7HYGgcBqmuQzpYs0ugPkdgLr/HR9rCawWpv0XHYykweDzSAUnRcz3s1jubh0chOU9BuOO0MGSUF+AwHMb/nZiHvtrtuR/B9NH9kqxrNLbvEMHK4JlvBbbbg8dLAn1HoJUcJJHe/oEliejgwWQ34byFyM1Y3mHndQlkMp+q2RbCJT7e9Q1VwdpS6YH3UJpWPo5g78zdfQgBL490WjuwTi5rPRlGrkcx0F4LD5XFFgx7bY4SJxSBwnqmX3CCSd8TAdDyJPAeqcODkI9MQlaOhhCucjAiry+qMtPvZ1QEMxQb8nAiuU+C/Wcib/Hocxgfag/MrDqbYU75GQhJyaU+zLKHayjB6GumgMrtuk0TPsQ6p4i6dxzz52CXuRhOnoQlsPG+DtkmXR4Dwyvxv77ZFhgCCxjA+qRXmFYJ+o/UgKUjh6EcZ0Yt0DWCetwI9ZxB80f08CKKxm5xXMNppPAeYy0QR1VQMcXBFaU3QnL0qKDg5AfQ/5SuX2Add0Hy3yzjhqEMjOxbsN6+qWgvq9i2zflt5vsC0xf9pYKTUByMKDRtumgHFTSEzyzOMDJgYhG+wAa29aSpLHioNwPDSguB5IWG5H0AEZqaKh3x+IDWBo36v+eBCfM/6NIn8aw3Cu9GqMLAhHGleqxNiN/2D0x5MWL11OWD+sWGVhlu6Cu8J4dpl2Nz+G9TeRfgemGBVbt+S3SQVmOqxCYp+rgIJSpObBiOrn8/R3SWizTWhzY8ndYkIDJmM85GHeZDMg8kfrDMUVQ17nz589/ROrD8q7F8Bp8HnaPGHkdSEvkM9YVm+C0hZo/poFVyIkJdcqtnrX4ezzm5eRPEnlY94NR931ye+lLX/rS9ih3BIYvxjQ9WiQkJ1RMPxvj5muWbI9mzGOw1y1kPijzbzpYFuazGtvtv2QZJeHzWsznJB1NWxI0nqvQCJbg70X4Kz3XC9CYfom/BZdGGljvzzdmlD0KZb6C/OOQvyYsVAFMMx/THK2DgzRYL8/3evLQMCWwrpWAi/nsgjInY/g+HV0A40v1WG9FgPhbHRyE8qcU99gwv3KBNbyNIeVQ742yfMi7EH+HBVaUlwDTItOg7EL8XSonseJ1RJnR9FjlwcqItwLyZBkxr0V6kmqN6oUKOSEgSEXeDx4K69SBeq6Sz/KwCuvWiSQ941ukXYSFiqB8TYF1KNlnSN9FT3ZfzQph/SSwPoC0u5TBcpyEJLcBik/A+yL/VmyLC/BX2ry0fRd//16LhLBOh6POq6LaQhTUcQvS2TpIWzI0Mrm/1KINbBEO1EX4ewXS8RLstFg+sP5waC8BjXc+pnsU+cMu1UuReWCaq1H3tpoVQp4cBCnpTWhWCOXlSevgww4JSmjsC4cuWx7ymlA2q4OD5CBH3dfLOmhWCHWfKAegDoZQtwRMt9StANk+OiiXqPsiT+7ReahrhmaHUO+xyJPt+BXUF25b+YvyNxQvB8oeiDoewMeqAyvqlHus9+hgWZj3ZZjmbKRL5DJYswtgeaZF9ayLYb5d2B5y5RDCvjkC69k7b968X6H+yLcgkH8qpvumDlYE+0RubRRsG6zH7TgxfEoHQ5j3oah78EFnKSh3EMoZ2Sf5/YK/sq8ujdg3JyJv2DOBKKjnVqTzdZC2VGgEl6PRRL6qg3HflEsqHcwH1h8UX36hXBvSP+tgWRKwUD6O+m7FQRmTwIYGfZ00cOlJabFBKCM9wqH1T8ZwI+pwdXgQ8q5GCnSwAPJnIX1P5iPDmP+VSN8o7rVJYEWZlhKB9XTUUfDUF1lzUP5R/C0IRCh3syynDg5C0NkN8+gdegLBOsorZBIcqw6sCID1mPa7OlgWllNeM7tbg1UkLHt4f1AHS0K5dsz7Sh0Moad7IJbpceQ3aFYBTHMSxn1dByuC7XsElvdr+Csnr62w/Bmky4vbot4KWKuDkaRNo8y1OlgA9f8txhU85JR9gzYqD1zvwbIfJe0Df7+F4fO0yCDk34Q0TwdpS4XG8ani142EBBU00v2GBhc0sK1xsO2Jj8MOfjTG3fVjxeTAlnlLgJHPxZfHeXLwYDkLehF6/6zgfVqBZZR3Moc9jMnDch4ul6zyGeX2k9e98LEggMo6l6pDlhHzKHhwIsNy8BW/+iPbqriskhODzHdwO8o20G1bNcxj2+LtU47sdyzDR3VwGKlTkg6WNH/+/J2jer2zZ8/epVT9sg3l5KKDlZosl+VYpp3kM/b9QcXbW1SyHVGHvIdasP3zpH5sm2HvIyN/R+RPlfvx8u4sPh8tD3N19CAJukM7I0RERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERERFuKSZP+F0vlO4rFICMJAAAAAElFTkSuQmCC" alt="" style="float: left;"></p><p class="MsoNormal" style="margin-bottom: 7.5pt; text-indent: 3pt; background-image: initial; background-position: initial; background-size: initial; background-repeat: initial; background-attachment: initial; background-origin: initial; background-clip: initial;"></p></div></div></div></div><div class="col-md-4 col-xs-6" ></div>
  3805.         ';
  3806.             //Generamos el contrato
  3807.         $contract $contract00.'<b>'.' '.$client->getName().'</b>'.' '.$contract01'CIF '.$client->getIdDocument().' '.
  3808.             $contract02.'<b>'.' '.$client->getAddress().'</b>'.','.$contract03.' '.$representante.'.'.
  3809.             $contract04.$reserva->getTitle().$contract05.$fechaInicio.$contract06.$horaInicio.$contract07.
  3810.             $contract08.$textoSalas.$contract09.$cierre.$contract10.$pax.$contract11.$fechaInicio.
  3811.             $contract12.$textoSalas.$contract13.$textoMontaje.$textoDesmontaje.$contract14.$tiempoCedido.
  3812.             $contract15.$contract16.$contract17.$contract18.$contract19.$contract20.$contract21.$contract22.$contract23
  3813.         ;
  3814.         // Si no habia contracto originalmente en la reserva se actualiza
  3815.         if (empty($contractOrigin)){
  3816.             $reserva->setContract($contract);
  3817.             $em->persist($reserva);
  3818.             $em->flush();
  3819.         } else {
  3820.             $contract $contractOrigin;
  3821.         }
  3822.         return $this->render('MDS/GreenPatioBundle/reservations/view-contract-reservation.html.twig', array( 'id' => $id'contract' => $contract, ) );
  3823.     }
  3824.     /**
  3825.      * @Route("/createdeposit/{id}", name="reservations_greenpatio_createdeposit")
  3826.      */
  3827.     public function createDepositAction($idEntityManagerInterface $emRequest $request)
  3828.     {
  3829.         $newRequest $request->request->get('reservation_deposit');
  3830.         /* Obtengo usuario logueado */
  3831.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  3832.         $user_id $user_logueado->getId();
  3833.         $newDeposit = new ReservationDeposit();
  3834.         $newDeposit->setReservationId($id);
  3835.         if (empty($newRequest['date'])) { $newDeposit->setDate(new DateTime ('now')); } else { $newDeposit->setDate(new DateTime ($newRequest['date'])); }
  3836.         if (empty($newRequest['description'])) { $newDeposit->setDescription(null); } else { $newDeposit->setDescription($newRequest['description']); }
  3837.         if (empty($newRequest['amount'])) { $newDeposit->setAmount(null); } else { $newDeposit->setAmount($newRequest['amount']); }
  3838.         if (array_key_exists('isDone',$newRequest)) { $newDeposit->setIsDone(true); } else { $newDeposit->setIsDone(false); }
  3839.         $newDeposit->setCreatedAt(new DateTime ('now'));
  3840.         $newDeposit->setCreatedId($user_id);
  3841.         $newDeposit->setUpdatedAt(new DateTime ('now'));
  3842.         $newDeposit->setUpdatedId($user_id);
  3843.         $em->persist($newDeposit);
  3844.         $em->flush();
  3845.         return $this->redirectToRoute('reservations_greenpatio_edit_simple', array( 'id' => $id'token' => null'_fragment' => 'btn_dpt' ));
  3846.     }
  3847.     /**
  3848.      * @Route("/depositupdate/{id}", name="reservations_greenpatio_deposit_update")
  3849.      */
  3850.     public function depositUpdateAction($idEntityManagerInterface $emRequest $request)
  3851.     {
  3852.         $newRequest $request->request->get('reservation_deposit_isdone_pending');
  3853.         $deposito $em->getRepository(ReservationDeposit::class)->findOneById($id);
  3854.         if (array_key_exists('isDone',$newRequest)) { $deposito->setIsDone(true); } else { $deposito->setIsDone(false); }
  3855.         /* Obtengo usuario logueado */
  3856.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  3857.         $user_id $user_logueado->getId();
  3858.         $deposito->setUpdatedAt(new DateTime ('now'));
  3859.         $deposito->setUpdatedId($user_id);
  3860.         $em->persist($deposito);
  3861.         $em->flush();
  3862.         return $this->redirectToRoute('reservations_greenpatio_edit_simple', array( 'id' => $deposito->getReservationId(), 'token' => null'_fragment' => 'btn_dpt' ));
  3863.     }
  3864.     /**
  3865.      * @Route("/loadedreservations", name="reservations_greenpatio_loaded_reservations")
  3866.      */
  3867.     public function loadedReservationsAction(EntityManagerInterface $emRequest $request)
  3868.     {
  3869.         $hoy = new DateTime('now');
  3870.         $diaInicio = new DateTime($hoy->format('Y-m'). '-01');
  3871.         // Se buscan las reservas creadas desde el inicio de mes
  3872.         $parameters = array( 'diaInicio' => $diaInicio, );
  3873.         $dql 'SELECT i
  3874.                 FROM GreenPatioBundle:Reservation i
  3875.                 WHERE  i.createdAt > :diaInicio';
  3876.         $query $em->createQuery($dql)->setParameters($parameters);
  3877.         $reservas $query->getResult();
  3878.         return $this->render('MDS/GreenPatioBundle/reservations/list-loaded-reservations.html.twig', array( 'reservations' => $reservas'itemsOfSearch' => '', ) );
  3879.     }
  3880.     /**
  3881.      * @Route("/searchreservations", name="reservations_greenpatio_search_reservations")
  3882.      */
  3883.     public function searchReservationsAction(EntityManagerInterface $emRequest $request)
  3884.     {
  3885.         $searchloaded $request->request->get('searchloaded');
  3886.         $dateStart = new \DateTime($searchloaded['date_start']);
  3887.         $dateEnd = new \DateTime($searchloaded['date_end']);
  3888.         $itemsOfSearch ' Entre las fechas: '.$dateStart->format('d/m/Y').' y '.$dateEnd->format('d/m/Y');
  3889.         // Se buscan las reservas creadas en las fechas solicitadas
  3890.         $parameters = array( 'diaInicio' => $dateStart'diaFin' => $dateEnd, );
  3891.         $dql 'SELECT i
  3892.                 FROM GreenPatioBundle:Reservation i
  3893.                 WHERE  i.createdAt BETWEEN :diaInicio AND :diaFin';
  3894.         $query $em->createQuery($dql)->setParameters($parameters);
  3895.         $reservas $query->getResult();
  3896.         return $this->render('MDS/GreenPatioBundle/reservations/list-loaded-reservations.html.twig', array( 'reservations' => $reservas'itemsOfSearch' => $itemsOfSearch, ) );
  3897.     }
  3898.     /**
  3899.      * Cambia las descripciones de las reservas al idioma seleccionado
  3900.      * @Route("/changeLanguage/{id}/{idLanguage}", name="reservations_greenpatio_change_language", methods={"GET"})
  3901.      */
  3902.     public function changeLanguageAction(int $idint $idLanguageEntityManagerInterface $emSerializerInterface $serializerInterface): JsonResponse
  3903.     {
  3904.         $descriptions $em->getRepository(ReservationLoungeSimple::class)->findBy(array('idReservation' => $id));
  3905.         $idiomas = array();
  3906.         foreach ($descriptions as $description) {
  3907.             $loungeDetails $em->getRepository(ReservationLoungeDetails::class)->findOneById($description->getIdLounge());
  3908.             $idiomas[$description->getIdLounge()] = $em->getRepository(ReservationLoungeWebDescription::class)->findOneBy(array('lounge' => $loungeDetails'language' => $idLanguage));
  3909.         }
  3910.         $idiomas $serializerInterface->serialize($idiomas'json', [
  3911.             'groups' => ['reservation_lounge_web_description:read']
  3912.         ]);
  3913.         $idiomas json_decode($idiomastrue);
  3914.         return $this->json([
  3915.             'status' => JsonResponse::HTTP_OK,
  3916.             'idiomas' => $idiomas,
  3917.         ], JsonResponse::HTTP_OK);
  3918.     }
  3919.     private function sendMail($mailAddressFrom$mailAddressTo$mailSubject$mailBody){
  3920.         $em $this->getDoctrine()->getManager();
  3921.         $agent $em->getRepository(User::class)->findOneByEmail($mailAddressFrom);
  3922.         $client $em->getRepository(Client::class)->findOneByEmail($mailAddressTo);
  3923.         if (empty($client)){ $client $em->getRepository(ClientContact::class)->findOneByEmail($mailAddressTo); }     // Si el cliente era null puede ser un client contact
  3924.         if (!empty($client)){
  3925.             $replyTo = array(
  3926.                 $client->getEmail() => $client->getName(),
  3927.                 $agent->getEmail() => $agent->getName().' '$agent->getLastName(),
  3928.             );
  3929.         } else {
  3930.             // El AddressTo es un contacto no registrado
  3931.             $replyTo = array(
  3932.                 $mailAddressTo => $mailAddressTo,
  3933.                 $agent->getEmail() => $agent->getName().' '$agent->getLastName(),
  3934.             );
  3935.         }
  3936.         $agentMail $mailAddressFrom;
  3937.         $mailAgent $agentMail;
  3938.         //Se prepara el correo con los agentes a notificar
  3939.         $firmGmail $agent->getFirmGmail();
  3940.         $data = array(
  3941.             'body' => $mailBody,
  3942.             'firm' => $firmGmail,
  3943.         );
  3944.         // EJECUTAR ENVIO DE ALERTA PARA EL AGENTE
  3945.         $transporter = new \Swift_SmtpTransport();
  3946.         $transporter->setHost('smtp.gmail.com')
  3947.             ->setEncryption('ssl')//ssl / tls
  3948.             ->setPort(465)// 465 / 587
  3949.             ->setUsername('desarrollo@develup.solutions')
  3950.             ->setPassword('utvh hzoi wfdo ztjs');
  3951. //            ->setPassword('MeDITeRRANeAN_Develup30102023#');
  3952.         $mailer = new \Swift_Mailer($transporter);
  3953.         $message = new \Swift_Message();
  3954.         $message->setSubject($mailSubject)
  3955.             ->setSender($agentMail)
  3956.             ->setFrom(array("desarrollo@develup.solutions" => "Green Patio"))
  3957.             ->setReplyTo($agentMail)
  3958.             ->setTo($replyTo)
  3959.             ->setBody(
  3960.                 $this->renderView(
  3961.                     'mail/structure-mail.html.twig',
  3962.                     array('data' => $data)
  3963.                 ),
  3964.                 'text/html'
  3965.             );
  3966. //        $mailer->send($message);          Rafa dijo que no queria envío de correos con el cliente ya que se haría mediante la cotización Web (04/02/2025)
  3967.         return true;
  3968.     }
  3969.     private function makeAlert($reservaId$clientId$clientMail$agentId$agentMail){
  3970.         $em $this->getDoctrine()->getManager();
  3971.         $alertaPrevia $em->getRepository(ReservationMailAlertClient::class)->findOneByReservationId($reservaId);
  3972.         $reserva $em->getRepository(Reservation::class)->findOneById($reservaId);
  3973.         $dias $reserva->getDaysBlock();
  3974.         if (empty($dias) or !(is_numeric($dias))){
  3975.             $dias 7;
  3976.         }
  3977.         $diasMenosDos $dias 2;
  3978.         /* Obtengo usuario logueado */
  3979.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  3980.         $user_id $user_logueado->getId();
  3981.         $hoy = new \DateTime("now"NULL);
  3982.         $hoyMasCinco $hoy;
  3983.         $hoyMasCinco->add(new DateInterval('P'.$diasMenosDos.'D'));                   // 5 dias despues, 48 horas antes de la cancelacion (o los especificados)
  3984.         $hoyMasCinco->add(new DateInterval("PT2H"));                                  // Ajustamos la diferencia con el reloj del servidor
  3985.         $hoy = new \DateTime("now"NULL);
  3986.         $hoyMasSiete $hoy;
  3987.         $hoyMasSiete->add(new DateInterval('P'.$dias.'D'));                           // Siete dias despues (o los especificados)
  3988.         $hoyMasSiete->add(new DateInterval("PT2H"));
  3989.         //Si no hay una alerta previa se hace la alerta
  3990.         if (empty($alertaPrevia)){
  3991.             $alerta = new ReservationMailAlertClient();
  3992.             $alerta->setReservationId($reservaId);
  3993.             $alerta->setClientId($clientId);
  3994.             $alerta->setClientMail($clientMail);
  3995.             $alerta->setAgentId($agentId);
  3996.             $alerta->setAgentMail($agentMail);
  3997.             $alerta->setAlertDateTime($hoyMasCinco);                // A los 5 dias se alerta (o los especificados)
  3998.             $alerta->setAlertSended(false);
  3999.             $alerta->setCancelDateTime($hoyMasSiete);               // A los 7 dias se cancela (o los especificados)
  4000.             $alerta->setCancelSended(false);
  4001.             $alerta->setOldReservationId(null);                     // Aqui se guardara el Id de reserva cuando se vaya a eliminar el registro (solo se pondra reservationId a 0)
  4002.             $alerta->setCreatedAt($hoy);
  4003.             $alerta->setCreatedId($user_id);
  4004.             $em->persist($alerta);
  4005.             $em->flush();
  4006.         }
  4007.         return true;
  4008.     }
  4009.     private function benefitForReservation($id){
  4010.         $em $this->getDoctrine()->getManager();
  4011.         $reserva $em->getRepository(Reservation::class)->findOneById($id);
  4012.         $lounges $em->getRepository(ReservationLoungeSimple::class)->findByIdReservation($id);
  4013.         $services $em->getRepository(ReservationService::class)->findByReservationId($id);
  4014.         $payedLounges = array(); $payedServices = array(); $unPayedServices = array();
  4015.         // Salas
  4016.         foreach ($lounges as $item){
  4017.             // Si la sala esta en ReservationInvoiceItems se encuentra facturado, en caso contraio, no lo esta o ha sido rectificado
  4018.             $loungeInvoicedItem $em->getRepository(ReservationInvoiceItems::class)->findOneByLngControlId($item->getId());
  4019.             if (!empty($loungeInvoicedItem)){ $payedLounges[] = $item; }                       // Esta facturado el Item
  4020.         }
  4021.         // Servicios
  4022.         foreach ($services as $item){
  4023.             // Si el servicio esta en ReservationInvoiceItems se encuentra facturado, en caso contraio, no lo esta o ha sido rectificado
  4024.             $serviceInvoicedItem $em->getRepository(ReservationInvoiceItems::class)->findOneBySrvControlId($item->getId());
  4025.             if (!empty($serviceInvoicedItem)){
  4026.                 // Esta facturado el Item
  4027.                 $payedServices[] = $item;
  4028.             } else {
  4029.                 // No esta facturado el Item o fue rectificado
  4030.                 $unPayedServices[] = $item;
  4031.             }
  4032.         }
  4033.         $benefit 0$payed 0;
  4034.         // Se suman los pagos
  4035.         foreach ($payedLounges as $item){
  4036.             $benefit $benefit + (float)$item->getServicePrice();
  4037.             $payed $payed + (float)$item->getServicePrice();
  4038.         }
  4039.         foreach ($payedServices as $item){
  4040.             $benefit $benefit + (float)$item->getPrice();
  4041.             $payed $payed + (float)$item->getPrice();
  4042.         }
  4043.         // Se restan los impagos
  4044.         foreach ($unPayedServices as $item){
  4045.             // Se verifica el check de toinvoice por si el servicio se facturara a futuro (Requisito de Rafa)
  4046.             if ($item->getToinvoice()){
  4047.                 $benefit += (float)$item->getPrice();
  4048.                 $payed += (float)$item->getPrice();
  4049.             } else {
  4050.                 // No esta pagado y no esta marcado "Para facturar"
  4051.                 $benefit $benefit - (float)$item->getPrice();
  4052.             }
  4053.         }
  4054.         // Porcentaje de beneficio
  4055.         $percBenefit = ($benefit 100);
  4056.         if (!($payed == 0)){ $percBenefit $percBenefit $payed; } else { $percBenefit 0; };
  4057.         return array(
  4058.             'benefit' => $benefit,
  4059.             'percBenefit' => $percBenefit,
  4060.             'payedLounges' => $payedLounges,
  4061.             'payedServices' => $payedServices,
  4062.             'unPayedServices' => $unPayedServices,
  4063.         );
  4064.     }
  4065.     private function verificarStatusInicialyFinal($id,$user_id,$estadoInicial,$estadoFinal){
  4066.         $em $this->getDoctrine()->getManager();
  4067.         $reserva $em->getRepository(Reservation::class)->findOneById($id);
  4068.         $user_logueado $em->getRepository(User::class)->findOneById($user_id);
  4069.         $newStatus 'Pendiente';
  4070.         //Este Switch ya no es necesario
  4071.         switch ($estadoInicial) {
  4072.             case 'Bloqueo':
  4073.                 // De bloqueo solo se sale si el usuario es Salvador o un Admin O si se va a Cancelar "Deleted" o "Cotizado"
  4074. //                if (($user_logueado->getRole() == 'ROLE_ADMIN') or ($user_id == 14) or $estadoFinal == 'Deleted' or $estadoFinal == 'Cotizado'){
  4075.                 if ($estadoFinal == 'Deleted' or $estadoFinal == 'Cotizado'){
  4076.                     $newStatus $estadoFinal;
  4077.                 } else {
  4078.                     // No se cambia el estado
  4079.                     $newStatus $estadoInicial;
  4080.                 }
  4081.                 break;
  4082.             case 'Pendiente':
  4083.                 // De Pendiente solo se sale si el usuario es Salvador o un Admin O si se va a Cancelar "Deleted"
  4084.                 $newStatus $estadoFinal;
  4085. //                if (($user_logueado->getRole() == 'ROLE_ADMIN') or ($user_id == 14) or $estadoFinal == 'Deleted'){
  4086.                 if ($estadoFinal == 'Deleted'){
  4087.                     $newStatus $estadoFinal;
  4088.                 } else {
  4089.                     // No se cambia el estado
  4090.                     $newStatus $estadoInicial;
  4091.                 }
  4092.                 break;
  4093.             case 'Deleted':
  4094.                 // De Cancelado solo se sale si el usuario es Salvador o un Admin O "Bloqueo" o "Pendiente"
  4095. //                if (($user_logueado->getRole() == 'ROLE_ADMIN') or ($user_id == 14) or $estadoFinal == 'Bloqueo' or $estadoFinal == 'Pendiente'or $estadoFinal == 'Cotizado'){
  4096.                 if ($estadoFinal == 'Bloqueo' or $estadoFinal == 'Pendiente'or $estadoFinal == 'Cotizado'){
  4097.                     $newStatus $estadoFinal;
  4098.                 } else {
  4099.                     // No se cambia el estado
  4100.                     $newStatus $estadoInicial;
  4101.                 }
  4102.                 break;
  4103.             case 'Cotizado':
  4104.                 $newStatus $estadoFinal;
  4105.                 // De Cotizado solo se sale si el usuario es Salvador o un Admin O a  O "Bloqueo" o "Pendiente" o "Cancelado"
  4106. //                if (($user_logueado->getRole() == 'ROLE_ADMIN') or ($user_id == 14) or $estadoFinal == 'Bloqueo' or $estadoFinal == 'Pendiente' or $estadoFinal == 'Deleted'){
  4107.                 if ($estadoFinal == 'Bloqueo' or $estadoFinal == 'Pendiente' or $estadoFinal == 'Deleted' or $estadoFinal == 'Confirmed'){
  4108.                     $newStatus $estadoFinal;
  4109.                 }
  4110.                 break;
  4111.             case 'Invoiced':
  4112.                 // De Facturado no se debe salir a menos que se rectifique
  4113.                 // Si todas las facturas del expediente se encuentran rectificadas pasamos al estado "Confirmado" sino seguimos en "Facturado"
  4114.                 $reservaInvoices $em->getRepository(ReservationInvoice::class)->findByReservationId($id);
  4115.                 $estanTodasRectificadas true;
  4116.                 foreach ($reservaInvoices as $item){
  4117.                     $reservaInvoiceRect $em->getRepository(ReservationInvoiceRec::class)->findOneByInvoiceToRec($item->getId());
  4118.                     if (empty($reservaInvoiceRect)){ $estanTodasRectificadas false; } else { $estanTodasRectificadas = ($estanTodasRectificadas and true); }
  4119.                 }
  4120.                 if ($estanTodasRectificadas){
  4121.                     $newStatus 'Confirmed';
  4122.                 } else {
  4123.                     $newStatus $estadoInicial;
  4124.                 }
  4125.                 break;
  4126.             case 'Confirmed':
  4127.                 // Se puede ir a cualquier estado
  4128.                 $newStatus $estadoFinal;
  4129.                 break;
  4130.             default:
  4131.                 // No hacer nada con el campo Status
  4132.                 $newStatus $estadoInicial;
  4133.                 break;
  4134.         }
  4135.         $newStatus $estadoFinal;
  4136.         return $newStatus;
  4137.     }
  4138.     private function disponibilidadGreenPatio($id$initStatus){
  4139.         // $id Id de la reserva
  4140.         $em $this->getDoctrine()->getManager();
  4141.         $reserva $em->getRepository(Reservation::class)->findOneById($id);
  4142. //        $lounges = $em->getRepository(ReservationLoungeSimple::class)->findByIdReservation($id);
  4143.         //Buscamos salas que tengamos entre el inicio y fin del evento a confirmar
  4144.         //Sumamos un dia ya que por solicitud de Salva deseamos saber que eventos hay un dia antes y un dia despues
  4145.         $fechaInicio = new \DateTime($reserva->getDateStart()->format('Y-m-d H:i:s'));
  4146. //        $fechaInicio->sub(new \DateInterval("P1D"));
  4147.         $fechaFin = new \Datetime($reserva->getDateEnd()->format('Y-m-d H:i:s'));
  4148. //        $fechaFin->add(new \DateInterval("P1D"));
  4149.         // Los eventos que debemos verificar son los Confirmados y Facturados
  4150.         $parameters = array(
  4151.             'dateStart' => $fechaInicio,
  4152.             'dateEnd' => $fechaFin,
  4153.             'facturado' => 'Invoiced',
  4154.             'confirmado' => 'Confirmed',
  4155.         );
  4156.         $dql 'SELECT r
  4157.         FROM GreenPatioBundle:Reservation r
  4158.         INNER JOIN GreenPatioBundle:ReservationLoungeSimple l WITH r.id = l.idReservation
  4159.         WHERE (r.status = :facturado OR r.status = :confirmado) 
  4160.         AND (
  4161.             l.dateStart <= :dateEnd 
  4162.             AND l.dateEnd >= :dateStart
  4163.         )';
  4164.         $query $em->createQuery($dql)->setParameters($parameters);
  4165.         $reservationsInConflict $query->getResult();
  4166.         $arrayUso = [];
  4167.         $arrayAlert = [];
  4168.         $arrayAlertMontDesmont = [];                // Nuevo array para almacenar conflictos de montaje y desmontaje
  4169.         if (sizeof($reservationsInConflict) >1){
  4170.             foreach ($reservationsInConflict as $resConflict) {
  4171.                 $loungesConflict $em->getRepository(ReservationLoungeSimple::class)->findByIdReservation($resConflict->getId());
  4172.                 foreach ($loungesConflict as $item) {
  4173.                     $type $item->getType();                               // Puede ser NULL, "Montaje" o "Desmontaje"
  4174.                     $dateKey $item->getDateStart()->format('Ymd');
  4175.                     $loungeId $item->getIdLounge();
  4176.                     $reservationId $item->getIdReservation();
  4177.                     if (in_array($loungeId, [249])) {
  4178.                         // Plenaria, Invernadero y Escenario se consideran la misma sala
  4179.                         $arrayUso[2][$dateKey][$reservationId] = empty($type) ? 'Sala' $type;
  4180.                         $arrayUso[4][$dateKey][$reservationId] = empty($type) ? 'Sala' $type;;
  4181.                         $arrayUso[9][$dateKey][$reservationId] = empty($type) ? 'Sala' $type;;
  4182.                     } else {
  4183.                         $lngDetails $em->getRepository(ReservationLoungeDetails::class)->findOneById($loungeId);
  4184.                         if (empty($lngDetails->getCombo())) {
  4185.                             $arrayUso[$loungeId][$dateKey][$reservationId] = empty($type) ? 'Sala' $type;
  4186.                         } else {
  4187.                             $arrayComboLounges explode(","$lngDetails->getCombo());
  4188.                             foreach ($arrayComboLounges as $indLounge) {
  4189.                                 $arrayUso[$indLounge][$dateKey][$reservationId] = empty($type) ? 'Sala' $type;
  4190.                             }
  4191.                         }
  4192.                     }
  4193.                 }
  4194.             }
  4195.             foreach ($arrayUso as $idLounge => $dates) {
  4196.                 foreach ($dates as $dateKey => $reservations) {
  4197.                     // Si el ID de la reserva está presente, obtener su dato
  4198.                     $datoId = isset($reservations[$id]) ? $reservations[$id] : 0;
  4199.                     foreach ($reservations as $reservationId => $dato) {
  4200.                         if ($reservationId != $id) {
  4201.                             if ($datoId === "Sala" && $dato === "Sala") {
  4202.                                 $arrayAlert[$reservationId][] = array('dateKey' => $dateKey'idLounge' => $idLounge'reservationId' => $reservationId);
  4203.                             } elseif (($datoId === "Montaje" || $datoId === "Desmontaje") && ($dato === "Montaje" || $dato === "Desmontaje")) {
  4204.                                 $arrayAlertMontDesmont[$reservationId][] = array('dateKey' => $dateKey'idLounge' => $idLounge'reservationId' => $reservationId);
  4205.                             } elseif ($datoId === "Sala" && ($dato === "Montaje" || $dato === "Desmontaje")) {
  4206.                                 $arrayAlert[$reservationId][] = array('dateKey' => $dateKey'idLounge' => $idLounge'reservationId' => $reservationId);
  4207.                             } elseif (($datoId === "Montaje" || $datoId === "Desmontaje") && $dato === "Sala") {
  4208.                                 $arrayAlert[$reservationId][] = array('dateKey' => $dateKey'idLounge' => $idLounge'reservationId' => $reservationId);
  4209.                             }
  4210.                         }
  4211.                     }
  4212.                 }
  4213.             }
  4214.         }
  4215.         $reservationInDates = [];
  4216.         if (!empty($arrayAlert)){
  4217.             foreach ($arrayAlert as $key => $item){
  4218.                 $resvConf $em->getRepository(Reservation::class)->findOneById($key);
  4219.                 $reservationInDates[] = $resvConf;
  4220.             }
  4221.             // La reserva no puede pasar a confirmada
  4222.             $reserva->setStatus($initStatus);                       // $initStatus dejara el valor del status sin modificar
  4223.             $em->persist($reserva);
  4224.             $em->flush();
  4225.         } else {
  4226.             $mensajeWarning '<br>';
  4227.             if (!empty($arrayAlertMontDesmont)){
  4228.                 foreach ($arrayAlertMontDesmont as $key => $item){
  4229.                     $mensajeWarning .= 'Reserva ID: '$key'<br>';
  4230.                 }
  4231.                 $this->addFlash('mensajereservationerror''ADVERTENCIA, se han guardado los cambios, pero hay coincidencias en los Montajes y/o Desmontajes'$mensajeWarning);
  4232.                 $reservationInDates = [];
  4233.             }
  4234.         }
  4235.         return $reservationInDates;
  4236.     }
  4237.     private function disponibilidadAvExpress($id){
  4238.         // $id Id de la reserva de GreenPatio que vamos a confirmar
  4239.         $em $this->getDoctrine()->getManager();
  4240.         $reserva $em->getRepository(Reservation::class)->findOneById($id);
  4241.         //Sumamos un dia ya que por solicitud de Salva deseamos saber que eventos hay un dia antes y un dia despues
  4242.         $fechaInicio = new \Datetime($reserva->getDateStart()->format('Y-m-d'));
  4243.         $fechaInicio->sub(new \DateInterval("P1D"));
  4244.         $fechaFin = new \Datetime($reserva->getDateEnd()->format('Y-m-d 23:59'));
  4245.         $fechaFin->add(new \DateInterval("P1D"));
  4246.         $parameters = array( 'dateStart' => $fechaInicio'dateEnd' => $fechaFin, );
  4247.         $dql 'SELECT i
  4248.                 FROM AvexpressBundle:AveFiles i
  4249.                 WHERE (i.dateStart <= i.dateEnd) 
  4250.                   AND (
  4251.                       (i.dateStart <= :dateStart AND i.dateEnd >= :dateEnd)
  4252.                       OR (i.dateEnd = :dateStart)
  4253.                       OR (i.dateEnd > :dateStart AND i.dateEnd <= :dateEnd)
  4254.                       OR (i.dateStart = :dateStart)
  4255.                       OR (i.dateStart > :dateStart AND i.dateStart <= :dateEnd)
  4256.                       OR (i.dateStart = :dateEnd)
  4257.                   )
  4258.                 ORDER BY i.dateStart ASC';
  4259.         $query $em->createQuery($dql)->setParameters($parameters);
  4260.         $avFilesInDates $query->getResult();
  4261.         return $avFilesInDates;
  4262.     }
  4263.     private function sendMailLot($mailAddressFrom$mailArrayTo$mailSubject$mailBody){
  4264.         $em $this->getDoctrine()->getManager();
  4265.         $agent $em->getRepository(User::class)->findOneByEmail($mailAddressFrom);
  4266.         $replyTo = array();
  4267.         // Verificamos que los correos sean validos
  4268.         foreach ($mailArrayTo as $item){ if (filter_var($item,FILTER_VALIDATE_EMAIL)){ $replyTo[$item] = $item; } }
  4269.         $agentMail $mailAddressFrom;
  4270.         $mailAgent $agentMail;
  4271.         //Se prepara el correo con los agentes a notificar
  4272.         $firmGmail $agent->getFirmGmail();
  4273.         $data = array( 'body' => $mailBody'firm' => $firmGmail, );
  4274.         // EJECUTAR ENVIO DE ALERTA PARA EL AGENTE
  4275.         $transporter = new \Swift_SmtpTransport();
  4276.         $transporter->setHost('smtp.gmail.com')
  4277.             ->setEncryption('ssl')//ssl / tls
  4278.             ->setPort(465)// 465 / 587
  4279.             ->setUsername('desarrollo@develup.solutions')
  4280.             ->setPassword('utvh hzoi wfdo ztjs');
  4281. //            ->setPassword('MeDITeRRANeAN_Develup30102023#');
  4282.         $mailer = new \Swift_Mailer($transporter);
  4283.         $message = new \Swift_Message();
  4284.         $message->setSubject($mailSubject)
  4285.             ->setSender($agentMail)
  4286.             ->setFrom(array("desarrollo@develup.solutions" => "System Mante 3.0"))
  4287.             ->setReplyTo($agentMail)
  4288.             ->setTo($replyTo)
  4289.             ->setBody(
  4290.                 $this->renderView(
  4291.                     'mail/structure-mail.html.twig',
  4292.                     array('data' => $data)
  4293.                 ),
  4294.                 'text/html'
  4295.             );
  4296.         $mailer->send($message);
  4297.         return true;
  4298.     }
  4299.     private function notificacionReservasPorCotizar(){
  4300.         // Se buscan las reservas en estado "Iniciado" y se notifica a todos los
  4301.         // agentes de Green Patio, Solo se notifica 1 vez por dia
  4302.         // Solo se mantendran las alertas de los ultimos 6 meses
  4303.         $em $this->getDoctrine()->getManager();
  4304.         $alertas $em->getRepository(ReservationAlertStarted::class)->findAll();
  4305.         if (!empty($alertas)){ $ultimaAlerta end($alertas); } else { $ultimaAlerta null; }
  4306.         $alertas $em->getRepository(ReservationAlertStarted::class)->findAll();
  4307.         $agentesGreenPatio $em->getRepository(User::class)->findByUserrol(48);
  4308.         $hoy = new DateTime('now');
  4309.         $fechaLimite = new DateTime('now');
  4310.         $fechaLimite->modify('-180 day');
  4311.         if (!empty($ultimaAlerta)){ $mismaFecha $ultimaAlerta->getAlertDate()->format('Ymd') == $hoy->format('Ymd'); } else { $mismaFecha false; }
  4312.         if ($mismaFecha){
  4313.             // No se debe notificar, la ultima alerta es del dia de hoy
  4314.         } else {
  4315.             // Hay que notificar
  4316.             if (empty($agentesGreenPatio)){ return true; }
  4317.             $mailAddressFrom $agentesGreenPatio[0]->getEmail();
  4318.             $mailArrayTo = array();
  4319.             foreach ($agentesGreenPatio as $agente){
  4320.                 $mailArrayTo[$agente->getEmail()] = $agente->getEmail();
  4321.             }
  4322.             $mailSubject 'EXPENDIENTES POR COTIZAR';
  4323.             $reservasIniciado $em->getRepository(Reservation::class)->findByStatus('Iniciado');
  4324.             $mailBody null;
  4325.             foreach ($reservasIniciado as $reserva){
  4326.                 $agenteReserva $em->getRepository(User::class)->findOneById($reserva->getCreatedBy());
  4327.                 $agenteReserva $agenteReserva->getName().' '.$agenteReserva->getLastName();
  4328.                 $mailBody $mailBody'<br>Evento: '.$reserva->getId().'<br>Nombre del Evento: '.$reserva->getTitle().'<br>Agente: '.$agenteReserva.'<br>Enlace al Evento: <a href="https://inout.mante.solutions/reservations-greenpatio/editsimple/'.$reserva->getId().'">"IR AL EXPEDIENTE"</a><br><br>';
  4329.             }
  4330.             if (!empty($mailBody)){
  4331.                 $this->sendMailLot($mailAddressFrom$mailArrayTo$mailSubject$mailBody);
  4332.                 // Creamos la alerta del dia
  4333.                 $alertToday = new ReservationAlertStarted();
  4334.                 $alertToday->setAlertDate($hoy);
  4335.                 $alertToday->setMessage($mailBody);
  4336.                 $em->persist($alertToday);
  4337.                 $em->flush();
  4338.             }
  4339.         }
  4340.         // Eliminamos las alertas con mas de 6 meses de antiguedad
  4341.         foreach ($alertas as $alerta){
  4342.             if ($alerta->getAlertDate() < $fechaLimite){
  4343.                 $em->remove($alerta);
  4344.                 $em->flush();
  4345.             }
  4346.         }
  4347.         return true;
  4348.     }
  4349.     private function reordenarSalas$number$idLounge ){
  4350.         // number es el numero de la sala editada
  4351.         $em $this->getDoctrine()->getManager();
  4352.         $number--;
  4353.         $parameters = array( 'idLounge' => $idLounge'rankLounge' => $number, );
  4354.         $dql 'SELECT i
  4355.                 FROM GreenPatioBundle:ReservationLoungeDetails i
  4356.                 WHERE  i.rankLounge > :rankLounge AND i.id <> :idLounge';
  4357.         $query $em->createQuery($dql)->setParameters($parameters);
  4358.         $salasParaReordenar $query->getResult();
  4359.         foreach ($salasParaReordenar as $sala) {
  4360.             $sala->setRankLounge(($sala->getRankLounge() + 1));
  4361.             $em->persist($sala);
  4362.             $em->flush();
  4363.         }
  4364.         return empty($resInv);
  4365.     }
  4366.     private function laReservaEsConfirmable$id ){
  4367.         $confirmable false;
  4368.         // Una reserva se puede confirmar solo cuando tiene un deposito realizado
  4369.         $em $this->getDoctrine()->getManager();
  4370.         $depositos $em->getRepository(ReservationDeposit::class)->findBy(array('reservationId' => $id'isDone' => true));
  4371.         $depositos true;      // Rafa indica que este requisito no se usara por el momento 24/02/2025
  4372.         // Si la reserva no tiene ninguna sala asignada, no se puede pasar a confirmado
  4373.         $salas $em->getRepository(ReservationLoungeSimple::class)->findBy(array('idReservation' => $id));
  4374.         if (!empty($depositos) and !empty($salas)){ $confirmable true; }
  4375.         return $confirmable;
  4376.     }
  4377.     private function laReservaEsCotizable$id ){
  4378.         // Una reserva se puede cotizar solo cuando tiene al menos una sala agregada
  4379.         $em $this->getDoctrine()->getManager();
  4380.         $salas $em->getRepository(ReservationLoungeSimple::class)->findBy(array('idReservation' => $id));
  4381.         return true;            // Se pidio que siempre se sincronizara con Av
  4382.     }
  4383.     private function notificacionReservasPendientesDelSegundoDeposito(){
  4384.         // Se buscan las reservas con depositos y se notifica a todos los
  4385.         // agentes de Green Patio si no tienen el segundo deposito y faltan 30 días
  4386.         // o menos para el evento, Solo se notifica 1 vez por dia
  4387.         $em $this->getDoctrine()->getManager();
  4388.         $depositosHechos $em->getRepository(ReservationDeposit::class)->findByIsDone(true);
  4389.         $arrayDepositos = array();
  4390.         $arrayReservasPemdientesSegunDepositos = array();
  4391.         $today = new \Datetime('now');
  4392.         $todayPlusMonth = new \Datetime('+ 30 days');
  4393.         // Se agrupan los depositos por reservas
  4394.         foreach ($depositosHechos as $item){ $arrayDepositos[$item->getReservationId()][] = $item; }
  4395.         foreach ($arrayDepositos as $item){
  4396.             if (sizeof($item)<2){
  4397.                 // Solo nos interesan reservas con un deposito
  4398.                 $reserva $em->getRepository(Reservation::class)->findOneById($item[0]->getReservationId());
  4399.                 if ($reserva->getStatus() == 'Confirmed'){
  4400.                     // Solo nos interesan reservas confirmadas
  4401.                     if (($reserva->getDateStart() < $todayPlusMonth) and ($reserva->getDateStart()>$today)){
  4402.                      // Solo nos interesan reservas que inician en 30 dias
  4403.                         $arrayReservasPemdientesSegunDepositos[] = $reserva;
  4404.                     }
  4405.                 }
  4406.             }
  4407.         }
  4408.         $alertas $em->getRepository(ReservationAlertSecondDeposit::class)->findAll();
  4409.         if (!empty($alertas)){ $ultimaAlerta end($alertas); } else { $ultimaAlerta null; }
  4410.         $agentesGreenPatio $em->getRepository(User::class)->findByUserrol(48);
  4411.         $hoy = new DateTime('now');
  4412.         $fechaLimite = new DateTime('now');
  4413.         $fechaLimite->modify('-180 day');
  4414.         if (!empty($ultimaAlerta)){ $mismaFecha $ultimaAlerta->getAlertDate()->format('Ymd') == $hoy->format('Ymd'); } else { $mismaFecha false; }
  4415.         if ($mismaFecha){
  4416.             // No se debe notificar, la ultima alerta es del dia de hoy
  4417.         } else {
  4418.             // Hay que notificar
  4419.             if (empty($agentesGreenPatio)){ return true; }
  4420.             $mailAddressFrom $agentesGreenPatio[0]->getEmail();
  4421.             $mailArrayTo = array();
  4422.             foreach ($agentesGreenPatio as $agente){ $mailArrayTo[$agente->getEmail()] = $agente->getEmail(); }
  4423.             $mailSubject 'EXPENDIENTES CON DEPOSITOS PENDIENTES';
  4424.             $reservasIniciado $arrayReservasPemdientesSegunDepositos;
  4425.             $mailBody null;
  4426.             foreach ($reservasIniciado as $reserva){
  4427.                 $agenteReserva $em->getRepository(User::class)->findOneById($reserva->getCreatedBy());
  4428.                 $agenteReserva $agenteReserva->getName().' '.$agenteReserva->getLastName();
  4429.                 $mailBody $mailBody'<br>Evento: '.$reserva->getId().'<br>Nombre del Evento: '.$reserva->getTitle().'<br>Agente: '.$agenteReserva.'<br>Enlace al Evento: <a href="https://inout.mante.solutions/reservations-greenpatio/editsimple/'.$reserva->getId().'">"IR AL EXPEDIENTE"</a><br><br>';
  4430.             }
  4431.             if (!empty($mailBody)){
  4432.                 $this->sendMailLot($mailAddressFrom$mailArrayTo$mailSubject$mailBody);
  4433.                 // Creamos la alerta del dia
  4434.                 $alertToday = new ReservationAlertSecondDeposit();
  4435.                 $alertToday->setAlertDate($hoy);
  4436.                 $alertToday->setMessage($mailBody);
  4437.                 $em->persist($alertToday);
  4438.                 $em->flush();
  4439.             }
  4440.         }
  4441.         // Eliminamos las alertas con mas de 6 meses de antiguedad
  4442.         foreach ($alertas as $alerta){
  4443.             if ($alerta->getAlertDate() < $fechaLimite){
  4444.                 $em->remove($alerta);
  4445.                 $em->flush();
  4446.             }
  4447.         }
  4448.         return true;
  4449.     }
  4450. };