<?php
namespace App\Controller;
use App\Entity\Item;
use App\Entity\Line;
use App\Entity\Purchase;
use PHPUnit\Util\Json;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Mailer\MailerInterface;
use Symfony\Bridge\Twig\Mime\TemplatedEmail;
use Symfony\Component\Mime\Email;
use Symfony\Component\HttpFoundation\{Request, Response};
use Symfony\Component\Routing\Annotation\Route;
use App\Utils\Ticketing;
use App\Utils\Functions;
use App\Entity\User;
use Symfony\Component\HttpFoundation\JsonResponse;
use Endroid\QrCode\QrCode;
use Dompdf\Dompdf;
use Dompdf\Options;
use Doctrine\Persistence\ManagerRegistry;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use App\Utils\RedsysAPI;
/**
* @Route("/{_locale}", requirements={"_locale": "en|es"})
*/
class TicketController extends AbstractController
{
/**
* @var Ticketing
*/
private $ticketing;
/**
* @var Functions
*/
private $functions;
/**
* @var ManagerRegistry
*/
private $doctrine;
/**
* @param Ticketing $ticketing
* @param Functions $functions
* @param ManagerRegistry $doctrine
*/
public function __construct(Ticketing $ticketing, Functions $functions, ManagerRegistry $doctrine)
{
$this->ticketing = $ticketing;
$this->functions = $functions;
$this->doctrine = $doctrine;
}
/**
* @Route("/tickets", name="tickets")
*/
public function tickets(Request $request): Response
{
// General function to set discount ref/affId
$this->functions->setDiscount($request);
$events = $this->ticketing->curl("events", "normal", array(), "GET");
$keys = $this->ticketing->curl("tickets?limit=3&orderBy=price&order=desc&name=keys", "normal", array(), "GET");
$filters = array_filter($request->query->all());
$request->request->set('saleuser', 1);
return $this->render('tickets/tickets.html.twig', [
'events' => $events["events"],
'filters' => $filters,
'keys' => $keys["tickets"]
]);
}
/**
* @Route("/include-tickets-map", name="include_tickets_map")
*/
public function includeTicketsMap(Request $request, $mapUrl): Response
{
$sessionRand = md5(uniqid(mt_rand(), true));
$version = $this->functions->addAppVersion();
return $this->render('events/include-event-tickets-map.html.twig',
[
'mapUrl' => $mapUrl,
'sessionRand' => $sessionRand,
'version' => $version
]);
}
/**
* @Route("/axerquia/include-tickets-map", name="axerquia_include_tickets_map")
*/
public function axerquiaIncludeTicketsMap(Request $request): Response
{
$sessionRand = md5(uniqid(mt_rand(), true));
$version = $this->functions->addAppVersion();
return $this->render('events/include-event-tickets-map-axerquia.html.twig',
[
'sessionRand' => $sessionRand,
'version' => $version
]);
}
/**
* @Route("/include-tickets-json", name="include_tickets_json")
*/
public function includeTicketsJson(Request $request, $mapUrl): Response
{
$sessionRand = md5(uniqid(mt_rand(), true));
$version = $this->functions->addAppVersion();
return $this->render('events/include-event-tickets-json.html.twig',
[
'mapUrl' => $mapUrl,
'sessionRand' => $sessionRand,
'version' => $version,
'event' => $request->get('event'),
]);
}
/**
* @Route("/include-tickets-wizink-json", name="include_tickets_wizink_json")
*/
public function includeWizinkTicketsJson(Request $request, $mapUrl): Response
{
$sessionRand = md5(uniqid(mt_rand(), true));
$version = $this->functions->addAppVersion();
return $this->render('events/include-event-tickets-wizink-json.html.twig',
[
'mapUrl' => $mapUrl,
'sessionRand' => $sessionRand,
'version' => $version,
'event' => $request->get('event'),
]);
}
/**
* @Route("/include-tickets-axerquia-json", name="include_tickets_axerquia_json")
*/
public function includeAxerquiaTicketsJson(Request $request, $mapUrl): Response
{
$sessionRand = md5(uniqid(mt_rand(), true));
$version = $this->functions->addAppVersion();
return $this->render('events/include-event-tickets-axerquia-json.html.twig',
[
'mapUrl' => $mapUrl,
'sessionRand' => $sessionRand,
'version' => $version,
'event' => $request->get('event'),
]);
}
/**
* @Route("/load-map", name="load_map")
*/
public function loadMap(Request $request)
{
$data = $this->ticketing->curl("tickets?limit=1000§or=".$request->get('sector')."&event=".$request->get('event'), "normal", [], "GET");
if (empty($data)) {
return new JsonResponse([
'status' => false,
'message' => 'No hay tickets',
'data' => []
], 403);
}
return new JsonResponse($data['tickets']);
}
/**
* @Route("/check-map", name="check_map")
*/
public function checkMap(Request $request)
{
// answer is always positive
$id = $request->get('id');
$token = $request->get('token');
$result = [];
// block or unblock ticket
switch ($request->get('action')) {
case 'S':
// Ticket block
$data = ["blocked" => "true", "seat" => $id, "setBlockedDate" => true];
$result = $this->ticketing->curl("tickets/".$token, "normal", $data, "PATCH");
if ($result["code"] != "200") {
return new JsonResponse([
'status' => false,
'message' => json_encode($result),
'data' => []
], 403);
}
break;
case 'D':
// Ticket unblock
$data = ["blocked" => "false", "setBlockedDate" => false];
$result = $this->ticketing->curl("tickets/".$token, "normal", $data, "PATCH");
if ($result["code"] != "200") {
return new JsonResponse([
'status' => false,
'message' => 'Ha ocurrido un error',
'data' => []
], 403);
}
break;
}
return new JsonResponse([
'status' => true,
'ticket' => $result
]);
}
/**
* @Route("/unblock-map", name="unblock_map")
*/
public function unblockMap(Request $request) {
// unblock is disabled if output page is checkout
if (!filter_var($request->get("checkout"), FILTER_VALIDATE_BOOLEAN)) {
// tokens to unblock
$tokens = $request->get('tokens');
if (!empty($tokens)) {
$data = explode(',', $tokens);
$tickets_to_unblock = [];
foreach ($data as $item) {
$tickets_to_unblock[] = ["blocked" => "false", "id" => $item];
}
$this->ticketing->curl("tickets", "json", $tickets_to_unblock, "PATCH");
}
}
return new JsonResponse('done');
}
/**
* @Route("/include-tickets", name="include_tickets")
*/
public function includeTickets(Request $request): Response
{
if(!$request->get("saleuser")){
$sintax="&pack=null";
}
else{
$sintax="";
}
if($request->get("type")){
switch($request->get("type")){
case "2":$sintax.="&maxPrice=5000";break;
case "4":
$sintax.="&name=keys";
break;
case "6":
case "7":
$sintax .= "&name=Space+Top+Moment";
break;
default: $sintax.="";break;
}
}
if ($request->get('maxPrice'))
$sintax.="&minPrice=".$request->get('minPrice')."&maxPrice=".$request->get('maxPrice');
if($request->get("order") && $request->get("order")=="2"){
$sintax.="&order=desc";
$order = SORT_DESC;
}
else{
$sintax.="&order=asc";
$order = SORT_ASC;
}
if($request->get("name")){
$sintax.="&name=".urlencode($request->get("name"));
}
if($request->get("price_equal")){
$sintax.="&maxPrice=".$request->get("price_equal")."&minPrice=".$request->get("price_equal");
}
if($request->get("offset")){
$sintax.="&offset=".$request->get("offset");
}
if($request->get("limit")){
$sintax.="&limit=".$request->get("limit");
}
else{
$sintax.="&limit=12";
}
if($request->get("event")){
$sintax.="&event=".$request->get("event");
}
if($request->get("group")){
$sintax.="&groupBy=price";
}
$userId = $this->functions->getUserLogged();
if($request->get("small")) {
$event = $request->get("event");
// Secondary market
//$pageOnSaleByUsers = $this->onSaleByUsers($sintax);
// Tickets
$sintax = '?pack=null&maxPrice=1000&order=asc&event='.$event;
// Tickets for sale
$sintaxAdd = '&onSale=true&groupBy=price&orderBy=price¬_category=true';
$page = $this->ticketing->curl("tickets".$sintax.$sintaxAdd, "normal", [], "GET");
// Set quantity
foreach ($page['tickets'] as $key => $ticket) {
$auxTotal = $this->ticketing->curl("tickets?limit=1&onSale=true&maxPrice=" . (float)$ticket["price"] . "&minPrice=" . (float)$ticket["price"] . "&event=" . $event, "normal", [], "GET");
$page["tickets"][$key]["quantity"] = $auxTotal["total"];
if ($page["tickets"][$key]["quantity"] > 6)
$page["tickets"][$key]["quantity"] = 6;
}
// PMR movilidad reducida for sale
$sintaxAdd = '&onSale=true&groupBy=price&orderBy=price&category_name=PMR';
$pmr = $this->ticketing->curl("tickets".$sintax.$sintaxAdd, "normal", [], "GET");
// Set quantity
foreach ($pmr['tickets'] as $key => $ticket) {
$auxTotal = $this->ticketing->curl("tickets?category_name=PMR&limit=1&onSale=true&maxPrice=" . (float)$ticket["price"] . "&minPrice=" . (float)$ticket["price"] . "&event=" . $event, "normal", [], "GET");
$pmr["tickets"][$key]["quantity"] = $auxTotal["total"];
if ($pmr["tickets"][$key]["quantity"] > 6)
$pmr["tickets"][$key]["quantity"] = 6;
}
// Tickets sold out
$sintaxAdd = '&onSale=false&onSaleByUser=false&groupBy=price&orderBy=price';
$pageSoldOut = $this->ticketing->curl("tickets".$sintax.$sintaxAdd, "normal", [], "GET");
foreach ($pageSoldOut['tickets'] as $key => $ticket) {
$auxTotal = $this->ticketing->curl("tickets?limit=1&onSale=true&maxPrice=" . (float)$ticket["price"] . "&minPrice=" . (float)$ticket["price"] . "&event=" . $event,
"normal", [], "GET");
// Delete block of tickets that are not fully sold out
if (isset($auxTotal) && $auxTotal['total'] > 0)
unset($pageSoldOut['tickets'][$key]);
}
return $this->render('events/include-event-tickets.html.twig', [
'page' => $page,
'pageSoldOut' => $pageSoldOut,
//'pageOnSaleByUsers' => $pageOnSaleByUsers,
'pmr' => $pmr,
"userId" => $userId,
]);
}
else{
$sintax.= "&onSaleByUser=true";
$page = $this->ticketing->curl("tickets?orderBy=price".$sintax, "normal", [], "GET");
$price = array_column($page['tickets'], 'price');
array_multisort($price, $order, $page['tickets']);
return $this->render('tickets/include-tickets.html.twig', [
'page' => $page,
"userId" => $userId,
]);
}
}
/**
* @Route("/include-tickets-type", name="include_tickets_type")
*/
public function includeTicketType(Request $request, $ticketsTypes = null, $anonymousPurchase = null): Response
{
// General function to set discount ref/affId
$csession = $request->getSession();
$this->functions->setDiscount($request);
// Anonymous purchase
if (!empty($request->get('email-guest'))) {
$userId = $request->get('email-guest');
$csession->set('email-guest', $userId);
} else {
$userId = $this->functions->getUserLogged();
}
$event = $request->get("event");
$userType = $csession->get('userType');
$userEventId = $csession->get('userEventId');
// Direct sale for special users
if (!empty($userType) && $userType == 1 && $userEventId == $event) {
$params = '?event='. $event .'&saleType=offline';
} elseif(!empty($userType) && $userType == 1 && $userEventId != $event) {
$params = '';
} else {
$params = '?event='. $event;
}
if (!empty($ticketsTypes))
$params.= '&types='.urlencode(json_encode($ticketsTypes));
$mapUrl = '';
$eventData = $this->ticketing->curl("events/". $event, "normal", [], "GET");
if (!empty($eventData['attributes']['json']) )
$mapUrl = $eventData['attributes']['json'];
$ticketsTypes = $this->ticketing->curl("tickets-types". $params, "normal", [], "GET");
return $this->render('events/include-event-tickets-types.html.twig', [
'ticketsType' => $ticketsTypes['tickets'],
"userId" => $userId,
'eventId' => $event,
'mapUrl' => $mapUrl,
'anonymousPurchase' => $anonymousPurchase
]);
}
/**
* @Route("/include-tickets-stadium", name="include_tickets_stadium")
*/
public function includeTicketStadium(Request $request): Response
{
// General function to set discount ref/affId
$this->functions->setDiscount($request);
$userId = $this->functions->getUserLogged();
if($request->get("small")) {
$event = $request->get("event");
$tickets = $this->ticketing->curl("tickets-model?orderBy=price&order=desc&event_id=".$event, "normal", [], "GET");
$data = [];
$data['tier'] = '';
$data['pmr'] = '';
$data['upcoming_tickets'] = [];
$data['pages'] = [];
$data['free'] = '';
foreach($tickets['tickets'] as $ticket) {
if (empty($ticket['categoryName'])) {
$data['pages'][] = $ticket;
}
if (!empty($ticket['categoryName']) && $ticket['categoryName'] == 'PMR') {
$data['pmr'] = $ticket;
}
if (!empty($ticket['categoryName']) && $ticket['categoryName'] == 'Grada') {
$data['tier'] = $ticket;
}
if (!empty($ticket['categoryName']) && $ticket['categoryName'] == 'upcoming') {
$data['upcoming_tickets'][] = $ticket;
}
if (!empty($ticket['categoryName']) && $ticket['categoryName'] == 'free') {
$data['free'] = $ticket;
}
}
usort($data['upcoming_tickets'], function($a, $b) {
return strcmp($a['attributes']['level'], $b['attributes']['level']);
});
return $this->render('events/include-event-tickets-stadium.html.twig', [
'pages' => $data['pages'],
'tier' => $data['tier'],
"userId" => $userId,
'pmr' => $data['pmr'],
'free' => $data['free'],
'upcoming_tickets' => $data['upcoming_tickets'],
'total' => $tickets['total'],
'eventId' => $event
]);
}
else{
if(!$request->get("saleuser")){
$sintax="&pack=null";
}
else{
$sintax="";
}
if($request->get("type")){
switch($request->get("type")){
case "2":$sintax.="&maxPrice=5000";break;
case "4":
$sintax.="&name=keys";
break;
case "6":
case "7":
$sintax .= "&name=Space+Top+Moment";
break;
default: $sintax.="";break;
}
}
if ($request->get('maxPrice'))
$sintax.="&minPrice=".$request->get('minPrice')."&maxPrice=".$request->get('maxPrice');
if($request->get("order") && $request->get("order")=="2"){
$sintax.="&order=desc";
$order = SORT_DESC;
}
else{
$sintax.="&order=asc";
$order = SORT_ASC;
}
if($request->get("name")){
$sintax.="&name=".urlencode($request->get("name"));
}
if($request->get("price_equal")){
$sintax.="&maxPrice=".$request->get("price_equal")."&minPrice=".$request->get("price_equal");
}
if($request->get("offset")){
$sintax.="&offset=".$request->get("offset");
}
if($request->get("limit")){
$sintax.="&limit=".$request->get("limit");
}
else{
$sintax.="&limit=12";
}
if($request->get("event")){
$sintax.="&event=".$request->get("event");
}
if($request->get("group")){
$sintax.="&groupBy=price";
}
$sintax.= "&onSaleByUser=true";
$page = $this->ticketing->curl("tickets?orderBy=price".$sintax, "normal", [], "GET");
$price = array_column($page['tickets'], 'price');
array_multisort($price, $order, $page['tickets']);
return $this->render('tickets/include-tickets.html.twig', [
'page' => $page,
"userId" => $userId,
]);
}
}
/**
* @Route("/ticket-detail/{ticketId}", name="ticket-detail")
* @Route("/nft-collection/{ticketId}", name="ticket-detail-finished")
* @Route("/qr-ticket-detail/{ticketId}", name="qr-ticket-detail")
*/
public function ticketDetail(Request $request, $ticketId): Response
{
$em = $this->doctrine->getManager();
// General function to set discount ref/affId
$this->functions->setDiscount($request);
// Check if user is not registered but has tickets as anonymous user
$anonymous = FALSE;
if ($request->get('anonymous'))
$anonymous = filter_var($request->get('anonymous'), FILTER_VALIDATE_BOOLEAN);
// Check if ticketId is a serialized string (mailing links)
$serializedString = '';
if ((@unserialize(base64_decode($ticketId)) !== false)) {
$serializedString = $ticketId;
$unserializeData = unserialize(base64_decode($ticketId));
$ticketId = $unserializeData['tokenId'];
}
$userId=false;
$max=0;
$quantity=1;
$history["activity"]=array();
$ticket = $this->ticketing->curl("tickets/".$ticketId, "normal", [], "GET");
// Protect nft collection and ticket detail routes
date_default_timezone_set($ticket['event']['region']['name']);
$dateAccessTicket = date("Y-m-d H:i:s", strtotime('-24 hours'));
$route_name = $request->attributes->get('_route');
// Urls where tickets are activated
$automatic_activation_url = ['qr-ticket-detail', 'ticket-detail'];
// Automatic activation for tickets
if (!$ticket["active"] && in_array($route_name, $automatic_activation_url) && !empty($ticket["user"])
&& !$ticket['onSaleUser'] && (date("Y-m-d H:i:s") >= $ticket['event']['dateActivation']) ) {
// get event
$event = $this->ticketing->curl("events/".$ticket["event"]["id"], "normal", [], "GET");
$activation = $this->ticketing->curl("tickets/".$ticketId."/activate", "normal", ["latitude" => $event["latitude"], "longitude" => $event["longitude"]], "PATCH");
if ($activation["code"] != "200") {
$ticket['activation_not_success'] = true;
} else {
$ticket['active'] = true;
$ticket['accessCode'] = $activation['accessCode'];
}
}
if (($dateAccessTicket > $ticket['event']['dateEvent']) && $route_name != 'ticket-detail-finished') {
$this->addFlash(
'notice',
'No se puede acceder a este ticket'
);
return $this->redirectToRoute('home');
} elseif (($dateAccessTicket < $ticket['event']['dateEvent']) && $route_name != 'ticket-detail' && $route_name != 'qr-ticket-detail') {
$this->addFlash(
'notice',
'No se puede acceder a este ticket'
);
return $this->redirectToRoute('home');
}
if(!$ticket || $ticket["code"]!="200"){
$this->addFlash(
'notice',
'No se puede acceder al ticket'
);
return $this->redirectToRoute('home');
}
//Si el ticket pertence a un usuario
if($ticket["user"]){
$userId = !empty($unserializeData) ? $unserializeData['userId'] : $this->functions->getUserLogged();
if ($anonymous && !$ticket["user"]["enabled"])
$userId = $ticket["user"]["userId"];
// Anonymous users are allowed to access to nft collection
if (($dateAccessTicket < $ticket['event']['dateEvent']) && !$userId && empty($unserializeData)) {
$this->addFlash(
'notice',
'Debe iniciar sesión como usuario'
);
return $this->redirectToRoute('access', array("redirect" => $this->generateUrl('ticket-detail', array("ticketId" => $ticketId))));
}
if ($ticket["user"]["userId"] != $userId && !$ticket["onSaleUser"]) {
$this->addFlash(
'notice',
'No se puede acceder a este ticket'
);
return $this->redirectToRoute('home');
}
if(!empty($ticket["pack"])){
$page = $this->ticketing->curl("packs?event=".$ticket["event"]["id"]."&onSale=true&category=".$ticket["pack"]["category"]["id"], "normal", array(), "GET");
$sold = $this->ticketing->curl("packs?event=".$ticket["event"]["id"]."&onSale=false&category=".$ticket["pack"]["category"]["id"], "normal", array(), "GET");
}
else{
$page = $this->ticketing->curl("tickets?event=".$ticket["event"]["id"]."&onSale=true&pack=null&maxPrice=".$ticket["price"]."&minPrice=".$ticket["price"], "normal", array(), "GET");
$sold = $this->ticketing->curl("tickets?event=".$ticket["event"]["id"]."&onSale=false&pack=null&maxPrice=".$ticket["price"]."&minPrice=".$ticket["price"], "normal", array(), "GET");
}
$history = $this->ticketing->curl("tickets/activity?ticket=".$ticketId, "normal", array(), "GET");
foreach($history["activity"] as $key => $activity){
if(array_key_exists("newUser", $activity) && !empty($activity["newUser"])){
$auxUser = $em->getRepository(User::class)->findOneBy(['user_id' => $activity["newUser"]["userId"]]);
if ($auxUser instanceof User){
$alias = !empty($auxUser->getAlias()) ? $auxUser->getAlias() : "(unknown)";
$history["activity"][$key]["newUser"]["alias"] = $alias;
}
}
}
}
else{
//Si es un ticket en venta
if(!empty($ticket["pack"])){
$this->addFlash(
'notice',
'Ticket no a la venta en este momento'
);
return $this->redirectToRoute('home');
}
$page = $this->ticketing->curl("tickets?event=".$ticket["event"]["id"]."&onSale=true&pack=null&maxPrice=".$ticket["price"]."&minPrice=".$ticket["price"], "normal", array(), "GET");
if($page && array_key_exists("total", $page)){
$max=$page["total"];
if($max>15){
$max=15;
}
}
else{
$max=1;
}
$sold = $this->ticketing->curl("tickets?event=".$ticket["event"]["id"]."&onSale=false&pack=null&maxPrice=".$ticket["price"]."&minPrice=".$ticket["price"], "normal", array(), "GET");
}
if($request->get("quantity")){
if($request->get("quantity")>$max){
$this->addFlash(
'notice',
'Ha solicitado mƔs unidades de las disponibles, se le ha ajustado la cantidad al mƔximo'
);
$quantity=$max;
}
else{
$quantity=$request->get("quantity");
}
}
$routeName = $request->attributes->get('_route');
$event = $this->ticketing->curl("events/".$ticket['event']['id'], "normal", array(), "GET");
return $this->render('tickets/'.$routeName.'.html.twig', [
"ticket" => $ticket,
"max" => $max,
"onSale" => $page["total"],
"sold" => $sold["total"],
"quantity" => $quantity,
"userId" => $userId,
"history" => $history["activity"],
"scagle_url" => $_ENV['SCAGLE_URL'],
"event" => $event,
"dataSerialized" => $serializedString,
"anonymous" => $anonymous,
]);
}
/**
* @Route("/checkout-ticket/{ticketTypeId}", name="ticket-type-buy")
*/
public function ticketTypeBuy(Request $request, $ticketTypeId): Response
{
$csession = $request->getSession();
$userType = $csession->get('userType');
if (!empty($userType) && $userType == 1 )
return $this->ticketDirectSale($request, $ticketTypeId);
$em = $this->doctrine->getManager();
$type = "tickets";
$ticketType = $this->ticketing->curl("tickets-types/" . $ticketTypeId, "normal", [], "GET");
if (!$ticketType || $ticketType["code"] != "200") {
$this->addFlash(
'notice',
'No se puede acceder al ticket'
);
return $this->redirectToRoute('home');
}
// Reference data
$quantity = $request->get("quantity");
$price = $ticketType['price'];
$event = $ticketType['eventId'];
// Anonymous purchase
if (!empty($csession->get('email-guest'))) {
$userId = $this->anonymousCheckout($csession->get('email-guest'), $em);
} else {
$userId = $this->functions->getUserLogged();
}
// Check user
if (empty($userId)) {
$this->addFlash(
'notice',
'Debe iniciar sesión como usuario'
);
return $this->redirectToRoute('home');
}
// Max tickets per eventb based on maxOrder field
$tickets = $this->ticketing->curl("tickets?user=" . $userId . "&event=" . $ticketType['eventId'] . "&limit=10", "normal", [], "GET");
$sents = $this->ticketing->curl("tickets/activity?origin=" . $userId . "&limit=1&enabled=true&type=transfer&event=" . $ticketType['eventId'], "normal", [], "GET");
$sales = $this->ticketing->curl("tickets/activity?origin=" . $userId . "&limit=1&enabled=true&type=sale&event=" . $ticketType['eventId'], "normal", [], "GET");
$total_user_tickets = $tickets['total'] + $sents['total'] + $sales['total'];
$tickets_total = $total_user_tickets + $request->get('quantity');
if ($tickets_total > $ticketType['maxOrder']) {
$this->addFlash(
'notice',
'Se puede comprar un mƔximo de '. $ticketType['maxOrder'] .' tickets por evento'
);
return $this->redirectToRoute('home');
}
// Ticket type sold
$data = [
'quantity' => $quantity,
];
// Quantity sold + 1
$ticketTypeSold = $this->ticketing->curl("tickets-types/" . $ticketType['ticketTypeId'], "normal", $data, "PATCH");
if ($ticketTypeSold["code"] != "200") {
$this->addFlash(
'notice',
'No hay tickets suficientes'
);
return $this->redirectToRoute('event-tickets', ['event' => $event]);
}
// Autocomplete input coupon
$codeRef = $this->functions->autoInputCouponCode($request);
// General function to set discount ref/affId/code
$discount = $this->functions->setDiscount($request);
$version = $this->functions->addAppVersion();
$discounts = [];
$administrationFees = 0;
if (empty($ticketType['manageFeeBy']) or $ticketType['manageFeeBy'] == 'buyer') {
$administrationFees = ($ticketType['manageFee'] / 100) + 1;
}
$total = $price * $quantity;
$discountType = null;
$baseTotal = 0;
if ($discount > 0 && !empty($request->get('discount-type'))) {
$discountType = $request->get('discount-type');
switch ($discountType) {
case 1:
$total = $total - ($total * ($discount / 100));
$baseTotal = $total;
break;
case 2:
$total = $total - $discount;
$baseTotal = $total;
break;
}
}
$total = $total * $administrationFees;
// Purchase data
date_default_timezone_set('UTC');
$objUser = $em->getRepository(User::class)->findOneBy(['user_id' => $userId]);
$wh_token = bin2hex(random_bytes(45));
$purchase = new Purchase();
$purchase->setUser($objUser);
$purchase->setPrice($total);
$purchase->setToken($wh_token);
$purchase->setUpdatedAt(new \DateTime());
$purchase->setRemoved(FALSE);
if ($csession->get('ref'))
$purchase->setRef($csession->get('ref'));
if ($csession->get('affId'))
$purchase->setRef($csession->get('affId'));
if($csession->get('coupon'))
$purchase->setRef($csession->get('coupon'));
$em->persist($purchase);
$line = new Line();
$line->setPurchase($purchase);
$line->setPrice($total);
$line->setDescription("Tickets");
$em->persist($line);
for ($i = 0; $i < $quantity; $i++) {
$item = new Item();
$item->setLine($line);
$item->setTicket($ticketType['ticketTypeId']);
$item->setName($ticketType['name']);
$item->setPrice($ticketType["price"]);
$item->setQuantity(1);
$item->setCompleted(FALSE);
$em->persist($item);
}
$em->flush();
$line_items[] = [
'price_data' => [
'currency' => 'eur',
'product_data' => [
'name' => $quantity . ' x ' . $ticketType["name"]
],
'unit_amount' => (number_format($total, 2, '.', '') * 100),
],
'quantity' => 1,
];
$locale = $request->getLocale();
$checkout = [
'payment_method_types' => ['card'],
'line_items' => $line_items,
'locale' => $locale,
'mode' => 'payment',
'discounts' => $discounts,
'success_url' => $this->generateUrl('purchase_completed', ["token" => $purchase->getToken()], UrlGeneratorInterface::ABSOLUTE_URL),
'cancel_url' => $this->generateUrl('stripe_error', [], UrlGeneratorInterface::ABSOLUTE_URL),
'expires_at' => time() + 1800, // Configured to expire after 15 minutes
];
$checkout['customer_email'] = $userId;
//-------------
// init stripe
//-------------
\Stripe\Stripe::setApiKey($_ENV['STRIPE_PRIVATE']);
$session = \Stripe\Checkout\Session::create($checkout);
$purchase->setType("stripe");
$purchase->setPaymentId($session->id);
$purchase->setUpdatedAt(new \DateTime());
$em->persist($purchase);
$em->flush();
return $this->render('tickets/ticket-type-buy.html.twig', [
"item" => $ticketType,
"quantity" => $request->get("quantity"),
"type" => $type,
"image" => $ticketType["imageThumb"],
"discount" => $discount,
'version' => $version,
'codeRef' => $codeRef,
'env' => $_ENV['APP_ENV'],
"token" => $purchase->getToken(),
'checkout_id' => $session->id,
'stripe_public' => $_ENV['STRIPE_PUBLIC'],
'total' => $total,
'discount_type' => $discountType,
'base_total' => $baseTotal
]);
}
/**
* @Route("/ticket-buy/{ticketId}", name="ticket-buy")
*/
public function ticketBuy(Request $request, $ticketId): Response
{
$csession = $request->getSession();
$em = $this->doctrine->getManager();
$type = "tickets";
$ticketReference = $this->ticketing->curl("tickets/" . $ticketId, "normal", [], "GET");
if (!$ticketReference || $ticketReference["code"] != "200") {
$this->addFlash(
'notice',
'No se puede acceder al ticket'
);
return $this->redirectToRoute('home');
}
// Reference data
$quantity = $request->get("quantity");
$event = $ticketReference['event']['id'];
$price = $ticketReference['price'];
$data = [
'event' => $event,
'price' => $price,
'quantity' => $quantity,
];
$category = $ticketReference['category'];
if (!empty($category)) $data['categoryId'] = $category['id'];
// Check user
$userId = $this->functions->getUserLogged();
if (empty($userId)) {
$this->addFlash(
'notice',
'Debe iniciar sesión como usuario'
);
return $this->redirectToRoute('home');
}
// Max 6 tickets per event
$tickets = $this->ticketing->curl("tickets?user=" . $userId . "&event=" . $ticketReference['event']['id'] . "&limit=10", "normal", [], "GET");
$sents = $this->ticketing->curl("tickets/activity?origin=" . $userId . "&limit=1&enabled=true&type=transfer&event=" . $ticketReference['event']['id'], "normal", [], "GET");
$sales = $this->ticketing->curl("tickets/activity?origin=" . $userId . "&limit=1&enabled=true&type=sale&event=" . $ticketReference['event']['id'], "normal", [], "GET");
$total_user_tickets = $tickets['total'] + $sents['total'] + $sales['total'];
$tickets_total = $total_user_tickets + $request->get('quantity');
if ($tickets_total > 6) {
$this->addFlash(
'notice',
'Se puede comprar un mƔximo de 6 tickets por evento'
);
return $this->redirectToRoute('home');
}
// Ticket info count
$ticketInfo = $this->ticketing->curl("tickets-info", "normal", $data, "PATCH");
if ($ticketInfo["code"] != "200") {
$this->addFlash(
'notice',
'No hay tickets suficientes'
);
return $this->redirectToRoute('event-tickets', ['event' => $event]);
}
// Autocomplete input coupon
$codeRef = $this->functions->autoInputCouponCode($request);
// General function to set discount ref/affId/code
$discount = $this->functions->setDiscount($request, $ticketId);
$version = $this->functions->addAppVersion();
$discounts = [];
$administrationFees = 1.10;
$administrationFeesIfZero = 0.10;
$totalWithoutDiscount = $price * $quantity;
$total = ($totalWithoutDiscount - ($discount * $totalWithoutDiscount) / 100);
$total = $discount > 0
? $total + ($totalWithoutDiscount * $administrationFeesIfZero)
: $total * $administrationFees;
// Purchase data
date_default_timezone_set('UTC');
$objUser = $em->getRepository(User::class)->findOneBy(['user_id' => $userId]);
$wh_token = bin2hex(random_bytes(45));
$purchase = new Purchase();
$purchase->setUser($objUser);
$purchase->setPrice($total);
$purchase->setToken($wh_token);
$purchase->setUpdatedAt(new \DateTime());
$purchase->setRemoved(FALSE);
if ($csession->get('ref') && !$ticketReference["user"])
$purchase->setRef($csession->get('ref'));
if ($csession->get('affId') && !$ticketReference["user"])
$purchase->setRef($csession->get('affId'));
$em->persist($purchase);
$line = new Line();
$line->setPurchase($purchase);
$line->setPrice($total);
$line->setDescription("Tickets");
$em->persist($line);
for ($i = 0; $i < $quantity; $i++) {
$item = new Item();
$item->setLine($line);
$item->setTicket($ticketInfo['id']);
$item->setName($ticketReference['name']);
$item->setPrice($ticketReference["price"]);
$item->setQuantity(1);
$item->setCompleted(FALSE);
$em->persist($item);
}
$em->flush();
$line_items[] = [
'price_data' => [
'currency' => 'eur',
'product_data' => [
'name' => $quantity . ' x ' . $ticketReference["name"]
],
'unit_amount' => (number_format($total, 2, '.', '') * 100),
],
'quantity' => 1,
];
$checkout = [
'payment_method_types' => ['card'],
'line_items' => $line_items,
'locale' => 'es',
'mode' => 'payment',
'discounts' => $discounts,
'success_url' => $this->generateUrl('purchase_completed', ["token" => $purchase->getToken()], UrlGeneratorInterface::ABSOLUTE_URL),
'cancel_url' => $this->generateUrl('stripe_error', [], UrlGeneratorInterface::ABSOLUTE_URL),
'expires_at' => time() + 1800, // Configured to expire after 15 minutes
];
$checkout['customer_email'] = $userId;
//-------------
// init stripe
//-------------
\Stripe\Stripe::setApiKey($_ENV['STRIPE_PRIVATE']);
$session = \Stripe\Checkout\Session::create($checkout);
$purchase->setType("stripe");
$purchase->setPaymentId($session->id);
$purchase->setUpdatedAt(new \DateTime());
$em->persist($purchase);
$em->flush();
return $this->render('tickets/ticket-buy.html.twig', [
"item" => $ticketReference,
"quantity" => $request->get("quantity"),
"type" => $type,
"image" => $ticketReference["image"],
"discount" => $discount,
'version' => $version,
'codeRef' => $codeRef,
'env' => $_ENV['APP_ENV'],
"token" => $purchase->getToken(),
'checkout_id' => $session->id,
'stripe_public' => $_ENV['STRIPE_PUBLIC']
]);
}
/**
* @Route("/ticket-sale/{ticketId}", name="ticket-sale")
*/
public function ticketBuySecondaryMarket(Request $request, $ticketId): Response
{
$csession = $request->getSession();
$em = $this->doctrine->getManager();
$userId = false;
$type = "tickets";
$max = 0;
$ticketReference = $this->ticketing->curl("tickets/" . $ticketId, "normal", [], "GET");
if (!$ticketReference || $ticketReference["code"] != "200") {
$this->addFlash(
'notice',
'No se puede acceder al ticket'
);
return $this->redirectToRoute('home');
}
$event = $ticketReference['event']['id'];
$ticketPrice = $ticketReference['price'];
$userId = $this->functions->getUserLogged();
if (empty($userId)) {
$this->addFlash(
'notice',
'Debe iniciar sesión como usuario'
);
return $this->redirectToRoute('home');
}
// Max 6 tickets per event
$tickets = $this->ticketing->curl("tickets?user=" . $userId . "&event=" . $ticketReference['event']['id'] . "&limit=10", "normal", [], "GET");
$sents = $this->ticketing->curl("tickets/activity?origin=" . $userId . "&limit=1&enabled=true&type=transfer&event=" . $ticketReference['event']['id'], "normal", [], "GET");
$sales = $this->ticketing->curl("tickets/activity?origin=" . $userId . "&limit=1&enabled=true&type=sale&event=" . $ticketReference['event']['id'], "normal", [], "GET");
$total_user_tickets = $tickets['total'] + $sents['total'] + $sales['total'];
$tickets_total = $total_user_tickets + $request->get('quantity');
if ($tickets_total > 6) {
$this->addFlash(
'notice',
'Se puede comprar un mƔximo de 6 tickets por evento'
);
return $this->redirectToRoute('home');
}
// Stripe controller
$discounts = [];
$disc = 0;
if (!$ticketReference["user"]) {
if (!$request->get("quantity") || !is_numeric($request->get("quantity")) || $request->get("quantity") < 1 || $request->get("quantity") > 15) {
$this->addFlash(
'notice',
'Debe indicar una cantidad vƔlida'
);
return $this->redirectToRoute('event-tickets', ['event' => $event]);
}
$quantity = $request->get("quantity");
if (!$ticketPrice || !is_numeric($ticketPrice)) {
$this->addFlash(
'notice',
'El precio indicado no es correcto'
);
return $this->redirectToRoute('event-tickets', ['event' => $event]);
}
// PMR personas de movilidad reducida tickets
$pmr = '';
if ($request->get('pmr')) $pmr = filter_var($request->get('pmr'), FILTER_VALIDATE_BOOLEAN);
if (!empty($pmr) && $pmr) {
$tickets = $this->ticketing->curl("tickets/ticket-selection?event=" . $event . "&minPrice=" . $ticketPrice . "&maxPrice=" . $ticketPrice . "&orderBy=token&order=desc&onSale=true&pack=null&limit=" . $quantity . "&category_name=PMR", "normal", [], "PATCH");
} else {
$tickets = $this->ticketing->curl("tickets/ticket-selection?event=" . $event . "&minPrice=" . $ticketPrice . "&maxPrice=" . $ticketPrice . "&orderBy=token&order=desc&onSale=true&pack=null&limit=" . $quantity . "¬_category=true", "normal", [], "PATCH");
}
if ((!$tickets || !array_key_exists("tickets", $tickets)) && count($tickets['tickets']) != $quantity) {
$this->addFlash(
'notice',
'No hay tickets suficientes'
);
return $this->redirectToRoute('event-tickets', ['event' => $event]);
}
if ($csession->get('eXCxKChv'))
$disc = (int)$csession->get('eXCxKChv');
$price = 0;
foreach ($tickets["tickets"] as $tic) {
$price += $tic["price"] - ($disc * $tic['price']) / 100;
$tickets_json[] = $tic;
$quantity--;
if ($quantity <= 0) {
break;
}
}
if ($quantity > 0) {
$this->addFlash(
'notice',
'No hay tickets suficientes'
);
return $this->redirectToRoute('event-tickets', ['event' => $event]);
}
} else {
if (!$ticketReference["onSaleUser"]) {
$this->addFlash(
'notice',
'Este ticket no estĆ” a la venta'
);
return $this->redirectToRoute('event-tickets', ['event' => $event]);
}
if ($ticketReference["isBlocked"]) {
$this->addFlash(
'notice',
'Este ticket no estƔ disponible ahora mismo. Vuelva a intentarlo mƔs tarde'
);
return $this->redirectToRoute('event-tickets', ['event' => $event]);
}
$price = $ticketReference["price"];
$tickets_to_buy[] = ["blocked" => "true", "id" => $ticketReference["id"]];
$tickets_json[] = $ticketReference;
//Bloqueamos los registros para que nadie pueda comprarlos
$toBlock = $this->ticketing->curl("tickets", "json", $tickets_to_buy, "PATCH");
if ($toBlock["code"] != "200") {
$this->addFlash(
'notice',
'No se ha podido realizar la operación. Vuelva a intentarlo mÔs tarde'
);
return $this->redirectToRoute('event-tickets', ['event' => $event]);
}
}
// Autocomplete input coupon
$codeRef = $this->functions->autoInputCouponCode($request);
// General function to set discount ref/affId/code
$discount = $this->functions->setDiscount($request, $ticketId);
$version = $this->functions->addAppVersion();
// Purchase data
date_default_timezone_set('UTC');
$objUser = $em->getRepository(User::class)->findOneBy(['user_id' => $userId]);
$wh_token = bin2hex(random_bytes(45));
$administrationFees = 0;
if (empty($ticketReference['event']['manageFeeBy']) or $ticketReference['event']['manageFeeBy'] == 'buyer') {
$administrationFees = !empty($ticketReference['event']['manageFee'])
? ($ticketReference['event']['manageFee'] / 100)
: ($ticketReference['manageFee'] / 100);
}
$price = $price * ($administrationFees + 1);
$purchase = new Purchase();
$purchase->setUser($objUser);
$purchase->setPrice($price);
$purchase->setToken($wh_token);
$purchase->setUpdatedAt(new \DateTime());
$purchase->setRemoved(FALSE);
if ($csession->get('ref') && !$ticketReference["user"])
$purchase->setRef($csession->get('ref'));
if ($csession->get('affId') && !$ticketReference["user"])
$purchase->setRef($csession->get('affId'));
$em->persist($purchase);
$line = new Line();
$line->setPurchase($purchase);
$line->setPrice($price);
$line->setDescription("Tickets");
$em->persist($line);
foreach ($tickets_json as $tic_item) {
$item = new Item();
$item->setLine($line);
$item->setTicket($tic_item["id"]);
$item->setName($tic_item["name"]);
$item->setPrice($tic_item["price"]);
$item->setQuantity(1);
$item->setCompleted(FALSE);
$em->persist($item);
}
$em->flush();
$line_items = [];
foreach ($tickets_json as $tic_item) {
$price = $tic_item["price"] - ($disc * $tic_item['price']) / 100;
$price *= 1.10;
$line_items[] = [
'price_data' => [
'currency' => 'eur',
'product_data' => [
'name' => $tic_item["name"] . " - " . $tic_item["id"]
],
'unit_amount' => (number_format($price, 2, '.', '') * 100),
],
'quantity' => 1,
];
}
$locale = $request->getLocale();
$checkout = [
'payment_method_types' => ['card'],
'line_items' => $line_items,
'locale' => $locale,
'mode' => 'payment',
'discounts' => $discounts,
'success_url' => $this->generateUrl('purchase_completed', ["token" => $purchase->getToken()], UrlGeneratorInterface::ABSOLUTE_URL),
'cancel_url' => $this->generateUrl('stripe_error', [], UrlGeneratorInterface::ABSOLUTE_URL),
'expires_at' => time() + 1800, // Configured to expire after 15 minutes
];
$checkout['customer_email'] = $userId;
//-------------
// init stripe
//-------------
\Stripe\Stripe::setApiKey($_ENV['STRIPE_PRIVATE']);
$session = \Stripe\Checkout\Session::create($checkout);
$purchase->setType("stripe");
$purchase->setPaymentId($session->id);
$purchase->setUpdatedAt(new \DateTime());
$em->persist($purchase);
$em->flush();
return $this->render('tickets/ticket-buy.html.twig', [
"item" => $ticketReference,
"quantity" => $request->get("quantity"),
"type" => $type,
"image" => $ticketReference["image"],
"discount" => $discount,
'version' => $version,
'codeRef' => $codeRef,
'env' => $_ENV['APP_ENV'],
"token" => $purchase->getToken(),
'checkout_id' => $session->id,
'stripe_public' => $_ENV['STRIPE_PUBLIC']
]);
}
/**
* @Route("/ticket-seat-buy", name="ticket-seat-buy")
*/
public function ticketSeatBuy(Request $request): Response
{
$csession = $request->getSession();
$userType = $csession->get('userType');
if (!empty($userType) && $userType == 1 )
return $this->ticketDirectSeatBuy($request);
$type = "tickets";
$em = $this->doctrine->getManager();
$user = $this->functions->getUserLogged();
$tokens = $request->get('tokens');
if (!$user) {
// tokens to unblock
$data = explode(',', $tokens);
$tickets_to_unblock = [];
foreach ($data as $item) {
$tickets_to_unblock[] = ["blocked" => "false", "id" => $item];
}
// if not user logged all tickets selected are unblocked
$this->ticketing->curl("tickets", "json", $tickets_to_unblock, "PATCH");
$this->addFlash(
'notice',
'Debe iniciar sesión como usuario'
);
return $this->redirectToRoute('home');
}
$tickets = $this->ticketing->curl("tickets/?tokens=".$tokens, "normal", [], "GET");
if (!$tickets || $tickets["code"] != "200") {
$this->addFlash(
'notice',
'No se puede acceder al ticket'
);
return $this->redirectToRoute('home');
}
$administrationFees = 0;
if (empty($tickets['tickets'][0]['event']['manageFeeBy']) or $tickets['tickets'][0]['event']['manageFeeBy'] == 'buyer') {
// Get commission from event
$administrationFees = !empty($tickets['tickets'][0]['event']['manageFee'])
? $tickets['tickets'][0]['event']['manageFee'] : 10;
}
$total = $tickets['tickets'][0]['originalPrice'] * $tickets['total'];
// $extra = $request->get('price') * ($administrationFees / 100);
// $price = $request->get('price') + $extra;
$extra = $total * ($administrationFees / 100);
$price = $total;
$priceWithoutDiscount = $price;
// Autocomplete input coupon
$codeRef = $this->functions->autoInputCouponCode($request);
// General function to set discount ref/affId/code
$discount = $this->functions->setDiscount($request);
$version = $this->functions->addAppVersion();
$discountType = null;
$baseTotal = 0;
if ($discount > 0 && !empty($request->get('discount-type'))) {
$discountType = $request->get('discount-type');
switch ($discountType) {
case 1:
$price = $price - ($price * ($discount / 100));
$baseTotal = $price;
$extra = $price * ($administrationFees / 100);
break;
case 2:
$price = $price - $discount;
$baseTotal = $price;
$extra = $price * ($administrationFees / 100);
break;
}
}
$price = $price + $extra;
// Purchase data
date_default_timezone_set('UTC');
$objUser = $em->getRepository(User::class)->findOneBy(['user_id' => $user]);
$wh_token = bin2hex(random_bytes(45));
$purchase = new Purchase();
$purchase->setUser($objUser);
$purchase->setPrice($price);
$purchase->setToken($wh_token);
$purchase->setUpdatedAt(new \DateTime());
$purchase->setRemoved(FALSE);
if ($csession->get('ref'))
$purchase->setRef($csession->get('ref'));
if ($csession->get('affId'))
$purchase->setRef($csession->get('affId'));
if($csession->get('coupon'))
$purchase->setRef($csession->get('coupon'));
$em->persist($purchase);
$line = new Line();
$line->setPurchase($purchase);
$line->setPrice($price);
$line->setDescription("Tickets");
$em->persist($line);
foreach ($tickets['tickets'] as $ticket) {
$item = new Item();
$item->setLine($line);
$item->setTicket($ticket["id"]);
$item->setName($ticket["name"]);
$item->setPrice($ticket["price"]);
$item->setQuantity(1);
$item->setCompleted(FALSE);
$em->persist($item);
}
$em->flush();
$line_items[] = [
'price_data' => [
'currency' => 'eur',
'product_data' => [
'name' => strip_tags($tickets['tickets'][0]['event']['name']) . " x " . $tickets['total']
],
'unit_amount' => (number_format($price, 2, '.', '') * 100),
],
'quantity' => 1,
];
$locale = $request->getLocale();
$checkout = [
'payment_method_types' => ['card'],
'line_items' => $line_items,
'locale' => $locale,
'mode' => 'payment',
'success_url' => $this->generateUrl('purchase_completed', ["token" => $purchase->getToken()], UrlGeneratorInterface::ABSOLUTE_URL),
'cancel_url' => $this->generateUrl('stripe_error', [], UrlGeneratorInterface::ABSOLUTE_URL),
'expires_at' => time() + 1800, // Configured to expire after 15 minutes
];
$checkout['customer_email'] = $objUser->getUserId();
//-------------
// init stripe
//-------------
\Stripe\Stripe::setApiKey($_ENV['STRIPE_PRIVATE']);
$session = \Stripe\Checkout\Session::create($checkout);
$purchase->setType("stripe");
$purchase->setPaymentId($session->id);
$em->persist($purchase);
$em->flush();
return $this->render('tickets/ticket-seat-buy.html.twig', [
"item" => $tickets,
"event" => $tickets['tickets'][0]['event']['name'],
"dateEvent" => $tickets['tickets'][0]['event']['dateEvent'],
"type" => $type,
"price" => $price,
"extra" => $extra,
"image" => $tickets['tickets'][0]['imageThumb'],
"discount" => $discount,
'version' => $version,
'codeRef' => $codeRef,
"token" => $purchase->getToken(),
'env' => $_ENV['APP_ENV'],
'checkout_id' => $session->id,
'stripe_public' => $_ENV['STRIPE_PUBLIC'],
'discount_type' => $discountType,
'tokens' => $tokens,
'priceWithoutDiscount' => $priceWithoutDiscount
]);
}
/**
* @Route("/keys", name="keys")
*/
public function keys(Request $request): Response
{
// General function to set discount ref/affId
$this->functions->setDiscount($request);
$keys = $this->ticketing->curl("tickets?limit=3&orderBy=price&order=desc&name=Keys", "normal", array(), "GET");
return $this->render('keys/keys.html.twig', [
'keys' => $keys["tickets"]
]);
}
/**
* @Route("/key-detail/{keyId}", name="key-detail")
*/
public function keyDetail(Request $request,$keyId): Response
{
// General function to set discount ref/affId
$this->functions->setDiscount($request);
$key = $this->ticketing->curl("tickets/".$keyId, "normal", array(), "GET");
return $this->render('keys/key-detail.html.twig', [
"key" => $key
]);
}
/**
* @Route("/key-request/{keyId}", name="key-request")
*/
public function keyRequest(Request $request, MailerInterface $mailer, $keyId): Response
{
$key = $this->ticketing->curl("tickets/".$keyId, "normal", array(), "GET");
if($request->get('send-form')){
$name = $request->get('name');
$surname = $request->get('surname');
$phone = $request->get('phone');
$email = $request->get('email');
$key = $request->get('key');
$mail = (new TemplatedEmail())
->from($this->getParameter('mailer_from'))
->to($this->getParameter('mailer_contact'))
->subject('DOW - Solicitud Key')
->htmlTemplate('mail/key-request.html.twig')
->context([
'name' => $name,
'surname' => $surname,
'phone' => $phone,
'correo' => $email,
'key' => $key
]);
$mailer->send($mail);
$this->addFlash(
'success',
'Solicitud enviada'
);
return $this->redirectToRoute('home');
}
return $this->render('ticket/key-request.html.twig', [
"key" => $key
]);
}
/**
* @Route("/ticket-transfer/{ticketId}", name="ticket-transfer")
*/
public function ticket_transfer(Request $request, MailerInterface $mailer, $ticketId)
{
$em = $this->doctrine->getManager();
$user = $this->functions->getUserLogged();
if (!$user) {
$this->addFlash(
'notice',
'Debe iniciar sesión como usuario'
);
return new JsonResponse([
'status' => false,
'message' => '#ERROR1#',
'data' => []
], 403);
}
if (!$request->get("user")) {
return new JsonResponse([
'status' => false,
'message' => 'El email no ha sido especificado',
'data' => []
], 403);
}
if (!filter_var($request->get("user"), FILTER_VALIDATE_EMAIL)) {
return new JsonResponse([
'status' => false,
'message' => 'No es un email vƔlido',
'data' => []
], 403);
}
if ($user == $request->get("user")) {
return new JsonResponse([
'status' => false,
'message' => 'No puede enviarse la entrada a sĆ mismo',
'data' => []
], 403);
}
$ticket = $this->ticketing->curl("tickets/" . $ticketId, "normal", [], "GET");
if (!$ticket || $ticket["code"] != "200") {
$this->addFlash(
'notice',
'No se puede acceder al ticket'
);
return $this->redirectToRoute('home');
}
if ($ticket["user"]["userId"] != $user) {
$this->addFlash(
'notice',
'No se puede acceder a este ticket'
);
return $this->redirectToRoute('home');
}
$wh_token = bin2hex(random_bytes(45));
$transfer = $this->ticketing->curl("tickets/" . $ticketId . "/transfer", "normal",
[
"token" => $wh_token,
"user" => $request->get("user")
], "PATCH");
if ($transfer["code"] != "200") {
return new JsonResponse([
'status' => false,
'message' => $transfer['message'],
'data' => []
], 403);
}
if (array_key_exists('registerCode', $transfer)) {
$objUser = $em->getRepository(User::class)->findOneBy(['user_id' => $request->get("user")]);
if (!$objUser) {
$objUser = new User();
$objUser->setUserId($request->get("user"));
$objUser->setCreatedAt(new \DateTime());
$em->persist($objUser);
$em->flush();
}
$email = (new TemplatedEmail())
->from($this->getParameter('mailer_from'))
->to($request->get("user"))
->subject('DOW - Entradas recibidas')
->htmlTemplate('mail/register2.html.twig')
->context([
'userId' => $request->get("user"),
'registerCode' => $transfer["registerCode"],
'event' => $ticket["event"]["name"]
]);
} else {
$email = (new TemplatedEmail())
->from($this->getParameter('mailer_from'))
->to($request->get("user"))
->subject('DOW - Entradas recibidas')
->htmlTemplate('mail/receive-tickets.html.twig')
->context([
'event' => $ticket["event"]["name"]
]);
}
$mailer->send($email);
return new JsonResponse([
'status' => true,
'message' => 'El ticket se ha enviado con Ʃxito'
]);
}
/**
* @Route("/ticket-sell/{ticketId}", name="ticket-sell")
*/
public function ticket_sell(Request $request, MailerInterface $mailer, $ticketId)
{
$em = $this->doctrine->getManager();
$user = $this->functions->getUserLogged();
if (!$user) {
$this->addFlash(
'notice',
'Debe iniciar sesión como usuario'
);
return new JsonResponse([
'status' => false,
'message' => '#ERROR1#',
'data' => []
], 403);
}
if (!$request->get("price")) {
return new JsonResponse([
'status' => false,
'message' => 'El precio no ha sido especificado',
'data' => []
], 403);
}
$ticket = $this->ticketing->curl("tickets/" . $ticketId, "normal", [], "GET");
if (!$ticket || $ticket["code"] != "200") {
return new JsonResponse([
'status' => false,
'message' => 'No se puede acceder al nft',
'data' => []
], 403);
}
// Check sale price
$price = $request->get("price");
$marketplaceStartPercentage = !empty($ticket['event']['marketplaceStartPercentage'])
? $ticket['event']['marketplaceStartPercentage'] : 999;
$marketplaceMaxSalePercentage = !empty($ticket['event']['marketplaceMaxSalePercentage'])
? $ticket['event']['marketplaceMaxSalePercentage'] : 999;
$minPrice = $ticket['originalPrice'] - ($ticket['originalPrice'] * ($marketplaceStartPercentage / 100));
$maxPrice = $ticket['originalPrice'] + ($ticket['originalPrice'] * ($marketplaceMaxSalePercentage / 100));
if ($price >= $minPrice && $price <= $maxPrice) {
$checkPrice = true;
} else {
return new JsonResponse([
'status' => false,
'message' => 'El precio de venta no puede ser inferior a '. $minPrice .' ni superior a '. $maxPrice,
'data' => []
], 403);
}
// Type collection or ticket for messages
date_default_timezone_set("Europe/Madrid");
if (date("Y-m-d h:i:s") > $ticket['event']['dateEvent']) {
$type = 'collection';
} else {
$type = 'ticket';
}
if ($ticket["user"]["userId"] != $user) {
return new JsonResponse([
'status' => false,
'message' => 'No se puede acceder al ' . $type,
'data' => []
], 403);
}
$sell = $this->ticketing->curl("sales", "normal", ["ticket" => $ticketId, "price" => $request->get("price")], "POST");
if ($sell["code"] != "200") {
return new JsonResponse([
'status' => false,
'message' => 'El ' . $type . ' no ha podido ponserse en venta. Vuelva a intentarlo mƔs tarde',
'data' => []
], 403);
}
return new JsonResponse([
'status' => true,
'message' => 'El ' . $type . ' ha sido puesto en venta satisfactoriamente'
]);
}
/**
* @Route("/ticket-retire-sell/{ticketId}", name="ticket-retire-sell")
*/
public function ticket_retire_sell(Request $request, $ticketId)
{
$em = $this->doctrine->getManager();
$user = $this->functions->getUserLogged();
if (!$user) {
$this->addFlash(
'notice',
'Debe iniciar sesión como usuario'
);
return new JsonResponse([
'status' => false,
'message' => '#ERROR1#',
'data' => []
], 403);
}
$ticket = $this->ticketing->curl("tickets/" . $ticketId, "normal", [], "GET");
if (!$ticket || $ticket["code"] != "200") {
return new JsonResponse([
'status' => false,
'message' => 'No se puede acceder al nft',
'data' => []
], 403);
}
// Type collection or ticket for messages
date_default_timezone_set("Europe/Madrid");
if (date("Y-m-d h:i:s") > $ticket['event']['dateEvent']) {
$type = 'collection';
} else {
$type = 'ticket';
}
if ($ticket["user"]["userId"] != $user) {
return new JsonResponse([
'status' => false,
'message' => 'No se puede acceder al ' . $type,
'data' => []
], 403);
}
$sell = $this->ticketing->curl("sales/" . $ticketId, "normal", [], "DELETE");
if ($sell["code"] != "200") {
return new JsonResponse([
'status' => false,
'message' => 'El ' . $type . ' no ha podido retirarse de la venta. Vuelva a intentarlo mƔs tarde',
'data' => []
], 403);
}
return new JsonResponse([
'status' => true,
'message' => 'El ' . $type . ' se ha retirado de la venta satisfactoriamente'
]);
}
/**
* @Route("/ticket-activation/{ticketId}", name="ticket-activation")
*/
public function ticket_activation(Request $request, MailerInterface $mailer, $ticketId)
{
$em = $this->doctrine->getManager();
$anonymous = FALSE;
$user = $this->functions->getUserLogged();
if ($request->get('anonymous'))
$anonymous = filter_var($request->get('anonymous'), FILTER_VALIDATE_BOOLEAN);
// Check if ticketId is a serialized string
if ((@unserialize(base64_decode($ticketId)) !== false)) {
$unserializeData = unserialize(base64_decode($ticketId));
$ticketId = $unserializeData['tokenId'];
$user = $unserializeData['userId'];
}
$ticket = $this->ticketing->curl("tickets/".$ticketId, "normal", array(), "GET");
if ($anonymous && !$ticket["user"]["enabled"])
$user = $ticket["user"]["userId"];
if(!$ticket || $ticket["code"]!="200"){
$this->addFlash(
'notice',
'No se puede acceder al QR'
);
return $this->redirectToRoute('home');
}
if($ticket["user"]["userId"]!=$user){
$this->addFlash(
'notice',
'No se puede acceder a este ticket'
);
return $this->redirectToRoute('home');
}
if($ticket["onSaleUser"])
{
$this->addFlash(
'notice',
'No se puede activar este ticket porque estĆ” en venta'
);
return $this->redirectToRoute('home');
}
if(!$ticket["active"]){
$event = $this->ticketing->curl("events/".$ticket["event"]["id"], "normal", array(), "GET");
if(!$event || $event["code"]!="200"){
$this->addFlash(
'notice',
'No se puede acceder al QR'
);
return $this->redirectToRoute('home');
}
$ticket = $this->ticketing->curl("tickets/".$ticketId."/activate", "normal", array("latitude" => $event["latitude"], "longitude" => $event["longitude"]), "PATCH");
if($ticket["code"]!="200"){
return new JsonResponse([
'status' => false,
'message' => $ticket["message"],
'data' => []
], 403);
}
}
$qr = new QrCode($ticket["accessCode"]);
return new JsonResponse([
'status' => true,
'accessCode' => $qr->writeDataUri()
]);
}
/**
* @Route("/view-qr/{ticketId}", name="view-qr")
*/
public function view_qr(Request $request, MailerInterface $mailer, $ticketId)
{
$anonymous = FALSE;
if ($request->get('anonymous'))
$anonymous = filter_var($request->get('anonymous'), FILTER_VALIDATE_BOOLEAN);
$ticket = $this->ticketing->curl("tickets/" . $ticketId, "normal", [], "GET");
$user = $this->functions->getUserLogged();
if ($anonymous && !$ticket["user"]["enabled"])
$user = $ticket["user"]["userId"];
// Users not logged, code for download pdf in url tokenized
if ($anonymous && empty($user))
$user = $ticket["user"]["userId"];
if(!$ticket || $ticket["code"]!="200" || !$ticket["active"]){
$this->addFlash(
'notice',
'No se puede acceder al QR'
);
return $this->redirectToRoute('home');
}
if ($ticket["user"]["userId"] != $user) {
$this->addFlash(
'notice',
'No se puede acceder a este ticket'
);
return $this->redirectToRoute('home');
}
$qr = new QrCode($ticket["accessCode"]);
// Configure Dompdf according to your needs
$pdfOptions = new Options();
$pdfOptions->set('defaultFont', 'Helvetica');
$pdfOptions->set('isRemoteEnabled', TRUE);
$pdfOptions->set('isHtml5ParserEnabled', TRUE);
// Instantiate Dompdf with our options
$dompdf = new Dompdf($pdfOptions);
// Retrieve the HTML generated in our twig file
// mail/view-qr.html.twig
$html = $this->renderView('downloads/download-pdf.html.twig', [
"ticket" => $ticket
]);
// Load HTML to Dompdf
$dompdf->loadHtml($html);
// (Optional) Setup the paper size and orientation 'portrait' or 'portrait'
$dompdf->setPaper('A4', 'portrait');
// Render the HTML as PDF
$dompdf->render();
// Output the generated PDF to Browser (force download)
$dompdf->stream("ticket-".$ticket["id"].".pdf", [
"Attachment" => true
]);
}
/**
* @Route("/download-pdf/{ticketId}", name="download-pdf")
*/
public function download_pdf(Request $request, MailerInterface $mailer, $ticketId)
{
$em = $this->doctrine->getManager();
$user = $this->functions->getUserLogged();
$anonymous = FALSE;
$ticket = $this->ticketing->curl("tickets/" . $ticketId, "normal", [], "GET");
if ($request->get('anonymous'))
$anonymous = filter_var($request->get('anonymous'), FILTER_VALIDATE_BOOLEAN);
if ($anonymous && !$ticket["user"]["enabled"])
$user = $ticket["user"]["userId"];
// Users not logged, code for download pdf in url tokenized
if ($anonymous && empty($user))
$user = $ticket["user"]["userId"];
if (!$user) {
$this->addFlash(
'notice',
'Debe iniciar sesión como usuario'
);
return $this->redirectToRoute('access');
}
if ($ticket["code"] == "200" && !empty($ticket) && !$ticket['active']) {
// Unblock ticket
if ($ticket['isBlocked'])
$this->ticketing->curl("tickets/" . $ticket['id'], "normal", ["blocked" => "false"], "PATCH");
// Remove tickets on sale in secondary market
if ($ticket['onSaleUser'])
$this->ticketing->curl("sales/" . $ticket['id'], "normal", [], "DELETE");
// Get event
$event = $this->ticketing->curl("events/".$ticket["event"]["id"], "normal", [], "GET");
$ticket = $this->ticketing->curl("tickets/".$ticket['id']."/activate", "normal", ["latitude" => $event["latitude"], "longitude" => $event["longitude"]], "PATCH");
if ($ticket["code"] != "200" && $ticket['active']) {
$this->addFlash(
'notice',
'No se puede acceder al QR'
);
return $this->redirectToRoute('userProfile');
}
}
if ($ticket["user"]["userId"] != $user) {
$this->addFlash(
'notice',
'No se puede acceder a este ticket'
);
return $this->redirectToRoute('userProfile');
}
$qr = new QrCode($ticket["accessCode"]);
// Configure Dompdf according to your needs
$pdfOptions = new Options();
$pdfOptions->set('defaultFont', 'Helvetica');
$pdfOptions->set('isRemoteEnabled', TRUE);
$pdfOptions->set('isHtml5ParserEnabled', TRUE);
// Instantiate Dompdf with our options
$dompdf = new Dompdf($pdfOptions);
// Retrieve the HTML generated in our twig file
$html = $this->renderView('downloads/download-pdf.html.twig', [
"ticket" => $ticket
]);
// Load HTML to Dompdf
$dompdf->loadHtml($html);
// (Optional) Setup the paper size and orientation 'portrait' or 'portrait'
$dompdf->setPaper('A4', 'portrait');
// Render the HTML as PDF
$dompdf->render();
// Output the generated PDF to Browser (force download)
$dompdf->stream("ticket-" . $ticket["id"] . ".pdf", [
"Attachment" => true
]);
}
/**
* @Route("/select-ticket", name="select-ticket")
*/
public function selectTicket(Request $request): Response
{
//Keep url for url referrals
// General function to set discount ref/affId
$this->functions->setDiscount($request);
return $this->redirectToRoute('events');
}
/**
* @Route("/ticket-recover/{ticketId}", name="ticket-recover")
*/
public function ticket_recover(Request $request, MailerInterface $mailer, $ticketId)
{
$em = $this->doctrine->getManager();
$user = $this->functions->getUserLogged();
if(!$user){
$this->addFlash(
'notice',
'Debe iniciar sesión como usuario'
);
return new JsonResponse([
'status' => false,
'message' => '#ERROR1#',
'data' => []
], 403);
}
$ticket = $this->ticketing->curl("tickets/".$ticketId, "normal", [], "GET");
if(!$ticket || $ticket["code"] != "200") {
$this->addFlash(
'notice',
'No se puede acceder al ticket'
);
return $this->redirectToRoute('home');
}
$wh_token = bin2hex(random_bytes(45));
$transfer = $this->ticketing->curl("tickets/".$ticketId."/recover", "normal", ["token" => $wh_token, "oldUserId" => $request->get("oldUserId"), "newUserId" => $request->get("newUserId")], "PATCH");
if($transfer["code"] != "200") {
return new JsonResponse([
'status' => false,
'message' => 'El ticket no ha podido recuperarse en este momento. Vuelva a intentarlo mƔs tarde',
'data' => []
], 403);
}
return new JsonResponse([
'status' => true,
'message' => 'El ticket se ha recuperado con Ʃxito.'
]);
}
/**
* @param $sintax
* @return array|mixed
*/
private function onSaleByUsers($sintax){
// On sale false
$sintax.="&onSaleByUser=true";
// Searching params for tickets
$userAlias = ' ';
$page = $this->ticketing->curl("tickets?orderBy=price".$sintax, "normal", [], "GET");
foreach($page["tickets"] as $key => $ticket){
$em = $this->doctrine->getManager();
if (!empty($page["tickets"][$key]["user"]['userId']))
$userAlias = $em->getRepository(User::class)->findOneBy(['user_id' => $page["tickets"][$key]["user"]["userId"]])->getAlias();
$page["tickets"][$key]["user"]["userAlias"] = $userAlias;
}
return $page;
}
/**
* @param $purchaseId
* @param $purchaseToken
* @param $total
* @return array
*/
private function redsysData($purchaseId, $purchaseToken, $total): array
{
$redsys = new RedsysAPI;
$fuc = $_ENV['REDSYS_FUC'];
$terminal = "1";
$currency = "978";
$trans = "0";
$url = $this->generateUrl('redsys_notification', [], UrlGeneratorInterface::ABSOLUTE_URL);
$urlOK = $this->generateUrl('purchase_completed', ["token" => $purchaseToken], UrlGeneratorInterface::ABSOLUTE_URL);
$urlKO = $this->generateUrl('home', [], UrlGeneratorInterface::ABSOLUTE_URL);
$id = $purchaseId;
$amount = $total * 100;
$redsys->setParameter("DS_MERCHANT_AMOUNT", (string)$amount);
$redsys->setParameter("DS_MERCHANT_ORDER", $id);
$redsys->setParameter("DS_MERCHANT_MERCHANTCODE", $fuc);
$redsys->setParameter("DS_MERCHANT_CURRENCY", $currency);
$redsys->setParameter("DS_MERCHANT_TRANSACTIONTYPE", $trans);
$redsys->setParameter("DS_MERCHANT_TERMINAL", $terminal);
$redsys->setParameter("DS_MERCHANT_MERCHANTURL", $url);
$redsys->setParameter("DS_MERCHANT_URLOK", $urlOK);
$redsys->setParameter("DS_MERCHANT_URLKO", $urlKO);
$redsysVersion = "HMAC_SHA256_V1";
$kc = $_ENV['REDSYS_KC'];
$redsysParams = $redsys->createMerchantParameters();
$redsysSignature = $redsys->createMerchantSignature($kc);
return [
'redsysVersion' => $redsysVersion,
'redsysParams' => $redsysParams,
'redsysSignature' => $redsysSignature
];
}
private function ticketDirectSale(Request $request, $ticketTypeId): Response
{
$csession = $request->getSession();
$em = $this->doctrine->getManager();
$type = "tickets";
$ticketType = $this->ticketing->curl("tickets-types/" . $ticketTypeId, "normal", [], "GET");
if (!$ticketType || $ticketType["code"] != "200") {
$this->addFlash(
'notice',
'No se puede acceder al ticket'
);
return $this->redirectToRoute('home');
}
// Reference data
$quantity = $request->get("quantity");
$price = $ticketType['price'];
$event = $ticketType['eventId'];
// Check user
$userId = $this->functions->getUserLogged();
if (empty($userId)) {
$this->addFlash(
'notice',
'Debe iniciar sesión como usuario'
);
return $this->redirectToRoute('home');
}
// Max tickets per eventb based on maxOrder field
$tickets = $this->ticketing->curl("tickets?user=" . $userId . "&event=" . $ticketType['eventId'] . "&limit=10", "normal", [], "GET");
$sents = $this->ticketing->curl("tickets/activity?origin=" . $userId . "&limit=1&enabled=true&type=transfer&event=" . $ticketType['eventId'], "normal", [], "GET");
$sales = $this->ticketing->curl("tickets/activity?origin=" . $userId . "&limit=1&enabled=true&type=sale&event=" . $ticketType['eventId'], "normal", [], "GET");
$total_user_tickets = $tickets['total'] + $sents['total'] + $sales['total'];
$tickets_total = $total_user_tickets + $request->get('quantity');
if ($tickets_total > $ticketType['maxOrder']) {
$this->addFlash(
'notice',
'Se puede comprar un mƔximo de '. $ticketType['maxOrder'] .' tickets por evento'
);
return $this->redirectToRoute('home');
}
// Ticket type sold
$data = [
'quantity' => $quantity,
];
// Quantity sold + 1
$ticketTypeSold = $this->ticketing->curl("tickets-types/" . $ticketType['ticketTypeId'], "normal", $data, "PATCH");
if ($ticketTypeSold["code"] != "200") {
$this->addFlash(
'notice',
'No hay tickets suficientes'
);
return $this->redirectToRoute('event-tickets', ['event' => $event]);
}
// Autocomplete input coupon
$codeRef = $this->functions->autoInputCouponCode($request);
// General function to set discount ref/affId/code
$discount = $this->functions->setDiscount($request);
$version = $this->functions->addAppVersion();
$discounts = [];
$administrationFees = 0;
$administrationFeesIfZero = 0;
if (empty($ticketType['manageFeeBy']) or $ticketType['manageFeeBy'] == 'buyer') {
$administrationFees = ($ticketType['manageFee'] / 100) + 1;
$administrationFeesIfZero = $ticketType['manageFee'] / 100;
}
$totalWithoutDiscount = $price * $quantity;
$total = ($totalWithoutDiscount - ($discount * $totalWithoutDiscount) / 100);
$total = $discount > 0
? $total + ($totalWithoutDiscount * $administrationFeesIfZero)
: $total * $administrationFees;
// Purchase data
date_default_timezone_set('UTC');
$objUser = $em->getRepository(User::class)->findOneBy(['user_id' => $userId]);
$wh_token = bin2hex(random_bytes(45));
$purchase = new Purchase();
$purchase->setUser($objUser);
$purchase->setPrice($total);
$purchase->setToken($wh_token);
$purchase->setUpdatedAt(new \DateTime());
$purchase->setRemoved(FALSE);
$purchase->setType("taquilla");
if ($csession->get('ref'))
$purchase->setRef($csession->get('ref'));
if ($csession->get('affId'))
$purchase->setRef($csession->get('affId'));
$em->persist($purchase);
$line = new Line();
$line->setPurchase($purchase);
$line->setPrice($total);
$line->setDescription("Tickets");
$em->persist($line);
for ($i = 0; $i < $quantity; $i++) {
$item = new Item();
$item->setLine($line);
$item->setTicket($ticketType['ticketTypeId']);
$item->setName($ticketType['name']);
$item->setPrice($ticketType["price"]);
$item->setQuantity(1);
$item->setCompleted(FALSE);
$em->persist($item);
}
$em->flush();
return $this->render('tickets/ticket-type-direct-buy.html.twig', [
'item' => $ticketType,
'quantity' => $request->get("quantity"),
'type' => $type,
'image' => $ticketType["imageThumb"],
'discount' => $discount,
'version' => $version,
'codeRef' => $codeRef,
'env' => $_ENV['APP_ENV'],
'token' => $purchase->getToken(),
]);
}
private function ticketDirectSeatBuy(Request $request): Response
{
$type = "tickets";
$em = $this->doctrine->getManager();
$user = $this->functions->getUserLogged();
$tokens = $request->get('tokens');
if (!$user) {
// tokens to unblock
$data = explode(',', $tokens);
$tickets_to_unblock = [];
foreach ($data as $item) {
$tickets_to_unblock[] = ["blocked" => "false", "id" => $item];
}
// if not user logged all tickets selected are unblocked
$this->ticketing->curl("tickets", "json", $tickets_to_unblock, "PATCH");
$this->addFlash(
'notice',
'Debe iniciar sesión como usuario'
);
return $this->redirectToRoute('home');
}
$tickets = $this->ticketing->curl("tickets/?tokens=".$tokens, "normal", [], "GET");
if (!$tickets || $tickets["code"] != "200") {
$this->addFlash(
'notice',
'No se puede acceder al ticket'
);
return $this->redirectToRoute('home');
}
$administrationFees = 0;
if (empty($tickets['tickets'][0]['event']['manageFeeBy']) or $tickets['tickets'][0]['event']['manageFeeBy'] == 'buyer') {
// Get commission from event
$administrationFees = !empty($tickets['tickets'][0]['event']['manageFee'])
? $tickets['tickets'][0]['event']['manageFee'] : 10;
}
$extra = $request->get('price') * ($administrationFees / 100);
$price = $request->get('price') + $extra ;
// Autocomplete input coupon
$codeRef = $this->functions->autoInputCouponCode($request);
// General function to set discount ref/affId/code
$discount = $this->functions->setDiscount($request);
$version = $this->functions->addAppVersion();
// Purchase data
date_default_timezone_set('UTC');
$objUser = $em->getRepository(User::class)->findOneBy(['user_id' => $user]);
$wh_token = bin2hex(random_bytes(45));
$purchase = new Purchase();
$purchase->setUser($objUser);
$purchase->setPrice($price);
$purchase->setToken($wh_token);
$purchase->setUpdatedAt(new \DateTime());
$purchase->setRemoved(FALSE);
$purchase->setType("taquilla");
$em->persist($purchase);
$line = new Line();
$line->setPurchase($purchase);
$line->setPrice($price);
$line->setDescription("Tickets");
$em->persist($line);
$price = 0;
foreach ($tickets['tickets'] as $ticket) {
$item = new Item();
$item->setLine($line);
$item->setTicket($ticket["id"]);
$item->setName($ticket["name"]);
$item->setPrice($ticket["price"]);
$item->setQuantity(1);
$item->setCompleted(FALSE);
$em->persist($item);
$price += $ticket["price"];
$tickets_json[]=$ticket;
}
$em->flush();
$em->persist($purchase);
$em->flush();
return $this->render('tickets/ticket-seat-direct-buy.html.twig', [
"item" => $tickets,
"event" => $tickets['tickets'][0]['event']['name'],
"eventId" => $tickets['tickets'][0]['event']['id'],
"dateEvent" => $tickets['tickets'][0]['event']['dateEvent'],
"type" => $type,
"price" => $price,
"extra" => $extra,
"image" => $tickets['tickets'][0]['imageThumb'],
"discount" => $discount,
'version' => $version,
'codeRef' => $codeRef,
"token" => $purchase->getToken(),
'env' => $_ENV['APP_ENV'],
]);
}
/**
* @param $emailPreregister
* @param $em
* @return mixed|null
*/
private function anonymousCheckout($emailPreregister, $em)
{
$result = $this->ticketing->curl("users", "normal", ["userId" => $emailPreregister], "POST");
if (!empty($result['id'])) {
$user = new User();
$user->setUserId($result["userId"]);
$user->setCreatedAt(new \DateTime());
$user->setAlias('-');
$em->persist($user);
$em->flush();
return $result["userId"];
}
return $emailPreregister;
}
}