File: /var/www/vhost/disk-apps/alq-cali.bikenow.co/app/Http/Controllers/ComplimentaryTicketController.php
<?php
namespace App\Http\Controllers;
use App\Core\Ticket\Application\ComplimentaryTicketService;
use App\Core\Ticket\TicketStatusEnum;
use App\Core\Ticket\TicketTypesEnum;
use App\Http\Controllers\Exports\ComplimentaryTicketsDetailsExport;
use App\Http\Controllers\Exports\ComplimentaryTicketsExport;
use \Excel;
use Carbon\Carbon;
use App\MatchEvent;
use App\Season;
use App\Ticket;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Support\Facades\DB;
use Yajra\DataTables\Facades\DataTables;
class ComplimentaryTicketController extends Controller
{
protected $util;
protected $complimentaryTicketService;
public function __construct()
{
$this->util = new UtilController;
$this->complimentaryTicketService = new ComplimentaryTicketService();
}
public function index()
{
$seasons = Season::select('id', 'name')->orderBy('active', 'desc')->orderBy('created_at', 'desc')->get();
$matchEvents = MatchEvent::select('id', 'name', 'event_start', 'active')->orderBy('active', 'desc')->orderBy('created_at', 'desc')->get();
return view('complimentary_tickets.list', compact('seasons', 'matchEvents'));
}
public function tableFilter(Request $request)
{
$obj = $this->tableFilterQuery($request);
DB::enableQueryLog();
$dataTable = DataTables::of($obj);
$this->tableFilterCustomColumns($dataTable);
$response = $dataTable->make(true);
$data = $response->getData();
$data = json_decode(json_encode($data), true);
$queries = \DB::getQueryLog();
$data['queries'] = $queries;
return $data;
}
public function validateExport(Request $request, $type = null)
{
if ($request['query']) {
$results = $this->util->getGenericData($request["query"], $request["bindings"]);
if (count($results) > 0) {
if ($type && $type == 'details') {
$name = 'DetalleCortesiasGeneradas' . time() . '.xlsx';
Excel::store(new ComplimentaryTicketsDetailsExport($results), $name, 'public');
} else {
$name = 'CortesiasGeneradas' . time() . '.xlsx';
Excel::store(new ComplimentaryTicketsExport($results), $name, 'public');
}
return response()->json(['success' => true, 'message' => 'Validación OK', 'data' => $name]);
}
}
return response()->json(['success' => false, 'message' => 'No existen datos a exportar']);
}
public function export($name)
{
return $this->util->export($name);
}
public function details($ticketMainId, $userId)
{
$seasons = Season::select('id', 'name')->orderBy('active', 'desc')->orderBy('created_at', 'desc')->get();
$matchEvents = MatchEvent::select('id', 'name', 'event_start', 'active')->orderBy('active', 'desc')->orderBy('created_at', 'desc')->get();
return view('complimentary_tickets.details', compact('seasons', 'matchEvents', 'ticketMainId', 'userId'));
}
public function tableFilterDetails(Request $request)
{
$obj = $this->tableDetailFilterQuery($request);
DB::enableQueryLog();
$dataTable = DataTables::of($obj);
$this->tableDetailFilterCustomColumns($dataTable);
$response = $dataTable->make(true);
$data = $response->getData();
$data = json_decode(json_encode($data), true);
$queries = \DB::getQueryLog();
$newQueries = [];
foreach ($queries as $query) {
if (str_contains($query['query'], 'group by')) {
$newQueries[] = $query;
}
}
$data['queries'] = $newQueries;
return $data;
}
public function changeSeats(Request $request)
{
try {
$this->complimentaryTicketService->changeSeats($request->ticketMainId, $request->userId, $request->zoneId);
$this->registerLog(Auth::user()->id, 'Cambio de sillas', $request->dataLog, 'Update', $this->getModule($request));
return response()->json(['success' => true, 'message' => 'Cambio de sillas correctamente']);
} catch (\Exception $e) {
return response()->json(['success' => false, 'message' => 'Error al cambiar de sillas: ' . $e->getMessage()]);
}
}
public function changeEmail(Request $request)
{
try {
$this->complimentaryTicketService->changeEmail($request->ticketMainId, $request->userId, $request->email);
$this->registerLog(Auth::user()->id, 'Cambio de correo', $request->dataLog, 'Update', $this->getModule($request));
return response()->json(['success' => true, 'message' => 'Cambio de correo correctamente']);
} catch (\Exception $e) {
return response()->json(['success' => false, 'message' => 'Error al cambiar el correo: ' . $e->getMessage()]);
}
}
public function sendEmailNotification(Request $request)
{
try {
$this->complimentaryTicketService->notificationTickets($request->ticketMainId, $request->userId);
$this->registerLog(Auth::user()->id, 'Enviar notificación', $request->dataLog, 'Update', $this->getModule($request));
return response()->json(['success' => true, 'message' => 'Enviar notificación correctamente']);
} catch (\Exception $e) {
return response()->json(['success' => false, 'message' => 'Error al enviar las notificaciones: ' . $e->getMessage()]);
}
}
public function cancelComplimentaryTickets(Request $request)
{
try {
$this->complimentaryTicketService->cancelComplimentaryTickets($request->ticketMainId, $request->userId);
$this->registerLog(Auth::user()->id, 'Anular cortesias', $request->dataLog, 'Update', $this->getModule($request));
return response()->json(['success' => true, 'message' => 'Cortesias anuladas correctamente']);
} catch (\Exception $e) {
return response()->json(['success' => false, 'message' => 'Error al anular las cortesias: ' . $e->getMessage()]);
}
}
private function tableFilterQuery($request)
{
$seasons = $request->seasons;
$matchEvents = $request->matchEvents;
$startComplimentaryTicket = $request->startComplimentaryTicket;
$endComplimentaryTicket = $request->endComplimentaryTicket;
$obj = Ticket::select(
'ticket_mains.id',
'tickets.user_id',
DB::raw('IFNULL(ticket_mains.payment_reference, ticket_mains.id) AS reference'),
'users.email',
'users.document',
DB::raw('COUNT(tickets.id) AS tickets'),
DB::raw('MAX(seasons.name) AS season'),
DB::raw('MAX(match_events.name) AS match_event'),
DB::raw('MAX(match_events.date_name) AS match_event_date'),
DB::raw('MAX(match_events.zone_id) AS zone_id'),
DB::raw('GROUP_CONCAT(DISTINCT tickets.zone) AS zone'),
'ticket_mains.created_at',
)
->join('ticket_mains', 'ticket_mains.id', '=', 'tickets.ticket_main_id')
->join('match_events', 'match_events.id', '=', 'tickets.match_event_id')
->join('seasons', 'seasons.id', '=', 'match_events.season_id')
->join('users', 'users.id', '=', 'tickets.user_id')
->where('tickets.ticket_type_id', TicketTypesEnum::COMPLIMENTARY)
->whereIn('tickets.ticket_status_id', [TicketStatusEnum::PURCHASED, TicketStatusEnum::CREATED])
->groupBy('ticket_mains.id', 'tickets.user_id')
->orderBy('ticket_mains.created_at', 'DESC');
if ($seasons && $seasons != 'null') {
$obj->whereIn('match_events.season_id', $seasons);
}
if ($matchEvents && $matchEvents != 'null') {
$obj->whereIn('match_events.id', $matchEvents);
}
if ($startComplimentaryTicket && $startComplimentaryTicket != 'null') {
$obj->whereDate('tickets.created_at', '>=', $startComplimentaryTicket);
}
if ($endComplimentaryTicket && $endComplimentaryTicket != 'null') {
$obj->whereDate('tickets.created_at', '<=', $endComplimentaryTicket);
}
return $obj;
}
private function tableFilterCustomColumns($dataTable)
{
$dataTable->addColumn('actions', function ($obj) {
if (
$this->validateRolePermissions('complimentary_ticket', 'administrator') ||
$this->validateRolePermissions('complimentary_ticket', 'supervisor')
) {
$actions = '';
$actions .= '<i class="fa fa-pencil iconMini" onClick="viewComplimentaryTickets(' . $obj->id . ', ' . $obj->user_id . ', this)" data-log="' . htmlspecialchars(json_encode($obj), ENT_QUOTES, 'UTF-8') . '" title="Ver cortesias"></i>';
$actions .= '<i class="fa fa-undo iconMini" onClick="changeSeats(' . $obj->id . ', ' . $obj->user_id . ', ' . $obj->zone_id . ', this)" data-log="' . htmlspecialchars(json_encode($obj), ENT_QUOTES, 'UTF-8') . '" title="Cambio de sillas"></i>';
$actions .= '<i class="fa fa-retweet iconMini" onClick="changeEmail(' . $obj->id . ', ' . $obj->user_id . ', this)" data-log="' . htmlspecialchars(json_encode($obj), ENT_QUOTES, 'UTF-8') . '" title="Cambio de correo"></i>';
$actions .= '<i class="fa fa-envelope-o iconMini" onClick="sendEmailNotification(' . $obj->id . ', ' . $obj->user_id . ', this)" data-log="' . htmlspecialchars(json_encode($obj), ENT_QUOTES, 'UTF-8') . '" title="Enviar notificación"></i>';
$actions .= '<i class="fa fa-times-circle-o iconMini" onClick="cancelComplimentaryTickets(' . $obj->id . ', ' . $obj->user_id . ', this)" data-log="' . htmlspecialchars(json_encode($obj), ENT_QUOTES, 'UTF-8') . '" title="Anular cortesias"></i>';
return $actions;
} else {
return '';
}
})
->editColumn('created_at', function ($obj) {
return $obj->created_at ? Carbon::parse($obj->created_at)->format('Y-m-d h:i:s A') : '';
})
->rawColumns(['actions', 'created_at']);
}
private function tableDetailFilterQuery($request)
{
$seasons = $request->seasons;
$matchEvents = $request->matchEvents;
$startComplimentaryTicket = $request->startComplimentaryTicket;
$endComplimentaryTicket = $request->endComplimentaryTicket;
$ticketMainId = $request->ticketMainId;
$userId = $request->userId;
$obj = Ticket::select(
'tickets.code_ticket',
'users.email',
'users.document',
'seasons.name AS season',
'match_events.name AS match_event',
'match_events.date_name AS match_event_date',
'tickets.seat_id',
'tickets.zone',
DB::raw('CONCAT(letters.name, seats.code) AS seatName'),
'tickets.created_at',
DB::raw('IF(tickets.ticket_status_id = ' . TicketStatusEnum::CANCELLED . ', "Anulado", IF(tickets.confirm_stadium_ticket = "PENDIENTE", "Activa", "Leída")) AS status'),
DB::raw('CASE
WHEN tul.status IS NULL THEN "Sin transferir"
WHEN tul.status = "PENDING" THEN "En proceso"
ELSE "Transferida"
END AS transfer_status
'),
)
->with('seat')
->join('seats', 'seats.id', '=', 'tickets.seat_id')
->join('letters', 'letters.id', '=', 'seats.letter_id')
->join('ticket_mains', 'ticket_mains.id', '=', 'tickets.ticket_main_id')
->join('match_events', 'match_events.id', '=', 'tickets.match_event_id')
->join('seasons', 'seasons.id', '=', 'match_events.season_id')
->join('users', 'users.id', '=', 'tickets.user_id')
->leftJoin(DB::raw('(
SELECT t1.*
FROM ticket_user_logs t1
INNER JOIN (
SELECT ticket_id, MAX(created_at) as max_date
FROM ticket_user_logs
GROUP BY ticket_id
) t2 ON t1.ticket_id = t2.ticket_id AND t1.created_at = t2.max_date
) AS tul
'), 'tul.ticket_id', '=', 'tickets.id')
->where('tickets.ticket_type_id', TicketTypesEnum::COMPLIMENTARY)
->where('ticket_mains.id', $ticketMainId)
->where('tickets.user_id', $userId)
->groupBy(
'tickets.code_ticket',
'users.email',
'users.document',
'seasons.name',
'match_events.name',
'match_events.date_name',
'tickets.seat_id',
'tickets.zone',
DB::raw('CONCAT(letters.name, seats.code)'),
'tickets.created_at',
DB::raw('IF(tickets.ticket_status_id = ' . TicketStatusEnum::CANCELLED . ', "Anulado", IF(tickets.confirm_stadium_ticket = "PENDIENTE", "Activa", "Leída"))'),
DB::raw('tul.status'),
)
->orderBy('tickets.created_at', 'DESC');
if ($seasons && $seasons != 'null') {
$obj->whereIn('match_events.season_id', $seasons);
}
if ($matchEvents && $matchEvents != 'null') {
$obj->whereIn('match_events.id', $matchEvents);
}
if ($startComplimentaryTicket && $startComplimentaryTicket != 'null') {
$obj->whereDate('tickets.created_at', '>=', $startComplimentaryTicket);
}
if ($endComplimentaryTicket && $endComplimentaryTicket != 'null') {
$obj->whereDate('tickets.created_at', '<=', $endComplimentaryTicket);
}
return $obj;
}
private function tableDetailFilterCustomColumns($dataTable)
{
$dataTable->addColumn('actions', function ($obj) {
if (
$this->validateRolePermissions('complimentary_ticket', 'administrator') ||
$this->validateRolePermissions('complimentary_ticket', 'supervisor')
) {
$actions = '';
$actions .= '<a href="/download_ticket_for_user/' . Crypt::encryptString($obj->code_ticket) . '" target="_blank" title="Imprimir"><i class="fa fa-print iconMini"></i></a>';
return $actions;
} else {
return '';
}
})
->editColumn('created_at', function ($obj) {
return $obj->created_at ? Carbon::parse($obj->created_at)->format('Y-m-d h:i:s A') : '';
})
->rawColumns(['actions', 'created_at']);
}
}