File: /var/www/vhost/disk-apps/agile-selling-wpb/app/Http/Controllers/ZonesController.php
<?php
namespace App\Http\Controllers;
use Excel;
use App\Zone;
use App\Seat;
use App\Door;
use App\Letter;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Schema;
use Box\Spout\Common\Entity\Row;
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()
{
$zones = Zone::whereNull('zone_id')->get();
$doors = Door::where('active', true)->get();
$letters = Letter::all();
foreach ($zones as $zone) {
$zone->childs = $this->getChlids($zone->id,"controller");
}
return view('zones.list', compact('zones','doors', 'letters'));
}
/**
* 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 getChlids($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)->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)
{
if (Seat::where('id', $seat_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));
}
}
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::orderBy('zone_id', 'asc')->orderBy('letter_id', 'asc')->orderBy('code','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->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)
{
try {
foreach ($cells as $key => $cell) {
$value = $this->getValueRow($cell);
if($key == 0 && !$value || $key == 0 && $value == ""){
$this->msj_rollback_import = __('messages.cell_empty', ['column' => __('Número de la silla'), 'cell' => $cnt]);
return false;
break;
}
if($key == 1 && intval($value) < 6 || $key == 1 && !Zone::where('id', $value)->first()){
$this->msj_rollback_import = __('messages.cell_empty', ['column' => __('Id Sector'), 'cell' => $cnt]);
return false;
break;
}
if($key == 2 && !Letter::where('id', $value)->first()){
$this->msj_rollback_import = __('messages.cell_empty', ['column' => __('Id Letra'), 'cell' => $cnt]);
return false;
break;
}
}
$seat = new \stdClass();
$seat->code = $this->getValueRow($cells,0);
$seat->zone_id = $this->getValueRow($cells,1);
$seat->letter_id = $this->getValueRow($cells,2);
$seat->active = true;
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;
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)){
$current_seat = 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));
}
}
}