File: /var/www/vhost/disk-apps/dev-beg.teky.com.co/app/Http/Controllers/DashboardController.php
<?php
namespace App\Http\Controllers;
use App\User;
use App\Area;
use App\Form;
use App\UserZone;
use App\Equipment;
use App\Inventory;
use DataTables;
use Carbon\Carbon;
use App\MeasurementDocument;
use Illuminate\Http\Request;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Auth;
class DashboardController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
abort_unless(\Gate::allows('dashboard_access'), 403);
$areas = Area::with('forms')->orderBy('priority', 'asc')->get();
$userZones = UserZone::where('user_id', Auth::user()->id)->with('zone')->get();
$inventories = Inventory::whereRaw('quantity_available <= reorder_point')->with(['item','storage','location'])->get();
foreach ($areas as $key => $area) {
if(!$userZones->pluck('zone_id')->contains($area->zone_id)){
$areas = $this->splicePositionById($areas,$area->id);
}
}
$equipments = Equipment::with('forms')->orderBy('priority', 'asc')->get();
foreach ($equipments as $key => $equipment) {
if(!$areas->pluck('id')->contains($equipment->area_id)){
$equipments = $this->splicePositionById($equipments,$equipment->id);
}
}
$defenders = $equipments->filter(function ($equipment) {
return str_contains(strtolower($equipment->name), 'defender');
});
$allDefenders = new Collection();
foreach ($defenders as $key => $defender) {
$lastChangeFilter = MeasurementDocument::where([
['area_id', $defender->area_id],
['equipment_id',$defender->id],
['field_id', 28]
])
->whereNotNull('value')
->latest()
->first();
$lastCleanFilter = MeasurementDocument::where([
['area_id', $defender->area_id],
['equipment_id',$defender->id],
['field_id', 29]
])
->whereNotNull('value')
->latest()
->first();
$allDefenders->push([
'name' => $defender->name,
'last_change_filter' => Carbon::instance($lastChangeFilter->created_at)->format('j F y'),
'last_clean_filter' => Carbon::instance($lastCleanFilter->created_at)->format('j F y'),
'class_change' => $this->calculateStatusLastPerliteChange($lastChangeFilter->created_at),
'class_clean' => $this->calculateStatusLastFilterCleanse($lastCleanFilter->created_at),
]);
}
$allDefenders = $allDefenders->sortBy(function ($defender) {
return strtotime($defender['last_change_filter']);
});
$areasForms = Form::where('active', 1)->orderBy('id', 'asc')->get();
$this->deleteFormsAreas($areasForms);
$equipmentsForms = Form::where('active', 1)->orderBy('id', 'asc')->get();
$this->deleteFormsEquipment($equipmentsForms);
$users = User::whereHas('roles', function ($query) {
$query->where('role_id', 3);
})->with('zones')->orderBy('last_logon', 'desc')->get();
return view('dashboard.dashboard', compact(
'areasForms',
'equipmentsForms',
'users',
'equipments',
'userZones',
'inventories',
'allDefenders'
));
}
public function dashboardTableAreas($userZonesFilter)
{
abort_unless(\Gate::allows('dashboard_access'), 403);
try {
$listZones = new Collection(json_decode($userZonesFilter));
$date = Carbon::now();
$current_date = $date->toDateString();
$areas = Area::with('forms')->orderBy('priority', 'asc')->get();
$userZones = UserZone::where('user_id', Auth::user()->id)->with('zone')->get();
if(count($listZones)){
foreach ($userZones as $zone) {
if(!$listZones->pluck('zone_id')->contains($zone->zone_id)){
$userZones = $this->splicePositionByZoneID($userZones,$zone->zone_id);
}
}
}
foreach ($areas as $key => $area) {
if(!$userZones->pluck('zone_id')->contains($area->zone_id)){
$areas = $this->splicePositionById($areas,$area->id);
}
}
$formsA = Form::where('active', 1)->orderBy('id', 'asc')->get();
$valuesAreas = MeasurementDocument::with('operator')->whereNull('equipment_id')->whereBetween('created_at', [$current_date." 00:00:00", $current_date." 23:59:59"])->get()->groupBy(['code']);
$results = $this->organizeDocuments($areas,$formsA,$valuesAreas);
$objectRow = new Collection;
foreach ($areas as $area) {
$count = 0;
$td = '';
$row = [
'area' => $area->name
];
foreach ($results as $result) {
if($area->id == $result[0]->area_id){
foreach ($result as $item) {
$td = $td . $item->td;
}
$row[$formsA[$count]->name] = $td;
$td = '';
$count ++;
}
}
$objectRow->push($row);
}
$formsRows = [];
foreach ($formsA as $form) {
$formsRows[] = $form->name;
}
return Datatables::of($objectRow)
->rawColumns($formsRows)
->make(true);
} catch (\Exception $e) {
return response(array("status" => false, "type" => "error", "title" => "Oops...", "message" => __('error_search'), "data" => $e->getMessage()));
}
}
public function dashboardTableEquipment($userZonesFilter)
{
abort_unless(\Gate::allows('dashboard_access'), 403);
try {
$listZones = new Collection(json_decode($userZonesFilter));
$date = Carbon::now();
$current_date = $date->toDateString();
$areas = Area::with('forms')->orderBy('priority', 'asc')->get();
$userZones = UserZone::where('user_id', Auth::user()->id)->with('zone')->get();
if(count($listZones)){
foreach ($userZones as $zone) {
if(!$listZones->pluck('zone_id')->contains($zone->zone_id)){
$userZones = $this->splicePositionByZoneID($userZones,$zone->zone_id);
}
}
}
foreach ($areas as $key => $area) {
if(!$userZones->pluck('zone_id')->contains($area->zone_id)){
$areas = $this->splicePositionById($areas,$area->id);
}
}
$equipments = Equipment::with('forms')->orderBy('priority', 'asc')->get();
foreach ($equipments as $key => $equipment) {
if(!$areas->pluck('id')->contains($equipment->area_id)){
$equipments = $this->splicePositionById($equipments,$equipment->id);
}
}
$equipmentsForms = Form::where('active', 1)->orderBy('id', 'asc')->get();
$valuesEquipments = MeasurementDocument::with('operator')->whereNotNull('equipment_id')->whereBetween('created_at', [$current_date." 00:00:00", $current_date." 23:59:59"])->get()->groupBy(['code']);
$results = $this->organizeDocumentsEquipment($equipments,$equipmentsForms,$valuesEquipments);
$objectRow = new Collection;
foreach ($equipments as $equipment) {
$count = 0;
$td = '';
$row = [
'equipment' => $equipment->name
];
foreach ($results as $result) {
if($equipment->id == $result[0]->equipment_id){
foreach ($result as $item) {
$td = $td . $item->td;
}
$row[$equipmentsForms[$count]->name] = $td;
$td = '';
$count ++;
}
}
$objectRow->push($row);
}
$formsRows = [];
foreach ($equipmentsForms as $form) {
$formsRows[] = $form->name;
}
return Datatables::of($objectRow)
->rawColumns($formsRows)
->make(true);
} catch (\Exception $e) {
return response(array("status" => false, "type" => "error", "title" => "Oops...", "message" => __('error_search'), "data" => $e->getMessage()));
}
}
public function splicePositionByZoneID($items,$searchValue){
$index = $items->search(function($item) use ($searchValue) {
return $item->zone_id === $searchValue;
});
$items->splice($index, 1);
return $items;
}
public function splicePositionById($items,$searchValue){
$index = $items->search(function($item) use ($searchValue) {
return $item->id === $searchValue;
});
$items->splice($index, 1);
return $items;
}
public function splicePositionByName($items,$searchValue){
$index = $items->search(function($item) use ($searchValue) {
return $item->name === $searchValue;
});
$items->splice($index, 1);
return $items;
}
public function deleteFormsAreas($areasForms){
$arraySplice = ['PMC-003','PMF-001','PMF-002','PMF-003','PMP-001','PMP-002'];
foreach ($arraySplice as $key => $splice) {
$areasForms = $this->splicePositionByName($areasForms,$splice);
}
}
public function deleteFormsEquipment($equipmentsForms){
$arraySplice = ['PMC-002','PMC-003','PMW-001','PMC-001','PMC-001-ES','PMC-001-RE'];
foreach ($arraySplice as $key => $splice) {
$equipmentsForms = $this->splicePositionByName($equipmentsForms,$splice);
}
}
public function organizeDocuments($areas,$areasForms,$values)
{
$this->deleteFormsAreas($areasForms);
$documents = array();
foreach ($areas as $keya => $area) {
foreach ($areasForms as $keyf => $form) {
$records = array();
if($area->forms->pluck('id')->contains($form->id)){
for ($i=1; $i <= $form->number_records; $i++) {
$status = false;
$currentDocument = [];
foreach ($values as $keyv => $item) {
if($item[0]->area_id == $area->id && $item[0]->form_id == $form->id && $item[0]->record == $i){
$status = true;
$currentDocument = $item[0];
}
}
if($status){
$genericObject = new \stdClass();
$genericObject->area_id = $area->id;
if(\Gate::allows('measurementDocument_show')){
$genericObject->td = ' <a href="'.route('measurementDocuments.show', ['code' => $currentDocument->code]).'"
class="badge badge-success">'.$currentDocument->created_at.'
</a>
<p>'.$currentDocument->operator->username.'</p>
';
}else{
$genericObject->td = "<span class='badge badge-success'>".$currentDocument->created_at."</span><p>".$currentDocument->operator->username."</p>";
}
$records[] = $genericObject;
}else{
$genericObject = new \stdClass();
$genericObject->area_id = $area->id;
$genericObject->td = "<span class='badge badge-danger'>".__('pending')."</span>";
$records[] = $genericObject;
}
}
}else{
$genericObject = new \stdClass();
$genericObject->area_id = $area->id;
$genericObject->td = "<span class='badge badge-info'>".__('not_apply')."</span>";
$records[] = $genericObject;
}
$documents[] = $records;
}
}
return $documents;
}
public function organizeDocumentsEquipment($equipments,$equipmentsForms,$values)
{
$this->deleteFormsEquipment($equipmentsForms);
$documents = array();
foreach ($equipments as $keye => $equipment) {
foreach ($equipmentsForms as $keyf => $form) {
$records = array();
if($equipment->forms->pluck('id')->contains($form->id)){
for ($i=1; $i <= $form->number_records; $i++) {
$status = false;
$currentDocument = [];
foreach ($values as $keyv => $item) {
if($item[0]->area_id == $equipment->area_id && $item[0]->equipment_id == $equipment->id && $item[0]->form_id == $form->id && $item[0]->record == $i){
$status = true;
$currentDocument = $item[0];
}
}
if($status){
$genericObject = new \stdClass();
$genericObject->equipment_id = $equipment->id;
if(\Gate::allows('measurementDocument_show')){
$genericObject->td = ' <a href="'.route('measurementDocuments.show', ['code' => $currentDocument->code]).'"
class="badge badge-success">'.$currentDocument->created_at.'
</a>
<p>'.$currentDocument->operator->username.'</p>
';
}else{
$genericObject->td = '<span class="badge badge-success">'.$currentDocument->created_at.'</span><p>'.$currentDocument->operator->username.'</p>';
}
$records[] = $genericObject;
}else{
$genericObject = new \stdClass();
$genericObject->equipment_id = $equipment->id;
$genericObject->td = "<span class='badge badge-danger'>".__('pending')."</span>";
$records[] = $genericObject;
}
}
}else{
$genericObject = new \stdClass();
$genericObject->equipment_id = $equipment->id;
$genericObject->td = "<span class='badge badge-info'>".__('not_apply')."</span>";
$records[] = $genericObject;
}
$documents[] = $records;
}
}
return $documents;
}
public function calculateStatusLastPerliteChange(Carbon $startDate)
{
$weeksPassed = $startDate->diffInWeeks(Carbon::now());
$status = "badge-danger";
if ($weeksPassed <= 3) {
$status = "badge-success";
}
if ($weeksPassed > 3 && $weeksPassed <= 6) {
$status = "badge-warning";
}
return $status;
}
public function calculateStatusLastFilterCleanse(Carbon $startDate)
{
$weeksPassed = $startDate->diffInWeeks(Carbon::now());
$status = "badge-danger";
if ($weeksPassed <= 6) {
$status = "badge-success";
}
return $status;
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
//
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(Request $request)
{
//
}
/**
* Display the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function show($id)
{
//
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id)
{
//
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(Request $request, $id)
{
//
}
/**
* Remove the specified resource from storage.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function destroy($id)
{
//
}
}