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

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use App\TicketType;
use App\MatchEvent;
use App\Seat;
use App\TicketMain;
use App\MatchEventZonePrice;
use App\Zone;
use App\Http\Controllers\Imports\FansImport;
use App\Http\Controllers\Exports\ReportFanst;
use App\Http\Controllers\TicketsController;
use App\Mail\TicketPurchaseEmailList;
use App\Mail\TicketPurchaseEmailListMultiple;
use App\MatchEventStage;
use App\Ticket;
use App\User;
use Excel;
use DB;
use stdClass;
use Illuminate\Support\Facades\Mail;

class MassiveFansController extends Controller
{
    private $ticketsController;

    public function __construct()
    {
        $this->ticketsController = new TicketsController();
    }

    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        $ticket_type    = TicketType::select('id', 'name')->where('active', true)->get();
        $match_event    = MatchEvent::select('id', 'name')->where('active', true)->get();
        $stadiumsZone   = Zone::where('active', 1)->whereNull('zone_id')->pluck('id');
        $mainZones      = Zone::select('id', 'name')->where('active', 1)->whereIn('zone_id', $stadiumsZone)->get();

        return view('massive_fans.fans')->with('ticket_type', $ticket_type)
            ->with('match_event', $match_event)
            ->with('main_zones', $mainZones);
    }

    public function vista()
    {
        return view('mails.buyTickets');
    }

    public function export()
    {
        return Excel::download(new ReportFanst, trans('messages.fans.title_12') . '.xlsx');
    }

    public function import(Request $request)
    {
        try {
            $file = new FansImport;
            $file->request = $request;
            Excel::import($file, $request->importFans);
            return array('r' => true, 'd' => $file->answer, 'm' => trans('messages.screen_products_tag45') . ' ');
        } catch (\Exception $e) {
            return array('r' => false, 'd' => null, 'm' => trans('messages.screen_products_tag46') . $request->name_file . "  \n" . $e->getMessage());
        }
    }

    public function ajaxGetSubzonesFromMainZone($zone_id, $match_event_id = null)
    {
        $zones = Zone::select('id', 'name')
            ->where('zone_id', $zone_id)
            ->where('is_saleable', true)
            ->where('salable_capacity', '>', 0);

        /*
        HABILITAR CUANDO SE ESTABLEZCA UN FLAG PARA VALIDAR REGLAS SEGUN WEB O MOVIL o AMBAS
        if ($match_event_id) {
            $rules = MatchEventStage::where('match_event_id', $match_event_id)->get();
            if (count($rules) > 0) {
                $zonesRules = array();
                foreach ($rules as $rule) {
                    // Bloqueo por zona
                    if ($rule->stage_type_id == 2) {
                        if ($rule->zone_id == $zone_id) {
                            return [];
                        }
                        $zonesRules[] = $rule->zone_id;
                    }
                }
                if (count($zonesRules) > 0) {
                    $zones->whereNotIn('id', $zonesRules);
                }
            }
        } 
        */

        return $zones->get();
    }

    public function ajaxGetPriceForZoneInMatch($zone_id, $match_event_id)
    {
        return MatchEventZonePrice::select('id', 'price', 'price_suscription')
            ->where('zone_id', $zone_id)
            ->where('match_event_id', $match_event_id)
            ->first();
    }

    public function importRandom(Request $request)
    {
        DB::beginTransaction();

        $quantity = $request->quantity;
        $user_id = $request->user_id;
        $zone_id = $request->zone_id;
        $match_event_id = $request->match_event_id;
        $ticket_type_id = $request->ticket_type_id;
        $price = $request->price;

        return $this->generateRamdomTickets($quantity, $user_id, $zone_id, $match_event_id, $ticket_type_id, $price);
    }

    public function generateRamdomTickets(
        $quantity,
        $user_id,
        $zone_id,
        $match_event_id,
        $ticket_type_id,
        $price,
        $ticket_main_id = null,
        $special_text = null,
        $sendEmail = true
    ) {
        if ($ticket_main_id) {
            $ticket_main = TicketMain::where('id', $ticket_main_id)->first();
        } else {
            $ticket_main = new TicketMain;
            $ticket_main->total = 0;
            $ticket_main->payment_attempts = 0;
            $ticket_main->save();
        }

        $seats = $this->getSeatsAvailableFromLocationAndEvent($zone_id, $quantity, $match_event_id);

        if (!$seats) {
            DB::rollback();
            return array('r' => false, 'd' => null, 'm' => 'No se ha encontrado la cantidad suficiente de sillas disponibles, revise el aforo vendible.');
        }

        $usersToSendEmail = new Collection();
        $totalSumTickets = 0;
        $code_tickets_created = "";
        $createdTickets = [];

        foreach ($seats as $seat) {
            $totalSumTickets = $totalSumTickets + $price;
            $t = $this->ticketsController->createTicket(
                $seat->id,
                $match_event_id,
                $user_id,
                $ticket_type_id,
                $ticket_main->id,
                $price,
                true,
                $special_text,
                !$sendEmail
            );

            if (!$t instanceof \Illuminate\Database\Eloquent\Model) {
                if (array_key_exists('r', $t)) {
                    if ($t['r'] == false) {
                        DB::rollback();
                        return array('r' => false, 'd' => $t['data'], 'm' => $t['m']);
                    }
                }
            }


            $code_tickets_created = $code_tickets_created . "-" . $t->code_ticket . "\n ";
            array_push($createdTickets, $t->code_ticket);
            if ($sendEmail) {
                $obj = new stdClass();
                $obj->user_id = $t->user_id;
                $obj->code_ticket = $t->code_ticket;
                $usersToSendEmail->push($obj);
            }
        }

        $ticket_main->user_id_log = $user_id;
        $ticket_main->total = $totalSumTickets;
        $ticket_main->update();

        DB::commit();

        if ($sendEmail && $usersToSendEmail->count() > 0 && $usersToSendEmail->count() <= 100) {
            $this->sendListMail($usersToSendEmail, $ticket_type_id, $match_event_id, $user_id);
        }

        if ($sendEmail && $usersToSendEmail->count() > 100) {
            $this->sendListMailMultipleLinks($usersToSendEmail, $ticket_type_id, $match_event_id, $user_id);
        }

        return array('r' => true, 'd' => $createdTickets, 'm' => "Transacción #" . $ticket_main->id . " procesada. \nTickets Generados: \n " . $code_tickets_created);
    }

    public function resendListEmailTickets(Request $request)
    {
        $user_id = $request->user_id;
        $ticket_type_id = $request->ticket_type_id;
        $match_event_id = $request->match_event_id;

        $tickets = Ticket::where('user_id', $user_id)
            ->where('ticket_type_id', $ticket_type_id)
            ->get();

        $usersToSendEmail = new Collection();

        foreach ($tickets as $t) {
            $obj = new stdClass();
            $obj->user_id = $t->user_id;
            $obj->code_ticket = $t->code_ticket;
            $usersToSendEmail->push($obj);
        }
        return $this->sendListMail($usersToSendEmail, $ticket_type_id, $match_event_id, $user_id);
    }

    public function sendListMail($userTicketsToSendEmail, $ticket_type_id, $match_event_id, $userId)
    {
        try {
            $user = User::find($userId);
            Mail::to($user->email)->send(new TicketPurchaseEmailList($userTicketsToSendEmail, $ticket_type_id, $match_event_id, $user));
            $this->ticketsController->updateSentEmailIndicatorInTickets($userTicketsToSendEmail);
            return array('s' => true, 'm' => 'Mail enviado');
        } catch (\Exception $err) {
            $log = array(
                'error'         => $err->getMessage(),
                'user'          => $user,
                'userTicketsToSendEmail' => $userTicketsToSendEmail,
                'ticket_type'   => $ticket_type_id,
                'match_event'   => $match_event_id
            );
            $util = new UtilController();
            $util->logFile(json_encode($log), 'sendListMail');
            return array('s' => false, 'm' => 'Mail no enviado');
        }
    }

    public function sendListMailMultipleLinks($userTicketsToSendEmail, $ticket_type_id, $match_event_id, $user_id)
    {
        try {
            $user = User::find($user_id);
            Mail::to($user->email)->send(new TicketPurchaseEmailListMultiple($userTicketsToSendEmail, $ticket_type_id, $match_event_id, $user));
            $this->ticketsController->updateSentEmailIndicatorInTickets($userTicketsToSendEmail);
            return array('s' => true, 'm' => 'Mail enviado');
        } catch (\Exception $err) {
            $log = array(
                'error'         => $err->getMessage(),
                'user'          => $user,
                'userTicketsToSendEmail' => $userTicketsToSendEmail,
                'ticket_type'   => $ticket_type_id,
                'match_event'   => $match_event_id
            );
            $util = new UtilController();
            $util->logFile(json_encode($log), 'sendListMailMultipleLinks');
            return array('s' => false, 'm' => 'Mail no enviado');
        }
    }

    public function getSeatsAvailableFromLocationAndEvent($zone_id, $quantity, $match_event_id)
    {
        $rules = MatchEventStage::where('match_event_id', $match_event_id)->get();
        $ruleZone = MatchEventStage::where([['match_event_id', $match_event_id], ['zone_id', $zone_id], ['stage_type_id', 3]])->first();

        $zone = Zone::where('id', $zone_id)->first();
        $matchEventsTickets = Ticket::where('match_event_id', $match_event_id)
            ->where(function ($query) {
                $query->where('ticket_status_id', '<>', 3)
                    ->where('ticket_status_id', '<>', 4);
            })
            ->whereHas('seat', function ($query) use ($zone_id) {
                $query->where('zone_id', $zone_id);
            })
            ->get()
            ->count();

        // Se valida que no se supere la capacidad de boletas de la tribuna
        if ($matchEventsTickets + $quantity > ($ruleZone ? $ruleZone->salable_capacity : $zone->salable_capacity)) {
            return [];
        }

        $seats = Seat::select('id', 'code', 'zone_id', 'letter_id')
            ->where('zone_id', $zone_id)
            ->where('active', true)
            ->whereNotIn('id', function ($query) use ($match_event_id) {
                $query->select('seat_id')->from('tickets')->where('match_event_id', $match_event_id)->where(function ($query) {
                    $query->where('ticket_status_id', '<>', 3)
                        ->where('ticket_status_id', '<>', 4);
                });
            })
            ->whereNotIn('id', function ($query) use ($match_event_id) {
                $query->select('seat_id')->from('ticket_user_blocks')->where('match_event_id', $match_event_id);
            })
            ->take($quantity);

        if (count($rules) > 0) {
            $seatsRules = array();
            $zonesRules = array();
            foreach ($rules as $rule) {
                // Bloqueo por silla
                if ($rule->stage_type_id == 1) {
                    $seatsRules[] = $rule->seat_id;
                }
                // Bloqueo por zona
                if ($rule->stage_type_id == 2) {
                    $zonesRules[] = $rule->zone_id;
                }
            }
            if (count($seatsRules) > 0) {
                $seats->whereNotIn('id', $seatsRules);
            }
            if (count($zonesRules) > 0) {
                $seats->whereNotIn('zone_id', $zonesRules);
            }
        }
        return $seats->get();
    }
}