src/MDS/VenuesBundle/Controller/ReservationsServicesController.php line 202

Open in your IDE?
  1. <?php
  2. namespace App\MDS\VenuesBundle\Controller;
  3. use App\Entity\SageArticle;
  4. use App\Entity\SageVatRates;
  5. use App\MDS\VenuesBundle\Entity\Reservation;
  6. use App\MDS\VenuesBundle\Entity\ReservationLoungeDetails;
  7. use App\MDS\VenuesBundle\Entity\ReservationLoungeSimple;
  8. use App\MDS\VenuesBundle\Entity\ReservationService;
  9. use Google\Service\MigrationCenterAPI\DateTime;
  10. use Symfony\Component\Routing\Annotation\Route;
  11. use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
  12. use Symfony\Component\HttpFoundation\Request;
  13. use Doctrine\ORM\EntityManagerInterface;
  14. use Symfony\Component\HttpFoundation\Response;
  15. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  16. use Symfony\Component\Security\Core\Security;
  17. use Symfony\Contracts\Translation\TranslatorInterface;
  18. class ReservationsServicesController extends AbstractController
  19. {
  20.     private SessionInterface $session;
  21.     private TranslatorInterface $translator;
  22.     public function __construct(SessionInterface $session, TranslatorInterface $translator)
  23.     {
  24.         $this->session = $session;
  25.         $this->translator = $translator;
  26.     }
  27.     /**
  28.      * @Route("reservations/white/services/add/{cat}/{resid}", name="reservations_white_addservices", requirements={"cat"="\d+", "resid"="\d+"})
  29.      */
  30.     public function listAction(
  31.         int $cat, 
  32.         int $resid, 
  33.         Request $request, 
  34.         EntityManagerInterface $em,
  35.         Security $security
  36.     ): Response {
  37.         // 1. Validar entrada básica
  38.         if ($cat <= 0) {
  39.             return $this->redirectToRoute('reservations_venues_edit', ['id' => $resid]);
  40.         }
  41.         // 2. Obtener Reserva (Una sola query)
  42.         $reserva = $em->getRepository(Reservation::class)->findOneById($resid);
  43.         if (!$reserva) {
  44.             throw $this->createNotFoundException('Reserva no encontrada.');
  45.         }
  46.         // 3. Configuración del Servicio basada en la Categoría (PHP 8.1 match)
  47.         // Esto reemplaza el switch gigante. Retorna un array [CatId, CatName, Color]
  48.         $config = match ($cat) {
  49.             1  => ['1', 'Accommodation', 'teal'],
  50.             2  => ['2', 'Activities', 'blue'],
  51.             3  => ['3', 'Av', 'slate'],
  52.             4  => ['4', 'Creative', 'orange'],
  53.             5  => ['5', 'Cruise', 'brown'],
  54.             6  => ['6', 'Entertainment', 'green'],
  55.             7  => ['7', 'Gifts', 'pink'],
  56.             8  => ['8', 'Guide', 'orange'],
  57.             9  => ['9', 'Itineraries', 'indigo'],
  58.             10 => ['10', 'Lounge', 'warning'],
  59.             11 => ['11', 'Catering', 'purple-300'],
  60.             12 => ['12', 'Others', 'danger-800'],
  61.             13 => ['13', 'Transport', 'grey'],
  62.             14 => ['14', 'Technology', 'slate-800'],
  63.             15 => ['15', 'Asistencia', 'danger-300'],
  64.             16 => ['16', 'DDR', 'green-300'],
  65.             17 => ['17', 'Seguridad', 'green-600'],
  66.             18 => ['18', 'WiFi', 'green-800'],
  67.             19 => ['19', 'Mobiliario', 'orange-300'],
  68.             20 => ['20', 'Parking', 'info-300'],
  69.             21 => ['21', 'Limpieza', 'green-300'],
  70.             default => ['12', 'Others', 'danger-800'],
  71.         };
  72.         [$catId, $catName, $countColor] = $config;
  73.         // 4. Lógica de Sage (Optimizado)
  74.         $sageCode = $reserva->isSucoe() ? '00' : '03';
  75.         $sageVatRate = $em->getRepository(SageVatRates::class)->findOneBy(['sageCode' => $sageCode]);
  76.         
  77.         $sageArticle = $em->getRepository(SageArticle::class)->findOneBy([
  78.             'vatType' => $sageVatRate, 
  79.             'name'    => $catName
  80.         ]);
  81.         $msage = $this->session->get('_config')['msage'];
  82.         // Validación de artículo Sage
  83.         if (!$sageArticle && $msage) {
  84.             $this->addFlash('mensajereservationerror', 'No se ha encontrado el artículo de Sage para el servicio: ' . $catName);
  85.             return $this->redirectToRoute('reservations_venues_edit', ['id' => $resid]);
  86.         }
  87.         // 5. Creación y seteo del Servicio
  88.         $user = $security->getUser();
  89.         $userId = $user?->getId(); // Nullsafe operator por si acaso, aunque debería haber usuario
  90.         $now = new \DateTime();
  91.         $service = new ReservationService();
  92.         // Datos de relación básicos
  93.         $service->setReservationId($resid);
  94.         $service->setSupplierId(0);
  95.         $service->setServiceId('0');
  96.         
  97.         // Datos calculados del match
  98.         $service->setServiceCatId($catId);
  99.         $service->setServiceCatName($catName);
  100.         $service->setName($catName);
  101.         $service->setContcolor($countColor);
  102.         // Fechas
  103.         $service->setDateInAt($reserva->getDateStart());
  104.         $service->setDateOutAt($reserva->getDateEnd());
  105.         $service->setCreatedAt($now);
  106.         $service->setUpdatedAt($now);
  107.         // Auditoría
  108.         if ($userId) {
  109.             $service->setCreatedId($userId);
  110.             $service->setUpdatedId($userId);
  111.         }
  112.         // Valores por defecto
  113.         $service->setName(' ');
  114.         $service->setPrice('0.00');
  115.         $service->setCurrency('Euro');
  116.         $service->setUnits('1');
  117.         $service->setCommission('0');
  118.         $service->setPax('0');
  119.         $service->setOver('0');
  120.         $service->setViewInfo(0);
  121.         // Datos de Sage
  122.         $service->setSageIva($sageVatRate); // Asumiendo que getVatType devuelve lo que espera setSageIva
  123.         $service->setSageArticle($sageArticle);
  124.         // 6. Persistencia
  125.         $em->persist($service);
  126.         $em->flush();
  127.         return $this->redirectToRoute('reservations_venues_edit', [
  128.             'id' => $resid,
  129.             'token' => null,
  130.             '_fragment' => 'btn_srv'
  131.         ]);
  132.     }
  133.     /**
  134.      * @Route("reservations/white/services/addclean/{resid}/{loungesimpleid}", name="reservations_white_addservices_cleaning")
  135.      * Carga automatica de los servicios de limpieza
  136.      * Agregar un servicio de limpieza en la reserva resid con la fecha del loungesimpleid, no se mostrara en factura
  137.      */
  138.     public function addCleningAction($resid, $loungesimpleid, EntityManagerInterface $em, Request $request) {
  139.         $resLoungeSimple = $em->getRepository(ReservationLoungeSimple::class)->findOneById($loungesimpleid);
  140.         $service= new ReservationService();
  141.         $service->setReservationId($resid);
  142.         $service->setSupplierId(0);
  143.         $service->setDateInAt($resLoungeSimple->getDateStart());
  144.         $service->setDateOutAt($resLoungeSimple->getDateEnd());
  145.         /* Obtengo usuario logueado */
  146.         $user_logueado = $this->get('security.token_storage')->getToken()->getUser();
  147.         $user_id = $user_logueado->getId();
  148.         $service->setCreatedId($user_id);
  149.         $service->setUpdatedId($user_id);
  150.         $service->setCreatedAt(new \DateTime("now"));
  151.         $service->setUpdatedAt(new \DateTime("now"));
  152.         $service->setServiceCatId('21');
  153.         $service->setServiceCatName('Limpieza');
  154. //        $service->setServiceName('Limpieza');
  155.         $service->setContcolor('green-300');
  156.         $service->setName('HORAS ( '.$resLoungeSimple->getLoungeName().' )');
  157.         $service->setPrice('14');
  158.         $service->setCurrency('Euro');
  159.         $service->setUnits('8');
  160.         $service->setCommission('0');
  161.         $service->setPax('0');
  162.         $service->setOver('0');
  163.         // Busco la reserva para saber si es sucoe o no
  164.         $reserva = $em->getRepository(Reservation::class)->findOneById($resid);
  165.         $sucoe = $reserva->isSucoe();
  166.         // Si no es sucoe, cogemos el IVA del 21% y si lo es, entonces el del 0%
  167.         if (!$sucoe) {
  168.             $sageVatRate = $em->getRepository(SageVatRates::class)->findOneBy(['sageCode' => '03']);
  169.         } else {
  170.             $sageVatRate = $em->getRepository(SageVatRates::class)->findOneBy(['sageCode' => '00']);
  171.         }
  172.         $sageArticle = null;
  173.         // Si el módulo de Sage está activo, buscamos el artículo. Si no, lo dejamos en null y se mostrará un error en la vista.
  174.         if ($this->session->get('_config')['msage']) {
  175.             $sageArticle = $em->getRepository(SageArticle::class)->findOneBy(['vatType' => $sageVatRate, 'name' => $service->getServiceCatName()]);
  176.             
  177.             // Si no se ha encontrado el artículo de Sage.
  178.             if (empty($sageArticle)) {
  179.                 $this->addFlash('mensajereservationerror', 'No se ha encontrado el artículo de Sage para el servicio: ' . $service->getServiceCatName() . '. No se ha podido crear el servicio para la sala.');
  180.                 return $this->redirectToRoute('reservations_venues_edit', array(
  181.                     'id' => $resid,
  182.                 ));
  183.             }
  184.         }
  185.         $service->setSageIva($sageVatRate);
  186.         $service->setOpIva('1');
  187.         $service->setOpCommission('1');
  188.         $service->setCommission('57.14');
  189.         $service->setViewInfo(0);
  190.         $service->setToinvoice(0);
  191.         $service->setServiceId(0);
  192.         // Vincular el artículo de Sage al servicio
  193.         $service->setSageArticle($sageArticle);
  194.         $em->persist($service);
  195.         $em->flush();
  196.         return $this->redirectToRoute('reservations_venues_edit', array(
  197.             'id' => $resid,
  198.             'token' => null,
  199.             '_fragment' => 'btn_quotes'
  200.         ));
  201.     }
  202.     /**
  203.      * @Route("/deletesimplecleaning/{idRes}/{idLng}/{dateInAt}/{dateOutAt}", name="reservations_venues_delete_simple_lounge_cleaning")
  204.      * Al eliminar un Reservation Simple Lounge de la cotizacion, se deben eliminar sus horas de limpieza
  205.      */
  206.     public function deleteLoungeCleaningAction($idRes, $idLng, $dateInAt, $dateOutAt, EntityManagerInterface $em, Request $request)
  207.     {
  208.         $loungeDetails = $em->getRepository(ReservationLoungeDetails::class)->findOneById($idLng);
  209.         $stringName = 'HORAS ( '.$loungeDetails->getName().' )';
  210.         $serviceCatIdClean = 21;
  211.         $dateInAt = new \DateTime($dateInAt);
  212.         $dateOutAt = new \DateTime($dateOutAt);
  213.         $qb = $em->getRepository(ReservationService::class)->createQueryBuilder('rs');
  214.         $serviceClean = $qb->where('rs.reservationId = :id')
  215.             ->andWhere('rs.name = :name')
  216.             ->andWhere('rs.dateInAt = :dateInAt')
  217.             ->andWhere('rs.dateOutAt = :dateOutAt')
  218.             ->andWhere('rs.serviceCatId = :serviceCatId')
  219.             ->setParameter('id', $idRes)
  220.             ->setParameter('name', $stringName)
  221.             ->setParameter('dateInAt', $dateInAt)
  222.             ->setParameter('dateOutAt', $dateOutAt)
  223.             ->setParameter('serviceCatId', $serviceCatIdClean)
  224.             ->getQuery()
  225.             ->getResult();
  226.         if (empty($serviceClean)) {
  227.             return $this->redirectToRoute('reservations_venues_edit_simple',
  228.                 array(
  229.                     'id' => $idRes,
  230.                     'token' => null,
  231.                     '_fragment' => 'btn_quotes'
  232.                 ));
  233.         } else {
  234.             // Se elimina el servicio de horas de limpieza de la sala
  235.             $em->remove($serviceClean[0]);
  236.             $em->flush();
  237.             return $this->redirectToRoute('reservations_venues_edit_simple',
  238.                 array(
  239.                     'id' => $idRes,
  240.                     'token' => null,
  241.                     '_fragment' => 'btn_quotes'
  242.                 ));
  243.         }
  244.     }
  245. }