<?php
namespace App\MDS\VenuesBundle\Controller;
use App\Entity\SageArticle;
use App\Entity\SageVatRates;
use App\MDS\VenuesBundle\Entity\Reservation;
use App\MDS\VenuesBundle\Entity\ReservationLoungeDetails;
use App\MDS\VenuesBundle\Entity\ReservationLoungeSimple;
use App\MDS\VenuesBundle\Entity\ReservationService;
use Google\Service\MigrationCenterAPI\DateTime;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Contracts\Translation\TranslatorInterface;
class ReservationsServicesController extends AbstractController
{
private SessionInterface $session;
private TranslatorInterface $translator;
public function __construct(SessionInterface $session, TranslatorInterface $translator)
{
$this->session = $session;
$this->translator = $translator;
}
/**
* @Route("reservations/white/services/add/{cat}/{resid}", name="reservations_white_addservices", requirements={"cat"="\d+", "resid"="\d+"})
*/
public function listAction(
int $cat,
int $resid,
Request $request,
EntityManagerInterface $em,
Security $security
): Response {
// 1. Validar entrada básica
if ($cat <= 0) {
return $this->redirectToRoute('reservations_venues_edit', ['id' => $resid]);
}
// 2. Obtener Reserva (Una sola query)
$reserva = $em->getRepository(Reservation::class)->findOneById($resid);
if (!$reserva) {
throw $this->createNotFoundException('Reserva no encontrada.');
}
// 3. Configuración del Servicio basada en la Categoría (PHP 8.1 match)
// Esto reemplaza el switch gigante. Retorna un array [CatId, CatName, Color]
$config = match ($cat) {
1 => ['1', 'Accommodation', 'teal'],
2 => ['2', 'Activities', 'blue'],
3 => ['3', 'Av', 'slate'],
4 => ['4', 'Creative', 'orange'],
5 => ['5', 'Cruise', 'brown'],
6 => ['6', 'Entertainment', 'green'],
7 => ['7', 'Gifts', 'pink'],
8 => ['8', 'Guide', 'orange'],
9 => ['9', 'Itineraries', 'indigo'],
10 => ['10', 'Lounge', 'warning'],
11 => ['11', 'Catering', 'purple-300'],
12 => ['12', 'Others', 'danger-800'],
13 => ['13', 'Transport', 'grey'],
14 => ['14', 'Technology', 'slate-800'],
15 => ['15', 'Asistencia', 'danger-300'],
16 => ['16', 'DDR', 'green-300'],
17 => ['17', 'Seguridad', 'green-600'],
18 => ['18', 'WiFi', 'green-800'],
19 => ['19', 'Mobiliario', 'orange-300'],
20 => ['20', 'Parking', 'info-300'],
21 => ['21', 'Limpieza', 'green-300'],
default => ['12', 'Others', 'danger-800'],
};
[$catId, $catName, $countColor] = $config;
// 4. Lógica de Sage (Optimizado)
$sageCode = $reserva->isSucoe() ? '00' : '03';
$sageVatRate = $em->getRepository(SageVatRates::class)->findOneBy(['sageCode' => $sageCode]);
$sageArticle = $em->getRepository(SageArticle::class)->findOneBy([
'vatType' => $sageVatRate,
'name' => $catName
]);
$msage = $this->session->get('_config')['msage'];
// Validación de artículo Sage
if (!$sageArticle && $msage) {
$this->addFlash('mensajereservationerror', 'No se ha encontrado el artículo de Sage para el servicio: ' . $catName);
return $this->redirectToRoute('reservations_venues_edit', ['id' => $resid]);
}
// 5. Creación y seteo del Servicio
$user = $security->getUser();
$userId = $user?->getId(); // Nullsafe operator por si acaso, aunque debería haber usuario
$now = new \DateTime();
$service = new ReservationService();
// Datos de relación básicos
$service->setReservationId($resid);
$service->setSupplierId(0);
$service->setServiceId('0');
// Datos calculados del match
$service->setServiceCatId($catId);
$service->setServiceCatName($catName);
$service->setContcolor($countColor);
// Fechas
$service->setDateInAt($reserva->getDateStart());
$service->setDateOutAt($reserva->getDateEnd());
$service->setCreatedAt($now);
$service->setUpdatedAt($now);
// Auditoría
if ($userId) {
$service->setCreatedId($userId);
$service->setUpdatedId($userId);
}
// Valores por defecto
$service->setName(' ');
$service->setPrice('0.00');
$service->setCurrency('Euro');
$service->setUnits('1');
$service->setCommission('0');
$service->setPax('0');
$service->setOver('0');
$service->setViewInfo(0);
// Datos de Sage
$service->setSageIva($sageVatRate); // Asumiendo que getVatType devuelve lo que espera setSageIva
$service->setSageArticle($sageArticle);
// 6. Persistencia
$em->persist($service);
$em->flush();
return $this->redirectToRoute('reservations_venues_edit', [
'id' => $resid,
'token' => null,
'_fragment' => 'btn_srv'
]);
}
/**
* @Route("reservations/white/services/addclean/{resid}/{loungesimpleid}", name="reservations_white_addservices_cleaning")
* Carga automatica de los servicios de limpieza
* Agregar un servicio de limpieza en la reserva resid con la fecha del loungesimpleid, no se mostrara en factura
*/
public function addCleningAction($resid, $loungesimpleid, EntityManagerInterface $em, Request $request) {
$resLoungeSimple = $em->getRepository(ReservationLoungeSimple::class)->findOneById($loungesimpleid);
$service= new ReservationService();
$service->setReservationId($resid);
$service->setSupplierId(0);
$service->setDateInAt($resLoungeSimple->getDateStart());
$service->setDateOutAt($resLoungeSimple->getDateEnd());
/* Obtengo usuario logueado */
$user_logueado = $this->get('security.token_storage')->getToken()->getUser();
$user_id = $user_logueado->getId();
$service->setCreatedId($user_id);
$service->setUpdatedId($user_id);
$service->setCreatedAt(new \DateTime("now"));
$service->setUpdatedAt(new \DateTime("now"));
$service->setServiceCatId('21');
$service->setServiceCatName('Limpieza');
$service->setContcolor('green-300');
$service->setName('HORAS ( '.$resLoungeSimple->getLoungeName().' )');
$service->setPrice('14');
$service->setCurrency('Euro');
$service->setUnits('8');
$service->setCommission('0');
$service->setPax('0');
$service->setOver('0');
// Busco la reserva para saber si es sucoe o no
$reserva = $em->getRepository(Reservation::class)->findOneById($resid);
$sucoe = $reserva->isSucoe();
// Si no es sucoe, cogemos el IVA del 21% y si lo es, entonces el del 0%
if (!$sucoe) {
$sageVatRate = $em->getRepository(SageVatRates::class)->findOneBy(['sageCode' => '03']);
} else {
$sageVatRate = $em->getRepository(SageVatRates::class)->findOneBy(['sageCode' => '00']);
}
$sageArticle = null;
// 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.
if ($this->session->get('_config')['msage']) {
$sageArticle = $em->getRepository(SageArticle::class)->findOneBy(['vatType' => $sageVatRate, 'name' => $service->getServiceCatName()]);
// Si no se ha encontrado el artículo de Sage.
if (empty($sageArticle)) {
$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.');
return $this->redirectToRoute('reservations_venues_edit', array(
'id' => $resid,
));
}
}
$service->setSageIva($sageVatRate);
$service->setOpIva('1');
$service->setOpCommission('1');
$service->setCommission('57.14');
$service->setViewInfo(0);
$service->setToinvoice(0);
$service->setServiceId(0);
// Vincular el artículo de Sage al servicio
$service->setSageArticle($sageArticle);
$em->persist($service);
$em->flush();
return $this->redirectToRoute('reservations_venues_edit', array(
'id' => $resid,
'token' => null,
'_fragment' => 'btn_quotes'
));
}
/**
* @Route("/deletesimplecleaning/{idRes}/{idLng}/{dateInAt}/{dateOutAt}", name="reservations_venues_delete_simple_lounge_cleaning")
* Al eliminar un Reservation Simple Lounge de la cotizacion, se deben eliminar sus horas de limpieza
*/
public function deleteLoungeCleaningAction($idRes, $idLng, $dateInAt, $dateOutAt, EntityManagerInterface $em, Request $request)
{
$loungeDetails = $em->getRepository(ReservationLoungeDetails::class)->findOneById($idLng);
$stringName = 'HORAS ( '.$loungeDetails->getName().' )';
$serviceCatIdClean = 21;
$dateInAt = new \DateTime($dateInAt);
$dateOutAt = new \DateTime($dateOutAt);
$qb = $em->getRepository(ReservationService::class)->createQueryBuilder('rs');
$serviceClean = $qb->where('rs.reservationId = :id')
->andWhere('rs.name = :name')
->andWhere('rs.dateInAt = :dateInAt')
->andWhere('rs.dateOutAt = :dateOutAt')
->andWhere('rs.serviceCatId = :serviceCatId')
->setParameter('id', $idRes)
->setParameter('name', $stringName)
->setParameter('dateInAt', $dateInAt)
->setParameter('dateOutAt', $dateOutAt)
->setParameter('serviceCatId', $serviceCatIdClean)
->getQuery()
->getResult();
if (empty($serviceClean)) {
return $this->redirectToRoute('reservations_venues_edit_simple',
array(
'id' => $idRes,
'token' => null,
'_fragment' => 'btn_quotes'
));
} else {
// Se elimina el servicio de horas de limpieza de la sala
$em->remove($serviceClean[0]);
$em->flush();
return $this->redirectToRoute('reservations_venues_edit_simple',
array(
'id' => $idRes,
'token' => null,
'_fragment' => 'btn_quotes'
));
}
}
}