File: /var/www/vhost/disk-apps/qas.sports-crowd.com/app/Http/Controllers/ZonesController.php
<?php
namespace App\Http\Controllers;
use App\Core\Ticket\StageTypesEnum;
use App\Zone;
use App\Seat;
use App\Door;
use App\Letter;
use App\MatchEventStage;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
use Box\Spout\Common\Entity\Style\Color;
use Box\Spout\Common\Entity\Style\CellAlignment;
use Box\Spout\Writer\Common\Creator\Style\StyleBuilder;
use Box\Spout\Reader\Common\Creator\ReaderEntityFactory;
use Box\Spout\Writer\Common\Creator\WriterEntityFactory;
class ZonesController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$zonesExport = Zone::select('zones.id', DB::raw("CONCAT(zsub.name, ' ', REPLACE(zones.name, '_', ' ')) as name"),)
->join('zones as zsub', 'zones.zone_id', '=', 'zsub.id')
->where('zsub.active', true)->where('zones.active', true)
->where('zones.is_saleable', true)
->get();
$zones = Zone::whereNull('zone_id')->get();
$doors = Door::select('id', 'name')->where('active', true)->get();
$letters = Letter::select('id', 'name')->get();
foreach ($zones as $zone) {
$zone->childs = $this->getChilds($zone->id, "controller");
}
return view('zones.list', compact('zones', 'doors', 'letters', 'zonesExport'));
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
return view('zones.create');
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
if (!Zone::where([['name', $request->input('name')], ['zone_id', $request->input('zone_id')]])->first()) {
if ($zone = Zone::create($request->all())) {
return response(array("r" => true, "type" => "success", "title" => "", "m" => __('messages.created_successfully'), "data" => $zone->id));
} else {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_creating'), "data" => null));
}
} else {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.already_exists', ['name' => $request->input('name')]), "data" => null));
}
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
return redirect()->back();
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
$team = Zone::findOrFail($id);
return view('zones.edit', compact('team'));
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
if (!Zone::where([['id', '!=', $id], ['name', $request->input('name')], ['zone_id', $request->input('zone_id')]])->first()) {
if (Zone::where('id', $id)->update($request->except('zone_id'))) {
return response(array("r" => true, "type" => "success", "title" => "", "m" => __('messages.updated_successfully'), "data" => null));
} else {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_updating'), "data" => null));
}
} else {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.already_exists', ['name' => $request->input('name')]), "data" => null));
}
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
try {
if (Zone::where('id', $id)->delete()) {
return response(array("r" => true, "type" => "success", "title" => "", "m" => __('messages.deleted_successfully'), "data" => null));
} else {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_removing'), "data" => null));
}
} catch (\Illuminate\Database\QueryException $e) {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.delete_relation_data'), "data" => null));
}
}
/**
* Remove the specified seat.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroySeat($id)
{
try {
if (Seat::where('id', $id)->delete()) {
return response(array("r" => true, "type" => "success", "title" => "", "m" => __('messages.deleted_successfully'), "data" => null));
} else {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_removing'), "data" => null));
}
} catch (\Illuminate\Database\QueryException $e) {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.delete_relation_data'), "data" => null));
}
}
public function getChilds($zone_id, $origin = 'api')
{
$childs = Zone::where('zone_id', $zone_id)->with('zone')->get();
if ($origin == "api") {
return response(array("r" => true, "type" => "success", "title" => "", "m" => "", "data" => $childs));
}
return $childs;
}
public function getSeats($zone_id)
{
$seats = Seat::where([['zone_id', $zone_id], ['active', true]])->with('letter')->orderBy('code', 'desc')->get();
return response(array("r" => true, "type" => "success", "title" => "", "m" => "", "data" => $seats));
}
public function createSeat(Request $request)
{
if (Seat::create($request->all())) {
return response(array("r" => true, "type" => "success", "title" => "", "m" => __('messages.created_successfully'), "data" => null));
} else {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_creating'), "data" => null));
}
}
public function editSeat(Request $request, $seat_id)
{
$request->request->remove('zone_id');
$request->request->remove('locked');
if (Seat::where('id', $seat_id)->update($request->all())) {
return response(array("r" => true, "type" => "success", "title" => "", "m" => __('messages.updated_successfully'), "data" => null));
} else {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_updating'), "data" => null));
}
}
public function export()
{
$writer = WriterEntityFactory::createXLSXWriter();
$writer->openToBrowser("sillas.xlsx");
$sheet = $writer->getCurrentSheet();
$sheet->setName(__('Sillas'));
$style = (new StyleBuilder())
->setFontBold()
->setFontSize(10)
->setFontColor(Color::BLACK)
->setShouldWrapText()
->setCellAlignment(CellAlignment::CENTER)
->setBackgroundColor(Color::rgb(245, 245, 245))
->build();
$defaultStyle = (new StyleBuilder())
->setFormat('@')
->build();
$cells = [
WriterEntityFactory::createCell(__('Número de la silla'), $defaultStyle),
WriterEntityFactory::createCell(__('Id Sector'), $defaultStyle),
WriterEntityFactory::createCell(__('Id Letra'), $defaultStyle),
];
$singleRow = WriterEntityFactory::createRow($cells, $style);
$writer->addRow($singleRow);
$seats = Seat::select('id', 'code', 'zone_id', 'letter_id')->orderBy('id', 'ASC')->get();
foreach ($seats as $seat) {
$value = [$seat->code, $seat->zone_id, $seat->letter_id];
$rowFromValue = WriterEntityFactory::createRowFromArray($value, $defaultStyle);
$writer->addRow($rowFromValue);
}
// add sheet ids zones
$writer->addNewSheetAndMakeItCurrent();
$sheet = $writer->getCurrentSheet();
$sheet->setName(__('Sector'));
$cells_zone = [
WriterEntityFactory::createCell(__('id')),
WriterEntityFactory::createCell(__('Nombre')),
];
$singleRow_zone = WriterEntityFactory::createRow($cells_zone);
$writer->addRow($singleRow_zone);
$zones = Zone::where('is_saleable', true)->with('zone')->orderBy('id', 'asc')->get();
foreach ($zones as $zone) {
$value = [$zone->id, $zone->zone ? $zone->zone->name . " - " . $zone->name : $zone->name];
$rowFromValue_zones = WriterEntityFactory::createRowFromArray($value);
$writer->addRow($rowFromValue_zones);
}
// end sheet ids zones
// add sheet ids letters
$writer->addNewSheetAndMakeItCurrent();
$sheet = $writer->getCurrentSheet();
$sheet->setName(__('Letra'));
$cells_letter = [
WriterEntityFactory::createCell(__('id')),
WriterEntityFactory::createCell(__('Nombre')),
];
$singleRow_letter = WriterEntityFactory::createRow($cells_letter);
$writer->addRow($singleRow_letter);
$letters = Letter::all();
foreach ($letters as $letter) {
$value = [$letter->id, $letter->name];
$rowFromValue_letters = WriterEntityFactory::createRowFromArray($value);
$writer->addRow($rowFromValue_letters);
}
// end sheet ids letters
$writer->close();
}
public function getValueRow($cells, $index = false)
{
if ($index !== false) {
return $cells[$index]->getValue();
}
return $cells->getValue();
}
public function validateCell($cells, $cnt, $zones, $letters)
{
try {
$seat = new \stdClass();
$seat->active = true;
foreach ($cells as $key => $cell) {
$value = $this->getValueRow($cell);
if ($key == 0) {
if (!$value || $value == "") {
$this->msj_rollback_import = __('messages.cell_empty', ['column' => __('Número de la silla'), 'cell' => $cnt]);
return false;
break;
}
$seat->code = $value;
continue;
}
if ($key == 1) {
if (intval($value) < 6 || !in_array($value, $zones)) {
$this->msj_rollback_import = __('messages.cell_empty', ['column' => __('Id Sector'), 'cell' => $cnt]);
return false;
break;
}
$seat->zone_id = $value;
continue;
}
if ($key == 2) {
if (!in_array($value, $letters)) {
$this->msj_rollback_import = __('messages.cell_empty', ['column' => __('Id Letra'), 'cell' => $cnt]);
return false;
break;
}
$seat->letter_id = $value;
continue;
}
}
return json_decode(json_encode($seat), true);
} catch (\Throwable $e) {
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => $e->getMessage(), "data" => null));
}
}
public function import(Request $request)
{
try {
Schema::disableForeignKeyConstraints();
Seat::truncate();
Schema::enableForeignKeyConstraints();
DB::beginTransaction();
$reader = ReaderEntityFactory::createXLSXReader();
$reader->open($request->importSeats);
$cnt = 0;
$zones = Zone::pluck('id')->toArray();
$letters = Letter::pluck('id')->toArray();
foreach ($reader->getSheetIterator() as $key_sheet => $sheet) {
if ($key_sheet == 1) {
foreach ($sheet->getRowIterator() as $row) {
if ($cnt > 0) {
$cells = $row->getCells();
if ($seat = $this->validateCell($cells, $cnt + 1, $zones, $letters)) {
Seat::create($seat);
} else {
DB::rollback();
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => $this->msj_rollback_import, "data" => null));
break;
}
}
$cnt++;
}
}
}
DB::commit();
$reader->close();
return response(array("r" => true, "type" => "success", "title" => "", "m" => __('messages.import_successfully', ["cnt" => $cnt - 1]), "data" => null));
} catch (\Throwable $th) {
DB::rollback();
return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => $th->getMessage(), "data" => null));
}
}
public function getAvailableZones($mainZone = null, $secondaryZone = null, $matchEventId = null, $zoneRestriction = false)
{
$zones = Zone::where('is_saleable', true)
->where('salable_capacity', '>', 0)
->where('active', 1);
if ($mainZone)
$zones->when($mainZone, function ($query) use ($mainZone) {
return $query->where('zone_id', $mainZone)->orderByRaw("CASE WHEN zone_id = " . $mainZone . " THEN 0 ELSE 1 END ASC");
});
if ($secondaryZone)
$zones->when($secondaryZone, function ($query) use ($secondaryZone) {
return $query->orderByRaw("CASE WHEN id = " . $secondaryZone . " THEN 0 ELSE 1 END ASC");
});
if ($matchEventId && $zoneRestriction) {
$rules = MatchEventStage::where('match_event_id', $matchEventId)->get();
if (count($rules) > 0) {
$zonesRules = array();
foreach ($rules as $rule) {
// Bloqueo por zona
if ($rule->stage_type_id == StageTypesEnum::BLOCK_TRIBUNE) {
if ($rule->zone_id == $mainZone || $rule->zone_id == $secondaryZone) {
return [];
}
$zonesRules[] = $rule->zone_id;
}
}
if (count($zonesRules) > 0) {
$zones->whereNotIn('id', $zonesRules)->whereNotIn('zone_id', $zonesRules);
}
}
}
return $zones->pluck('id');
}
public function getZonesChilds($zone_id)
{
$zonesDB = Zone::select('id', 'zone_id')->where('active', 1)->with('zone')->get();
$zone = $zonesDB->find($zone_id);
$stadiumId = $zone->zone ? $zone->zone->zone_id : $zone->zone_id;
$zonesId = [];
foreach ($zonesDB->where('zone_id', $stadiumId) as $zone) {
$zonesChilds = $zonesDB->where('zone_id', $zone->id)->pluck('id')->toArray();
$zonesId = array_merge($zonesId, $zonesChilds);
}
return $zonesDB->whereIn('id', $zonesId)->pluck('id');
}
public function getChildZones($zone_id, &$zones = [], $zonesDB = null)
{
if ($zonesDB === null) {
$zonesDB = Zone::select('id', 'name', 'zone_id')
->where('active', 1)
->with('zone')
->get()
->keyBy('id');
}
$children = $zonesDB->filter(function ($zone) use ($zone_id) {
return $zone->zone_id == $zone_id;
});
if ($children->count() > 0) {
foreach ($children as $child) {
$this->getChildZones($child->id, $zones, $zonesDB);
}
} else {
$zone = $zonesDB[$zone_id] ?? null;
if ($zone) {
$newZone = new \stdClass();
$newZone->id = $zone->id;
$newZone->name = $zone->zone ? $zone->zone->name . " - " . $zone->name : $zone->name;
$zones[] = $newZone;
}
}
return $zones;
}
}