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

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 $sessionTranslatorInterface $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->setContcolor($countColor);
  101.         // Fechas
  102.         $service->setDateInAt($reserva->getDateStart());
  103.         $service->setDateOutAt($reserva->getDateEnd());
  104.         $service->setCreatedAt($now);
  105.         $service->setUpdatedAt($now);
  106.         // Auditoría
  107.         if ($userId) {
  108.             $service->setCreatedId($userId);
  109.             $service->setUpdatedId($userId);
  110.         }
  111.         // Valores por defecto
  112.         $service->setName(' ');
  113.         $service->setPrice('0.00');
  114.         $service->setCurrency('Euro');
  115.         $service->setUnits('1');
  116.         $service->setCommission('0');
  117.         $service->setPax('0');
  118.         $service->setOver('0');
  119.         $service->setViewInfo(0);
  120.         // Datos de Sage
  121.         $service->setSageIva($sageVatRate); // Asumiendo que getVatType devuelve lo que espera setSageIva
  122.         $service->setSageArticle($sageArticle);
  123.         // 6. Persistencia
  124.         $em->persist($service);
  125.         $em->flush();
  126.         return $this->redirectToRoute('reservations_venues_edit', [
  127.             'id' => $resid,
  128.             'token' => null,
  129.             '_fragment' => 'btn_srv'
  130.         ]);
  131.     }
  132.     /**
  133.      * @Route("reservations/white/services/addclean/{resid}/{loungesimpleid}", name="reservations_white_addservices_cleaning")
  134.      * Carga automatica de los servicios de limpieza
  135.      * Agregar un servicio de limpieza en la reserva resid con la fecha del loungesimpleid, no se mostrara en factura
  136.      */
  137.     public function addCleningAction($resid$loungesimpleidEntityManagerInterface $emRequest $request) {
  138.         $resLoungeSimple $em->getRepository(ReservationLoungeSimple::class)->findOneById($loungesimpleid);
  139.         $service= new ReservationService();
  140.         $service->setReservationId($resid);
  141.         $service->setSupplierId(0);
  142.         $service->setDateInAt($resLoungeSimple->getDateStart());
  143.         $service->setDateOutAt($resLoungeSimple->getDateEnd());
  144.         /* Obtengo usuario logueado */
  145.         $user_logueado $this->get('security.token_storage')->getToken()->getUser();
  146.         $user_id $user_logueado->getId();
  147.         $service->setCreatedId($user_id);
  148.         $service->setUpdatedId($user_id);
  149.         $service->setCreatedAt(new \DateTime("now"));
  150.         $service->setUpdatedAt(new \DateTime("now"));
  151.         $service->setServiceCatId('21');
  152.         $service->setServiceCatName('Limpieza');
  153.         $service->setContcolor('green-300');
  154.         $service->setName('HORAS ( '.$resLoungeSimple->getLoungeName().' )');
  155.         $service->setPrice('14');
  156.         $service->setCurrency('Euro');
  157.         $service->setUnits('8');
  158.         $service->setCommission('0');
  159.         $service->setPax('0');
  160.         $service->setOver('0');
  161.         // Busco la reserva para saber si es sucoe o no
  162.         $reserva $em->getRepository(Reservation::class)->findOneById($resid);
  163.         $sucoe $reserva->isSucoe();
  164.         // Si no es sucoe, cogemos el IVA del 21% y si lo es, entonces el del 0%
  165.         if (!$sucoe) {
  166.             $sageVatRate $em->getRepository(SageVatRates::class)->findOneBy(['sageCode' => '03']);
  167.         } else {
  168.             $sageVatRate $em->getRepository(SageVatRates::class)->findOneBy(['sageCode' => '00']);
  169.         }
  170.         $sageArticle null;
  171.         // 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.
  172.         if ($this->session->get('_config')['msage']) {
  173.             $sageArticle $em->getRepository(SageArticle::class)->findOneBy(['vatType' => $sageVatRate'name' => $service->getServiceCatName()]);
  174.             
  175.             // Si no se ha encontrado el artículo de Sage.
  176.             if (empty($sageArticle)) {
  177.                 $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.');
  178.                 return $this->redirectToRoute('reservations_venues_edit', array(
  179.                     'id' => $resid,
  180.                 ));
  181.             }
  182.         }
  183.         $service->setSageIva($sageVatRate);
  184.         $service->setOpIva('1');
  185.         $service->setOpCommission('1');
  186.         $service->setCommission('57.14');
  187.         $service->setViewInfo(0);
  188.         $service->setToinvoice(0);
  189.         $service->setServiceId(0);
  190.         // Vincular el artículo de Sage al servicio
  191.         $service->setSageArticle($sageArticle);
  192.         $em->persist($service);
  193.         $em->flush();
  194.         return $this->redirectToRoute('reservations_venues_edit', array(
  195.             'id' => $resid,
  196.             'token' => null,
  197.             '_fragment' => 'btn_quotes'
  198.         ));
  199.     }
  200.     /**
  201.      * @Route("/deletesimplecleaning/{idRes}/{idLng}/{dateInAt}/{dateOutAt}", name="reservations_venues_delete_simple_lounge_cleaning")
  202.      * Al eliminar un Reservation Simple Lounge de la cotizacion, se deben eliminar sus horas de limpieza
  203.      */
  204.     public function deleteLoungeCleaningAction($idRes$idLng$dateInAt$dateOutAtEntityManagerInterface $emRequest $request)
  205.     {
  206.         $loungeDetails $em->getRepository(ReservationLoungeDetails::class)->findOneById($idLng);
  207.         $stringName 'HORAS ( '.$loungeDetails->getName().' )';
  208.         $serviceCatIdClean 21;
  209.         $dateInAt = new \DateTime($dateInAt);
  210.         $dateOutAt = new \DateTime($dateOutAt);
  211.         $qb $em->getRepository(ReservationService::class)->createQueryBuilder('rs');
  212.         $serviceClean $qb->where('rs.reservationId = :id')
  213.             ->andWhere('rs.name = :name')
  214.             ->andWhere('rs.dateInAt = :dateInAt')
  215.             ->andWhere('rs.dateOutAt = :dateOutAt')
  216.             ->andWhere('rs.serviceCatId = :serviceCatId')
  217.             ->setParameter('id'$idRes)
  218.             ->setParameter('name'$stringName)
  219.             ->setParameter('dateInAt'$dateInAt)
  220.             ->setParameter('dateOutAt'$dateOutAt)
  221.             ->setParameter('serviceCatId'$serviceCatIdClean)
  222.             ->getQuery()
  223.             ->getResult();
  224.         if (empty($serviceClean)) {
  225.             return $this->redirectToRoute('reservations_venues_edit_simple',
  226.                 array(
  227.                     'id' => $idRes,
  228.                     'token' => null,
  229.                     '_fragment' => 'btn_quotes'
  230.                 ));
  231.         } else {
  232.             // Se elimina el servicio de horas de limpieza de la sala
  233.             $em->remove($serviceClean[0]);
  234.             $em->flush();
  235.             return $this->redirectToRoute('reservations_venues_edit_simple',
  236.                 array(
  237.                     'id' => $idRes,
  238.                     'token' => null,
  239.                     '_fragment' => 'btn_quotes'
  240.                 ));
  241.         }
  242.     }
  243. }