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/demo.sports-crowd.com/app/Http/Controllers/MatchEventsController.php
<?php

namespace App\Http\Controllers;

use App\Core\CorporateIdentity\Application\CorporateIdentityService;
use App\Core\PagoPass\Application\PagoPassService;
use App\Core\Ticket\TicketTypesEnum;
use \Excel;
use App\Seat;
use App\Team;
use App\User;
use App\Ticket;
use DataTables;
use App\Parameter;
use App\TicketTag;
use Carbon\Carbon;
use App\MatchEvent;
use App\TicketMain;
use App\TicketUserBlock;
use Illuminate\Http\Request;
use App\TicketUserBlockBackup;
use Illuminate\Support\Facades\Auth;
use Illuminate\Database\Eloquent\Builder;
use App\Http\Controllers\TicketsController;
use App\Http\Controllers\Exports\ReportTickets;
use App\MatchEventTag;
use App\Services\TicketParametersService;
use App\Tag;
use App\TicketStatus;
use App\TicketType;
use App\Zone;
use Illuminate\Support\Facades\Crypt;
use Illuminate\Support\Facades\DB;

class MatchEventsController extends Controller
{
    private $salesTypes;
    protected $ticketParametersService;

    public function __construct()
    {
        $this->salesTypes[] = (object) [
            'name' => 'Silla/s seleccionada',
            'value' => 'seleccionada'
        ];
        $this->salesTypes[] = (object) [
            'name' => 'Silla/s aleatoria',
            'value' => 'aleatoria'
        ];
        $this->ticketParametersService = new TicketParametersService();
    }

    public function index($season_id)
    {
        $parameters = Parameter::first();
        return view('matchevents.list', compact('parameters', 'season_id'));
    }

    public function create($season_id)
    {
        $teams = Team::select('id', 'name', 'display_name')->where([['is_main', false], ['active', true]])->orderBy('name', 'asc')->get();
        $team_main = Team::select('id', 'name', 'display_name')->where([['is_main', true], ['active', true]])->first();
        $multiselectItems = Tag::select('id', 'name')->where('active', true)->get();
        $stadiums = Zone::select('id', 'name')->where('active', 1)->whereNull('zone_id')->get();
        $salesTypes = $this->salesTypes;
        return view('matchevents.create', compact('teams', 'team_main', 'season_id', 'multiselectItems', 'stadiums', 'salesTypes'));
    }

    public function store(Request $request)
    {
        try {
            if (!MatchEvent::where([['season_id', $request->input('season_id')], ['name', $request->input('name')]])->first()) {
                $tags = $request["tags"];
                $request->request->remove('tags');
                $data = $request->all();
                if ($data['zone_id']) {
                    $stadium = Zone::find($data['zone_id']);
                    $data['stadium_to_play'] = $stadium->name;
                }

                if ($model = MatchEvent::create(array_merge($data, ['code' => $this->codeOrder()]))) {
                    if ($tags != null) {
                        foreach ($tags as $tagId) {
                            MatchEventTag::create([
                                'tag_id'         => $tagId,
                                'match_event_id' => $model->id
                            ]);
                        }
                    }
                    return response(array("r" => true, "type" => "success", "title" => "", "m" => __('messages.created_successfully'), "data" => $model->id));
                } else {
                    return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_creating'), "data" => null));
                }
            } else {
                return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.already_exists', ['name' => $request->input('name')]), "data" => null));
            }
        } catch (\Exception $e) {
            return response(
                array(
                    "r" => false,
                    "type" => "error",
                    "title" => "Oops...",
                    "m" => __($e->getMessage()),
                    "data" => null
                )
            );
        }
    }

    public function show($id)
    {
        return redirect()->back();
    }

    public function edit($season_id, $id)
    {
        $event = MatchEvent::findOrFail($id);
        $teams = Team::select('id', 'name', 'display_name')->where([['is_main', false], ['active', true]])->orderBy('name', 'asc')->get();
        $team_main = Team::select('id', 'name', 'display_name')->where([['is_main', true], ['active', true]])->first();
        $multiselectItems = Tag::select('id', 'name')->where('active', true)->get();
        $multiselectValues = MatchEventTag::select('tag_id')->where('match_event_id', $id)->get();
        $stadiums = Zone::select('id', 'name')->where('active', 1)->whereNull('zone_id')->get();
        $salesTypes = $this->salesTypes;
        return view('matchevents.edit', compact('event', 'teams', 'team_main', 'season_id', 'multiselectItems', 'multiselectValues', 'stadiums', 'salesTypes'));
    }

    public function update(Request $request, $season_id, $id)
    {
        try {
            if (!MatchEvent::where([['id', '!=', $id], ['season_id', $request->input('season_id')], ['name', $request->input('name')]])->first()) {
                $request->request->remove('_method');
                $tags = $request["tags"];
                $request->request->remove('tags');
                $request->request->remove('generalMultiselect');
                $data = $request->all();
                if ($data['zone_id']) {
                    $stadium = Zone::find($data['zone_id']);
                    $data['stadium_to_play'] = $stadium->name;
                }

                if (MatchEvent::where('id', $id)->update($data)) {
                    MatchEventTag::where('match_event_id', $id)->delete();
                    if ($tags != null) {
                        foreach ($tags as $tagId) {
                            MatchEventTag::create([
                                'tag_id'         => $tagId,
                                'match_event_id' => $id
                            ]);
                        }
                    }
                    return response(array("r" => true, "type" => "success", "title" => "", "m" => __('messages.updated_successfully'), "data" => $id));
                } else {
                    return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_updating'), "data" => null));
                }
            } else {
                return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.already_exists', ['name' => $request->input('name')]), "data" => null));
            }
        } catch (\Exception $e) {
            return response(
                array(
                    "r" => false,
                    "type" => "error",
                    "title" => "Oops...",
                    "m" => __($e->getMessage()),
                    "data" => null
                )
            );
        }
    }

    public function destroy($season_id, $id)
    {
        try {
            if (MatchEvent::where('id', $id)->delete()) {
                return response(array("r" => true, "type" => "success", "title" => "", "m" => __('messages.deleted_successfully'), "data" => null));
            } else {
                return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_removing'), "data" => null));
            }
        } catch (\Illuminate\Database\QueryException $e) {
            return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.delete_relation_data'), "data" => null));
        }
    }

    public function tableFilter($season_id)
    {
        DB::statement("SET sql_mode = ''");
        $obj = MatchEvent::select(
            'match_events.id',
            'match_events.name',
            'match_events.sales_type',
            'match_events.code',
            'match_events.date_name',
            'match_events.event_start_sale',
            'match_events.event_end_sale',
            'match_events.event_start',
            'match_events.season_id',
            'match_events.stadium_to_play',
            'match_events.active',
            DB::raw('GROUP_CONCAT(DISTINCT(tags.name)) AS segmentation')
        )->with('season')
            ->leftjoin('match_event_tags', 'match_event_tags.match_event_id', '=', 'match_events.id')
            ->leftjoin('tags', function ($join) {
                $join->on('tags.id', '=', 'match_event_tags.tag_id')->where('tags.active', 1);
            })
            ->where('match_events.season_id', $season_id)
            ->groupBy('match_events.id');
        DB::statement("SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'");

        return DataTables::of($obj)
            ->addColumn('actions', function ($obj) {
                $infoEvents = '<i class="fa fa-ticket iconMini" onClick="clickInfoEvent(' . $obj->id . ')" data-id="' . $obj->id . '" title="Boletas vendidas"></i>';
                $infoBlocks = '<i class="fa fa-unlock-alt iconMini" onClick="clickInfoBlocks(' . $obj->id . ')" data-id="' . $obj->id . '" title="Información bloqueos"></i>';
                $price = '<i class="fa fa-dollar iconMini" onClick="eventPrice(' . $obj->id . ')" data-id="' . $obj->id . '" title="Precios evento"></i>';
                $edit = '<i class="fa fa-pencil iconMini" onClick="clickEdit(' . $obj->id . ', ' . $obj->season_id . ')" data-id="' . $obj->id . '" title="Editar evento"></i>';
                $delete = '<i class="fa fa-trash iconMini" onClick="clickDelete(' . $obj->id . ', ' . $obj->season_id . ')" data-id="' . $obj->id . '" title="Eliminar evento"></i>';
                $deleteBackups = '<i class="fa fa-close iconMini" onClick="clickDeleteBackups(' . $obj->id . ')" data-id="' . $obj->id . '" title="Eliminar backups"></i>';
                $sendToBilling = '<i class="fa fa-external-link iconMini" onClick="clickSendToBilling(' . $obj->id . ')" data-id="' . $obj->id . '" title="Enviar a facturar"></i>';
                $stage = '<i class="fa fa-cogs iconMini" onClick="clickMatchEventStage(' . $obj->id . ')" data-id="' . $obj->id . '" title="Configuraciones"></i>';

                if ($this->validateRolePermissions('ticketing', 'administrator') || $this->validateRolePermissions('ticketing', 'supervisor'))
                    return $stage . $price . $infoEvents . $infoBlocks . $edit . $delete . $deleteBackups . $sendToBilling;
                else if ($this->validateRolePermissions('ticketing', 'seller'))
                    return $infoEvents . $infoBlocks;
                else
                    return '';
            })
            ->editColumn('active', function ($obj) {
                if ($this->validateRolePermissions('ticketing', 'administrator') || $this->validateRolePermissions('ticketing', 'supervisor'))
                    if ($obj->active == 0) {
                        return '<div class="switch"><label><div class="checkbox checbox-switch switch-success"> <label> ' . __('messages.no') . ' <input type="checkbox" onChange="chk(' . $obj->id . ')" data-id="' . $obj->id . '" id="Checkactive' . $obj->id . '" name="Checkactivo" /> <span></span>' . __('messages.yes') . ' </label></div> </label> </div>';
                    } else {
                        return '<div class="switch"><label> <div class="checkbox checbox-switch switch-success"> <label>   ' . __('messages.no') . ' <input type="checkbox" onChange="chk(' . $obj->id . ')" data-id="' . $obj->id . '" id="Checkactive' . $obj->id . '" name="Checkactivo" checked="" />
                            <span></span> ' . __('messages.yes') . ' </label> </div>  </label> </div>';
                    }
                else
                    return $obj->active ? 'SI' : 'NO';
            })
            ->editColumn('event_start_sale', function ($obj) {
                return $obj->event_start_sale ? \Carbon\Carbon::parse($obj->event_start_sale)->format('Y-m-d h:i:s A') : '';
            })
            ->editColumn('event_end_sale', function ($obj) {
                return $obj->event_end_sale ? \Carbon\Carbon::parse($obj->event_end_sale)->format('Y-m-d h:i:s A') : '';
            })
            ->editColumn('event_start', function ($obj) {
                return $obj->event_start ? \Carbon\Carbon::parse($obj->event_start)->format('Y-m-d h:i:s A') : '';
            })
            ->editColumn('sales_type', function ($obj) {
                $sales_type = [];
                if ($obj->sales_type) {
                    foreach (explode(',', $obj->sales_type) as $item) {
                        $object = collect($this->salesTypes)->where('value', $item)->first();
                        if ($object)
                            $sales_type[] = $object->name;
                    }
                }
                return implode(',', $sales_type);
            })
            ->rawColumns(['active', 'actions'])
            ->make(true);
    }

    public function activate(Request $request)
    {
        try {
            $id = $request['id'];
            $state = $request['state'];

            $matchEvent = MatchEvent::find($id);
            $matchEvent->active = $state;
            $matchEvent->update();

            return array('r' => true, 'd' => null, 'm' => __('messages.updated_successfully'));
        } catch (\Throwable $th) {
            return array('r' => false, 'd' => null, 'm' => __('messages.error_updating'));
        }
    }

    public function detailTicketsBuy($id)
    {
        $ticketStatus = TicketStatus::select('id', 'name')->where('active', true)->orderBy('name', 'ASC')->get();
        $ticketTags = TicketTag::select('id', 'name')->where('active', true)->orderBy('name', 'ASC')->get();
        $types = TicketType::select('id', 'name')->where('active', true)->orderBy('name', 'ASC')->get();
        $types->prepend((object)[
            'id'    => 0,
            'name'  => 'Todos',
        ]);
        $hideDataSeat = $this->validateSaleByCapacity($id);

        $corporateIdentity = CorporateIdentityService::get();
        return view("matcheventTickets.index_match_event_tickets", compact('id', 'ticketStatus', 'ticketTags', 'types', 'hideDataSeat', 'corporateIdentity'));
    }

    public function detailTicketsBlocks($id)
    {
        $corporateIdentity = CorporateIdentityService::get();
        return view("matcheventBlocks.index_match_event_blocks", compact('id', 'corporateIdentity'));
    }

    public function detailTicketsBlockInfo($id)
    {
        $corporateIdentity = CorporateIdentityService::get();
        return view("matcheventBlocks.index_match_event_block_info", compact('id', 'corporateIdentity'));
    }

    public function getTribunes()
    {
        $stadiumsZone = Zone::where('active', 1)->whereNull('zone_id')->pluck('id');
        return Zone::select('id', 'name')->where('active', 1)->whereIn('zone_id', $stadiumsZone)->get();
    }

    public function getMatchEventTribunes($matchEventId)
    {
        $matchEvent = MatchEvent::find($matchEventId);
        $stadiumsZone = $matchEvent->zone_id ? [$matchEvent->zone_id] : Zone::where('active', true)->whereNull('zone_id')->pluck('id');
        return Zone::select('id', 'name')->where('active', true)->whereIn('zone_id', $stadiumsZone)->get();
    }

    public function getMatchEventZones($matchEventId)
    {
        $matchEvent = MatchEvent::find($matchEventId);
        $stadiumsZone = $matchEvent->zone_id ? [$matchEvent->zone_id] : Zone::where('active', true)->whereNull('zone_id')->pluck('id');
        $tribunes = Zone::where('active', true)->whereIn('zone_id', $stadiumsZone)->pluck('id');
        return Zone::select('id', 'name', 'zone_id')->with('zone')->where([['is_saleable', true], ['active', true]])->whereIn('zone_id', $tribunes)->get();
    }

    public function tableFilterTickets(Request $request)
    {
        try {
            $matchEventId = $request->matchEventId;
            $deletedUserTickets = $request->input('deletedUserTickets', null);
            $sellerUserId = $request->input('sellerUserId', null);

            DB::statement("SET sql_mode = ''");
            $obj = Ticket::select('tickets.*')
                ->with(['ticket_main', 'match_event', 'ticket_type', 'seat', 'ticket_status'])
                ->with(['user' => function ($query) {
                    $query->withTrashed();
                }])
                ->join('users', 'users.id', '=', 'tickets.user_id')
                ->join('ticket_mains', 'ticket_mains.id', '=', 'tickets.ticket_main_id')
                ->leftjoin('seats', 'seats.id', '=', 'tickets.seat_id')
                ->leftjoin('zones', 'zones.id', '=', 'seats.zone_id')
                ->leftjoin('zones as tribunes', 'tribunes.id', '=', 'zones.zone_id')
                ->when($deletedUserTickets, function ($query) use ($deletedUserTickets) {
                    if ($deletedUserTickets == '1') {
                        $query->whereNotNull('users.deleted_at');
                    } else {
                        $query->whereNull('users.deleted_at');
                    }
                })
                ->when($sellerUserId, function ($query) use ($sellerUserId) {
                    $query->where('ticket_mains.seller_user_id', $sellerUserId);
                })
                ->where('match_event_id', $matchEventId)
                ->orderBy('tickets.created_at', 'DESC');
            DB::statement("SET sql_mode = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'");

            return DataTables::of($obj)
                ->addColumn('actions', function ($obj) use ($matchEventId) {
                    $data = htmlspecialchars(json_encode($obj), ENT_QUOTES, 'UTF-8');
                    $changeStateTicket = '<i class="fa fa-edit iconMini" onClick="changeStateTicket(' . $data . ')" data-id="' . $obj->id . '" title="Actualizar boleta"></i>';
                    $changeSeat = '<i class="fa fa-reply-all iconMini" onClick="changeSeat(' . $obj->id . ', ' . $matchEventId . ')" data-id="' . $obj->id . '" title="Cambiar silla"></i>';
                    $getTicketsUserId = '<i class="fa fa-user-plus iconMini" onClick="getTicketsUserid(' . $obj->user->id . ', \'' . $obj->user->email . '\', ' . $matchEventId . ', \'' . $obj->code_ticket . '\', ' . $obj->user->document . ')" data-id="' . $obj->user->id . '" title="Actualizar email"></i>';
                    $specialTicketModalClick = '<i class="fa fa-plus-square iconMini data-id="' . $obj->id . '" onClick="specialTicketModalClick(' . $obj->id . ')" title="Generar boletas especiales"></i>';
                    $creditNote = '';
                    if ($obj->ticket_main->cufe && $obj->ticket_main->invoice_number && !$obj->ticket_main->credit_note_invoice_number) {
                        $creditNote = '<button type="button" class="btn btn-danger btn-xs" onClick="openCreditNote(' . $obj->ticket_main->id . ')"> <i class="fa fa-dollar"></i> ' . trans('messages.credit_note') . '</button>';
                    }
                    $reInvoice = '';
                    if ($obj->ticket_main->cude && $obj->ticket_main->credit_note_invoice_number) {
                        $reInvoice = '<button type="button" class="btn btn-success btn-xs" onClick="openReInvoice(' . $obj->ticket_main->id . ')"> <i class="fa fa-dollar"></i> ' . trans('messages.re_invoice') . '</button>';
                    }
                    $ticketNotifications = '<i class="fa fa-ticket iconMini" onClick="ticketNotifications(' . $obj->ticket_main->id . ', \'' . $obj->code_ticket . '\')" data-id="' . $obj->code_ticket . '" title="Envio boleta"></i>';

                    if ($this->validateRolePermissions('ticketing', 'administrator'))
                        return $changeStateTicket . $changeSeat . $getTicketsUserId . $specialTicketModalClick . $ticketNotifications . $creditNote . $reInvoice;
                    else if ($this->validateRolePermissions('ticketing', 'supervisor'))
                        return $changeStateTicket . $changeSeat . $getTicketsUserId . $ticketNotifications . $creditNote . $reInvoice;
                    else if ($this->validateRolePermissions('ticketing', 'seller'))
                        return $changeSeat . $ticketNotifications;
                    else
                        return '';
                })
                ->editColumn('created_at', function ($obj) {
                    return \Carbon\Carbon::parse($obj->created_at)->format('Y-m-d h:i:s A');
                })
                ->editColumn('code_ticket', function ($obj) {
                    return '<span class="copy-ticket" data-code="' . e($obj->code_ticket) . '" style="cursor:copy; color:var(--primary); text-decoration:underline;" title="Copiar código">' . e($obj->code_ticket) . '</span>';
                })
                ->rawColumns(['actions', 'created_at', 'code_ticket'])
                ->make(true);
        } catch (\Throwable $th) {
            return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_global'), "data" => $th->getMessage()));
        }
    }

    public function tableFilterBlocks($match_event_id)
    {
        try {
            $obj = TicketMain::with(['ticket_user_blocks.match_event', 'ticket_user_blocks.ticket_type', 'ticket_user_blocks.user'])
                ->whereHas('ticket_user_blocks', function (Builder $query) use ($match_event_id) {
                    $query->where('match_event_id', $match_event_id);
                });

            if (Auth::user()->rol->id == $this->__EXTERNAL_OPERATOR_ROL) {
                $obj = $obj->whereNotNull('pin_tercero');
            } else if (in_array(Auth::user()->rol->id, [$this->__TICKET_OFFICE_ROL, $this->__TICKET_OFFICE_ROL_INTERNAL])) {
                $obj = $obj->whereNotNull('pin_internal');
            } else {
                $obj = $obj->where(function ($query) {
                    $query->whereNotNull('pin_tercero')->orWhereNotNull('pin_internal');
                });
            }

            return DataTables::of($obj)
                ->addColumn('actions', function ($obj) {
                    $approved = '';
                    if (Auth::user()->rol->id != $this->__EXTERNAL_OPERATOR_ROL) {
                        $approved = '<i class="fa fa-check-square-o iconMini" onClick="validateTickets(' . $obj->id . ', ' . $obj->season_id . ')" data-id="' .  $obj->id . '" data-toggle="tooltip" data-placement="bottom"  style="cursor:pointer;"></i>';
                    }
                    return '
                        <i class="fa fa-eye iconMini" onClick="clickInfoBlockList(' . $obj->id . ')" data-id="' . $obj->id . '" data-toggle="tooltip" data-placement="bottom"  style="cursor:pointer;"></i>
                        ' . $approved . '
                    ';
                })
                ->editColumn('created_at', function ($obj) {
                    return \Carbon\Carbon::parse($obj->created_at)->format('Y-m-d h:i:s A');
                })
                ->rawColumns(['actions', 'created_at'])
                ->make(true);
        } catch (\Throwable $th) {
            return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_global'), "data" => $th->getMessage()));
        }
    }

    public function tableFilterBlocksInfo($ticket_main_id)
    {
        try {
            $obj = TicketUserBlock::with(['match_event', 'ticket_type', 'seat', 'ticket_main'])
                ->with(['user' => function ($query) {
                    $query->withTrashed();
                }])
                ->where('ticket_main_id', $ticket_main_id)
                ->where('is_social_distancing', false)
                ->orderBy('created_at', 'DESC');
            return DataTables::of($obj)
                ->make(true);
        } catch (\Throwable $th) {
            return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_global'), "data" => $th->getMessage()));
        }
    }

    public function validateTicket(Request $request)
    {

        try {
            // Obtiene bloqueos de este pin.
            $pin_tickets = TicketMain::where('id', $request->ticket_main_id)
                ->with(['ticket_user_blocks' => function ($q) {
                    $q->where('ticket_user_blocks.is_social_distancing', false);
                }])
                ->first();
            if (!$pin_tickets) {
                return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => "El pin no existe", "data" => null));
            }

            if ($pin_tickets->ticket_user_blocks->isEmpty()) {
                return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => "El pin ya expiró", "data" => null));
            }

            $ticketcontroller = new TicketsController;
            if ($ticketcontroller->generateTickets($pin_tickets->ticket_user_blocks, $pin_tickets->id)) {
                return response(array("r" => true, "type" => "success", "title" => "", "m" => "¡Boletas generadas exitosamente!", "data" => null));
            }
            return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_global'), "data" => null));
        } catch (\Throwable $th) {
            return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_global'), "data" => $th->getMessage()));
        }
    }

    public function sendEmailNotifications(Request $request)
    {
        $user = User::find($request["id_user"]);
        if ($user) {
            $code_ticket = $request["code_ticket"];
            $ticket = Ticket::where("code_ticket", $code_ticket)->first();
            if ($ticket->ticket_type_id == TicketTypesEnum::COMPLIMENTARY) {
                $request = new Request([
                    'user_id'           => $user->id,
                    'ticket_type_id'    => $ticket->ticket_type_id,
                    'match_event_id'    => $ticket->match_event_id,
                    'ticket_main_id'    => $ticket->ticket_main_id,
                ]);
                $massiveFansController = new MassiveFansController();
                $massiveFansController->resendListEmailTickets($request);
            } else {
                $ticketController = new TicketsController;
                $ticketController->sendSingleEmailTicket($user->id, $code_ticket);
            }
            return array('r' => true, 'm' => trans('bien'));
        } else {
            return array('r' => false, 'm' => trans('mal'));
        }
    }

    public function deleteBackups(Request $request)
    {
        $matchEvent = MatchEvent::find($request['matchEventId']);
        if (!$matchEvent) {
            return array("r" => false, "m" => 'Evento de partido no encontrado');
        }

        try {
            if ($matchEvent->active || $matchEvent->event_start > Carbon::now()->format('Y-m-d H:i:s')) {
                return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => "No es posible eliminar, el evento aún es vigente", "data" => null));
            }

            TicketUserBlockBackup::where('match_event_id', $matchEvent->id)->delete();
            return response(array("r" => true, "type" => "success", "title" => "", "m" => "¡Se han eliminado exitosamente los backups!", "data" => null));
        } catch (\Throwable $th) {
            return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_global'), "data" => $th->getMessage()));
        }
    }

    public function export($id)
    {
        return Excel::download(new ReportTickets($id), 'MatchEventTickets' . $id . '.xlsx');
    }

    public function generateSpecialTickets(Request $request)
    {
        $max_especial_tickets = 4;
        $ticked_id = $request['ticket_id'];
        $amount = $request['amount'];
        if ($amount > $max_especial_tickets) {
            return array(
                'r' => false,
                'd' => null,
                'm' => 'Solo puedes generar máximo ' . $max_especial_tickets . ' boletas especiales para este usuario'
            );
        }

        $ticked_id = $request['ticket_id'];
        $boughtTicket = Ticket::where('id', $ticked_id)->first();
        $specialTickets = Ticket::where('ticket_main_id', $boughtTicket->ticket_main_id)
            ->whereNotNull('special_text')
            ->get()
            ->count();


        if ($specialTickets >= $max_especial_tickets) {
            return array(
                'r' => false,
                'd' => null,
                'm' => 'Este usuario ya tiene ' . $specialTickets . ' boletas especial(es). No podrás generar boletas adicionales.'
            );
        }

        if ($amount + $specialTickets > $max_especial_tickets) {
            return array(
                'r' => false,
                'd' => null,
                'm' => 'Este usuario ya tiene ' . $specialTickets . ' boletas especial(es). Solo podrás generar ' . ($max_especial_tickets - $specialTickets) . ' adicional(es).'
            );
        }

        $seat = Seat::where('id', $boughtTicket->seat_id)->first();

        $massiveFansController = new MassiveFansController;
        return $massiveFansController->generateRamdomTickets(
            [
                'quantity' => $amount,
                'user_id' => $boughtTicket->user_id,
                'zone_id' => $seat->zone_id,
                'match_event_id' => $boughtTicket->match_event_id,
                'ticket_type_id' => $boughtTicket->ticket_type_id,
                'price' => 0,
                'ticket_main_id' => $boughtTicket->ticket_main_id,
                'special_text' => $request['special_text'],
                'validate_rules' => true,
            ]
        );
    }

    public function getSaleView($salesType = null)
    {
        $view = config('app.sales_type');
        if ($salesType)
            if (str_contains(strtolower($salesType), strtolower('seleccionada'))) {
                $view = 'web_ticketing.seatTicketDynamicStadium';
            } else if (str_contains(strtolower($salesType), strtolower('aleatoria'))) {
                $view = 'web_ticketing.flashTicket';
            }
        return $view;
    }

    public function validateSaleByCapacity($matchEventId)
    {
        $event = MatchEvent::select('sales_type')->find($matchEventId);
        if (!$event)
            return false;
        return $event->sales_type == 'aleatoria';
    }

    public function creditNote(Request $request)
    {
        $ticketMain = TicketMain::find($request['ticketMainId']);
        if (!$ticketMain) {
            return array("r" => false, "m" => 'Compra no encontrada');
        }

        try {
            $payment = new Request([
                'paymentId' => $ticketMain->id
            ]);
            $pagoPassService = new PagoPassService();
            $response = $pagoPassService->notePayment($payment);
            $data = [
                'paymentId'         => $ticketMain->id,
                'paymentReference'  => $ticketMain->payment_reference,
                'invoiceNumber'     => $ticketMain->invoice_number,
                'cufe'              => $ticketMain->cufe,
            ];
            $this->registerLog(Auth::user()->id, 'Crear nota credito de compra', json_encode($data), "Create", $this->getModule($request));
            return $response;
        } catch (\Throwable $th) {
            return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_global'), "data" => $th->getMessage()));
        }
    }

    public function reInvoice(Request $request)
    {
        $ticketMain = TicketMain::find($request['ticketMainId']);
        if (!$ticketMain) {
            return array("r" => false, "m" => 'Compra no encontrada');
        }

        try {
            $oldCufe = $ticketMain->cufe;
            $oldInvoiceNumber = $ticketMain->invoice_number;
            $oldCude = $ticketMain->cude;
            $oldCreditNoteInvoiceNumber = $ticketMain->credit_note_invoice_number;
            $ticketMain->cufe = null;
            $ticketMain->invoice_number = null;
            $ticketMain->cude = null;
            $ticketMain->credit_note_invoice_number = null;
            $ticketMain->save();

            $payment = new Request([
                'paymentId' => $ticketMain->id
            ]);
            $pagoPassService = new PagoPassService();
            $response = $pagoPassService->billingPayment($payment);
            $data = [
                'paymentId'                     => $ticketMain->id,
                'paymentReference'              => $ticketMain->payment_reference,
                'oldCufe'                       => $oldCufe,
                'oldInvoiceNumber'              => $oldInvoiceNumber,
                'oldCude'                       => $oldCude,
                'oldCreditNoteInvoiceNumber'    => $oldCreditNoteInvoiceNumber,
            ];
            $this->registerLog(Auth::user()->id, 'Crear re-factura de compra', json_encode($data), "Create", $this->getModule($request));
            return $response;
        } catch (\Throwable $th) {
            return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_global'), "data" => $th->getMessage()));
        }
    }

    public function sendToBilling(Request $request)
    {
        $matchEvent = MatchEvent::find($request['matchEventId']);
        if (!$matchEvent) {
            return array("r" => false, "m" => 'Evento de partido no encontrado');
        }

        try {
            $data = [
                'matchEvent' => $matchEvent,
            ];
            $this->registerLog(Auth::user()->id, 'Enviar a facturación', json_encode($data), "Create", $this->getModule($request));
            $ticketsController = new TicketsController();
            $response = $ticketsController->sendToBilling($matchEvent->id);
            return response($response);
        } catch (\Throwable $th) {
            return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_global'), "data" => $th->getMessage()));
        }
    }
}