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);
}
}
}
}