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/Imports/FansImport.php
<?php

namespace App\Http\Controllers\Imports;

use App\User;
use App\Zone;
use App\Letter;
use App\Seat;
use App\TicketMain;
use DB;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Maatwebsite\Excel\Concerns\WithCalculatedFormulas;
use App\Http\Controllers\TicketsController;
use App\Http\Controllers\MassiveFansController;
use Illuminate\Support\Arr;

class FansImport implements ToCollection, WithHeadingRow, WithCalculatedFormulas
{
    public $answer = [];

    public $data;
    public $request;
    public $is_error;
    private $__CLIENT_ROL = 4;

    public function headingRow(): int
    {
        return 1;
    }

    /**
     * @param Collection $collection
     */
    public function collection(Collection  $rows)
    {
        $usersToSendEmail = new Collection();
        $zones = Zone::select('id', 'name', 'zone_id')->get()->toArray();
        $seats = Seat::select('id', 'code', 'letter_id', 'zone_id')->get()->toArray();
        $letters = Letter::select('id', 'name')->get()->toArray();
        $usersBD = User::select('id', 'email')->where('rol_id', $this->__CLIENT_ROL)->get()->toArray();
        $totalSumTickets = 0;
        $users = array();
        $user_id;

        $this->data = $rows;

        if ($this->request->name_ticket_type_id == 1 || $this->request->name_ticket_type_id == 2 || $this->request->name_ticket_type_id == 3 || $this->request->name_ticket_type_id == 4) {

            $ticket_main = new TicketMain;
            $ticket_main->total = 0;
            $ticket_main->payment_attempts = 0;
            $ticket_main->save();

            // datos para create ticket
            $match_event_id = $this->request->name_match_event_id;
            $ticket_type_id = $this->request->name_ticket_type_id;
            $ticket_main_id = $ticket_main->id;
            $price = $this->request->price;
            $totalSumTickets = $totalSumTickets + $price;
            $ticketsController = new TicketsController;

            $is_error = false;
            DB::beginTransaction();
            $cont = 0;
            foreach ($rows as $row) {
                $cont++;

                $user_email = $row["correo"];
                $zone_information = $row["ubicacion"];

                // Elimino espacios en blanco inicio y final
                $user_email = trim($user_email);
                $user_email = preg_replace('/[\x00-\x1F\x7F-\xFF]/', '', $user_email);
                $zone_information = trim($zone_information);
                $zone_information = preg_replace('/[\x00-\x1F\x7F-\xFF]/', '', $zone_information);

                // Ignora lineas en blanco
                if (!$user_email && !$zone_information) {
                    continue;
                }

                // Validamos que el correo exista
                $user = Arr::where($usersBD, function ($value) use ($user_email) {
                    return strtolower($value['email']) == strtolower($user_email);
                });
                $user = collect($user)->first();
                if (!$user) {
                    $this->answer[] = [
                        'message' => trans('messages.controller_credit_coins_tag7') . ' (' . $user_email . ')' . ', linea: ' . $cont,
                        'state' => false,
                        'line' => $cont
                    ];

                    $is_error = true;
                    continue;
                }

                if (!$zone_information) {
                    $this->answer[] = [
                        'message' => 'Información de zona no especificada',
                        'state' => false,
                        'line' => $cont
                    ];

                    $is_error = true;
                    continue;
                }

                $location_information = explode("-", $zone_information);
                if (sizeof($location_information) < 4) {
                    $this->answer[] = [
                        'message' => 'Error ubicación incompleta: ' . $zone_information . ' no completa Debe ser (Tribuna-Zona-Fila-Silla). Ticket NO creado usuario email: ' . $user_email,
                        'state' => false,
                        'line' => $cont
                    ];

                    $is_error = true;
                    continue;
                }

                $tribune = Arr::where($zones, function ($value) use ($location_information) {
                    return $value['name'] == $location_information[0];
                });
                $tribune = collect($tribune)->first();
                if (!$tribune) {
                    $this->answer[] = [
                        'message' => 'Error Location: ' . $zone_information . ' tribuna no encontrada. Ticket NO creado usuario email: ' . $user_email,
                        'state' => false,
                        'line' => $cont
                    ];

                    $is_error = true;
                    continue;
                }

                $zone = Arr::where($zones, function ($value) use ($location_information, $tribune) {
                    return str_contains($value['name'], $location_information[1]) && $value['zone_id'] == $tribune['id'];
                });
                $zone = collect($zone)->first();
                if (!$zone) {
                    $this->answer[] = [
                        'message' => 'Error Location: ' . $zone_information . ' zona no encontrada. Ticket NO creado usuario email: ' . $user_email,
                        'state' => false,
                        'line' => $cont
                    ];

                    $is_error = true;
                    continue;
                }

                $letter = Arr::where($letters, function ($value) use ($location_information) {
                    return $value['name'] == $location_information[2];
                });
                $letter = collect($letter)->first();
                if (!$letter) {
                    $this->answer[] = [
                        'message' => 'Error Location: ' . $zone_information . ' fila no encontrada. Ticket NO creado usuario email: ' . $user_email,
                        'state' => false,
                        'line' => $cont
                    ];

                    $is_error = true;
                    continue;
                }

                $seat = Arr::where($seats, function ($value) use ($location_information, $zone, $letter) {
                    return $value['code'] == $location_information[3] && $value['letter_id'] == $letter['id'] && $value['zone_id'] == $zone['id'];
                });
                $seat = collect($seat)->first();
                if (!$seat) {
                    $this->answer[] = [
                        'message' => 'Error Location: ' . $zone_information . ' silla no encontrada. Ticket NO creado usuario email: ' . $user_email,
                        'state' => false,
                        'line' => $cont
                    ];

                    $is_error = true;
                    continue;
                }

                $ticket_current = $ticketsController->existsTicket($seat['id'], $match_event_id, $user['id']);
                if ($ticket_current) {
                    $is_error = true;
                    $this->answer[] = [
                        'message' => __('messages.error_validation_3', ['seat' => $location_information[0] . "-" . $location_information[1] . "-" . $location_information[2] . "-" . $location_information[3]]),
                        'state' => false,
                        'line' => $cont
                    ];
                    continue;
                }

                $newTicket = $ticketsController->createTicket($seat['id'], $match_event_id, $user['id'], $ticket_type_id, $ticket_main_id, $price, true);

                $obj = new \stdClass();
                $obj->user_id = $user['id'];
                $obj->code_ticket = $newTicket->code_ticket;

                $usersToSendEmail->push($obj);
                if (!in_array($user['id'], $users)) {
                    $user_id = $user['id'];
                    $users[] = $user_id;
                }
            }

            if ($is_error || sizeof($rows) <= 0) {
                DB::rollback();
                return;
            } else {
                $ticket_main->total = $totalSumTickets;
                $ticket_main->update();
                DB::commit();

                if (count($users) > 1) {
                    $this->sendEmails($usersToSendEmail, $ticket_type_id, $match_event_id);
                } else {
                    $massiveController = new MassiveFansController;
                    if ($usersToSendEmail->count() > 0 && $usersToSendEmail->count() <= 100) {
                        $massiveController->sendListMail($usersToSendEmail, $ticket_type_id, $match_event_id, $user_id);
                    }

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

    public function sendEmails($usersToSendEmail, $ticket_type_id, $match_event_id)
    {
        $ticketsController = new TicketsController;
        $usersToSendEmail = $usersToSendEmail->groupBy('user_id');
        foreach ($usersToSendEmail as $userToSendEmail) {
            if (count($userToSendEmail) > 1) {
                $ticketsController->sendEmailMultipleTickets($userToSendEmail[0]->user_id, $userToSendEmail, $ticket_type_id, $match_event_id);
            } else {
                $ticketsController->sendSingleEmailTicket($userToSendEmail[0]->user_id, $userToSendEmail[0]->code_ticket);
            }
        }
    }
}