<?php
namespace App\Controller;
use App\Service\ApiConnService;
use DateTime;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\Annotation\Route;
class EventsController extends AbstractController
{
#[Route('/', name: 'empty_index')]
public function index(): Response
{
return $this->redirect($this->generateUrl('homepage'));
}
#[Route('/home/{type}', name: 'homepage', defaults: ['type' => ''])]
public function calendar($type, Request $request, ApiConnService $conn): Response
{
$mode = $request->query->get('mode', 'week');
$session = $request->getSession();
$this->getConfigData($conn, $session, $this->getUser()->getApiKey());
$types = $session->get('types');
// DEFAULT CLUBBING
$type = $type == '' ? ($types[0]['slug'] ?? null) : $type;
if ($type != null) {
$cal = $conn->getCalendar($this->getUser()->getApiKey(), $type, $mode, $request->query->get('sub', null));
$tpl = $cal['template'] != '' ? $cal['template'] : 'general';
}
return $this->render('events/home_'.($tpl ?? 'general').'.html.twig', [
'calendar' => $cal['events'] ?? [],
'subcats' => $cal['subcats'] ?? [],
'type' => $type,
'mode' => $mode
]);
}
#[Route('/home-event-info/{slug}', name: 'view_event_info')]
# Información de evento en pop up.
public function getEventInfo($slug, ApiConnService $conn): Response
{
$ev = $conn->getOneEvent($this->getUser()->getApiKey(), $slug);
return $this->render('events/_event_info.html.twig', [
'ev' => $ev,
'modal' => 1
]);
}
#[Route('/home/{type}/{slug}', name: 'view_event')]
# Información de evento.
public function getEvent($type, $slug, ApiConnService $conn): Response
{
$ev = $conn->getOneEvent($this->getUser()->getApiKey(), $slug);
$files = $conn->execute('/get-event-files', [
'key' => $this->getUser()->getApiKey(),
'id' => $ev['venue']['id']
]);
return $this->render('events/view.html.twig', [
'ev' => $ev,
'files' => $files,
'type' => $type
]);
}
#[Route('/{date_id}/tickets', name: 'date_tickets')]
public function getTicketDate($date_id, Request $request, ApiConnService $conn, EntityManagerInterface $em): Response
{
// Paso time() para invalidar cualquier tipo de caché.
$date = $conn->getTicketDate($date_id, $this->getUser()->getApiKey());
// Actualiza la config antes de cada venta.
$session = $request->getSession();
$session->set('expire_conf', 0);
$this->getConfigData($conn, $session, $this->getUser()->getApiKey());
$sellers = $em->getRepository('App\Entity\seller')
->getPinsForUserById($this->getUser()->getId());
if (isset($date['extras']) && count($date['extras'])) {
return $this->render('events/date_tickets_extras.html.twig', [
'date' => $date,
'sellers' => $sellers
]);
}
return $this->render('events/date_tickets.html.twig', [
'date' => $date,
'sellers' => $sellers
]);
}
#[Route('/make-sale', name: 'make_sale')]
public function makeSale(Request $request, ApiConnService $conn): RedirectResponse
{
$tdates = $request->request->get('td');
$exdates = $request->request->get('ecd', []);
$seller = $request->request->get('seller');
// Solo puede llegar un tipo de entrada. Si llega alguno más,
// solo se tendrá en cuenta el último.
$tktArray = null;
foreach ($tdates as $key => $amount) {
if ($amount > 0) {
$tktArray[] = array('tdate' => $key, 'tq' => $amount);
// Los formateo porque el JSON_ENCODE se comía los índices.
}
}
$extArray = null;
foreach ($exdates as $key => $amount) {
if ($amount > 0 && $key != 'pickup') {
$extArray[] = array('eid' => $key, 'eq' => $amount);
// Los formateo porque el JSON_ENCODE se comía los índices.
}
}
if ($request->request->get('cooltra', false)) {
$extArray[] = array('eid' => $exdates['pickup'], 'eq' => 1);
}
if ($request->request->get('send-mail')) {
$buyer = $request->request->get('buyer');
} else {
$buyer = null;
}
if ($request->request->get('payType') == 1) {
// TODO: Comprobar si para este evento tiene habilitada tarjeta.
// El pago es con tarjeta, he de crear un pedido.
$cart = $conn->makePendingSale($this->getUser()->getApiKey(), $tktArray, $extArray, $seller, $buyer, $request->headers->get('x-forwarded-for'));
if (isset($cart['error_message'])) {
// Hay un error, no está la venta completada.
$this->addFlash(
'danger',
'ERROR: ' .$cart['error_message']
);
return $this->redirect($this->generateUrl('homepage'));
}
return $this->redirect($this->generateUrl('view_pending_sale',
['hashid' => $cart['hashid']]
));
} else {
// TODO: Comprobar que para este evento tiene habilitado cash
$sale = $conn->makeSaleAction($this->getUser()->getApiKey(), $tktArray, $extArray, $seller, $buyer, $request->headers->get('x-forwarded-for'));
if (isset($sale['error'])) {
// Hay un error, no está la venta completada.
$this->addFlash(
'danger',
'ERROR: Some error has ocurred creating the sale. Please try again. ' .$sale['message']
);
return $this->redirect($this->generateUrl('homepage'));
}
return $this->redirect($this->generateUrl('view_sale',
['sale_token' => $sale['sale_token']]
));
}
}
#[Route('/sale-pdf/{sale_token}', name: 'sale_pdf')]
public function salePdf($sale_token, Request $request, ApiConnService $conn): Response
{
$sale_data = $conn->getSaleToPrint($sale_token);
$config = $request->getSession()->get('config', false);
$tpl = $request->query->get('small', 0) ? 'sale_pdf_single' : 'sale_pdf';
return $this->render('events/'.$tpl.'.html.twig', [
'data' => $sale_data,
'download' => 0,
'show_price' => $config ? $config['showPrice'] : false
]);
}
#[Route('/sale-receipt/{sale_token}', name: 'sale_receipt')]
public function saleReceipt($sale_token, Request $request, ApiConnService $conn): Response
{
$sale_data = $conn->getSaleToPrint($sale_token);
$config = $request->getSession()->get('config', false);
return $this->render('events/sale_receipt.html.twig', [
'data' => $sale_data,
'show_price' => $config ? $config['showPrice'] : false
]);
}
#[Route('/manage-workers-ferry', name: 'workers_ferry')]
public function workers(Request $request, ApiConnService $conn): RedirectResponse|Response
{
$conn->setEndpoint($this->getParameter('ferry_api'));
$workers = $conn->getWorkers($this->getUser()->getUserIdentifier());
if ($request->isMethod('POST')){
$wk = $request->request->get('wk');
$res = $conn->addWorker(
$wk['name'],
$wk['surname'],
$wk['email'],
$wk['idNumber'],
$this->getUser()->getUserIdentifier()
);
if (isset($res['success'])) {
$this->addFlash('success', 'flash.msg.add.worker.success');
} else {
$this->addFlash('danger', $res['message']);
}
return $this->redirect($request->headers->get('referer'));
}
return $this->render('events/workers_ferry.html.twig', [
'workers' => $workers
]);
}
# Carga la configuración del TPV al hacer login y luego cada 30 minutos.
private function getConfigData(ApiConnService $conn, callable|SessionInterface|null $session, $apiKey)
{
$now = new DateTime();
if ($now->format('U') >= $session->get('expire_conf', 0)) {
$config = $conn->getConfig($apiKey);
$session->set('config', $config);
// Para ver si hay que mostrar el menu de compras TPV.
foreach ($config['configs'] as $cfg) {
if ($cfg['can_tpv']) {
$session->set('can_tpv', 1);
break;
}
}
$unread = $conn->hasMessages($apiKey);
$session->set('unread', $unread);
// Comprueba si tiene listas de invitados
$guestlists = $conn->hasGuestList($apiKey);
$session->set('guestlists', $guestlists['q']);
$types = $conn->getVenueTypes($apiKey);
$session->set('types', $types);
// De esta forma hago que solo se obtenga la configuración cada 30 minutos.
// Lo quito temporalmente 25Jun por errores en Redis.
// $now->modify('+30minutes');
$session->set('expire_conf', $now->format('U'));
}
}
}