HEX
Server: Apache/2.4.41 (Ubuntu)
System: Linux ip-172-31-42-149 5.15.0-1084-aws #91~20.04.1-Ubuntu SMP Fri May 2 07:00:04 UTC 2025 aarch64
User: ubuntu (1000)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
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']);
    }
}