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