HEX
Server: Apache/2.4.41 (Ubuntu)
System: Linux ip-172-31-42-149 5.15.0-1084-aws #91~20.04.1-Ubuntu SMP Fri May 2 07:00:04 UTC 2025 aarch64
User: ubuntu (1000)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
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)
    {
        //
    }
}