File: /var/www/vhost/disk-apps/qas.sports-crowd.com/app/Http/Controllers/Imports/FansImport.php
<?php
namespace App\Http\Controllers\Imports;
use App\Core\Payment\PaymentStatusEnum;
use App\Core\Ticket\TicketOriginEnum;
use App\Core\Ticket\TicketTypesEnum;
use App\Http\Controllers\Controller;
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 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)
{
$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;
$this->data = $rows;
if (in_array($this->request->name_ticket_type_id, [TicketTypesEnum::FREE_SALE, TicketTypesEnum::SUBSCRIBER, TicketTypesEnum::COMPLIMENTARY, TicketTypesEnum::CREDIT])) {
$ticket_main = new TicketMain;
$ticket_main->origin = TicketOriginEnum::WEB;
$ticket_main->subtotal = 0;
$ticket_main->service_charge = 0;
$ticket_main->total = 0;
$ticket_main->payment_attempts = 0;
$ticket_main->payment_state = PaymentStatusEnum::CONFIRMED;
$controller = new Controller();
$ticket_main->pin = $controller->gen_uid();
$ticket_main->save();
$ticket_main->payment_reference = strtoupper(hash("md5", (string) $ticket_main->id)) . '_' . $ticket_main->pin;
$ticket_main->update();
// 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++;
try {
$user_email = $row["correo"];
} catch (\Exception $e) {
continue;
}
$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 . ')' . ', fila: ' . $cont,
'state' => false,
'line' => $cont
];
$is_error = true;
continue;
}
if (!$zone_information) {
$this->answer[] = [
'message' => 'Información de zona no especificada' . ', fila: ' . $cont,
'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)' . ', fila: ' . $cont,
'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 Tribuna: ' . $location_information[0] . ' no encontrada' . ', fila: ' . $cont,
'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 Zona: ' . $location_information[1] . ' no encontrada' . ', fila: ' . $cont,
'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 Fila: ' . $location_information[2] . ' no encontrada' . ', fila: ' . $cont,
'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 Silla: ' . $location_information[3] . ' no encontrada' . ', fila: ' . $cont,
'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;
}
$ticketsController->createTicket(
[
'seat_id' => $seat['id'],
'match_event_id' => $match_event_id,
'user_id' => $user['id'],
'ticket_type_id' => $ticket_type_id,
'ticket_main_id' => $ticket_main_id,
'price' => $price,
'is_from_massive' => true
]
);
}
if ($is_error || sizeof($rows) <= 0) {
DB::rollback();
return;
} else {
$ticket_main->total = $totalSumTickets;
$ticket_main->update();
DB::commit();
$ticketsController->dispatchTicketProcesses($ticket_main->id);
}
}
}
}