diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 4c496f9d..54c6f794 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -26,47 +26,114 @@ public function __construct() */ public function index(Request $request) { - // redirect user to controls list - if (Auth::User()->role === 5) { + // Redirect user to controls list if role is 5 + if (Auth::user()->role === 5) { return redirect('/bob/index'); } - // count active domains - $active_domains_count = DB::table('controls') - ->select('measures.domain_id') + // Fetch counts and data using optimized queries + $activeDomainsCount = $this->getActiveDomainsCount(); + $controlsCount = $this->getControlsCount(); + $activeMeasuresCount = $this->getActiveMeasuresCount(); + $controlsMadeCount = $this->getControlsMadeCount(); + $controlsNeverMade = $this->getControlsNeverMade(); + $planedControlsThisMonthCount = $this->getPlanedControlsThisMonthCount(); + $lateControlsCount = $this->getLateControlsCount(); + $actionPlansCount = $this->getActionPlansCount(); + + $activeControls = $this->getActiveControls(); + $controlsTodo = $this->getControlsTodo(); + $expandedControls = $this->getExpandedControls(); + + // Store counts in session + $request->session()->put([ + 'planed_controls_this_month_count' => $planedControlsThisMonthCount, + 'late_controls_count' => $lateControlsCount, + 'action_plans_count' => $actionPlansCount, + ]); + + // Return view with data + return view('welcome', [ + 'active_domains_count' => $activeDomainsCount, + 'controls_count' => $controlsCount, + 'active_measures_count' => $activeMeasuresCount, + 'controls_made_count' => $controlsMadeCount, + 'controls_never_made' => $controlsNeverMade, + 'active_controls' => $activeControls, + 'controls_todo' => $controlsTodo, + 'action_plans_count' => $actionPlansCount, + 'late_controls_count' => $lateControlsCount, + 'controls' => $expandedControls, + ]); + } + + private function getActiveDomainsCount() + { + return DB::table('controls') ->join('control_measure', 'controls.id', '=', 'control_id') ->join('measures', 'control_measure.measure_id', '=', 'measures.id') - ->whereIn('status', [0,1]) - ->distinct() - ->get() - ->count(); + ->whereIn('status', [0, 1]) + ->distinct('measures.domain_id') + ->count('measures.domain_id'); + } - // count all measures - $controls_count = DB::table('measures') - ->count(); + private function getControlsCount() + { + return DB::table('measures')->count(); + } - // count active controls - $active_measures_count = DB::table('controls') - //->whereNull('realisation_date') - ->whereIn('status', [0,1]) + private function getActiveMeasuresCount() + { + return DB::table('controls') + ->whereIn('status', [0, 1]) ->count(); + } - // count controls made - $controls_made_count = DB::table('controls') - //->whereNotNull('realisation_date') + private function getControlsMadeCount() + { + return DB::table('controls') ->where('status', 2) ->count(); + } - // count control never made - $controls_never_made = DB::table('controls as c1') + private function getControlsNeverMade() + { + return DB::table('controls as c1') ->leftJoin('controls as c2', 'c2.next_id', '=', 'c1.id') ->whereNull('c1.realisation_date') ->whereNull('c2.id') ->count(); + } + + private function getPlanedControlsThisMonthCount() + { + return DB::table('controls') + ->whereNull('realisation_date') + ->whereBetween('plan_date', [ + Carbon::now()->startOfMonth(), + Carbon::now()->endOfMonth(), + ]) + ->count(); + } + + private function getLateControlsCount() + { + return DB::table('controls') + ->whereNull('realisation_date') + ->where('plan_date', '<', Carbon::today()) + ->count(); + } + + private function getActionPlansCount() + { + return DB::table('actions') + ->where('status', 0) + ->count(); + } - // Last controls made by measures - $active_controls = - DB::table('controls as c1') + private function getActiveControls() + { + return DB::table('controls as c1') ->select(['c1.id', 'measures.id', 'domains.title', 'c1.realisation_date', 'c1.score']) ->join('controls as c2', 'c2.id', '=', 'c1.next_id') ->join('control_measure', 'control_measure.control_id', '=', 'c1.id') @@ -75,110 +142,68 @@ public function index(Request $request) ->whereNull('c2.realisation_date') ->orderBy('c1.id') ->get(); + } - // Get controls todo - $controls_todo = - DB::table('controls as c1') - ->select([ - 'c1.id', - 'c1.name', - 'c1.scope', - 'c1.plan_date', - 'c1.status', - 'c2.id as prev_id', - 'c2.realisation_date as prev_date', - 'c2.score as score', - ]) - ->leftjoin('controls as c2', 'c1.id', '=', 'c2.next_id') - ->whereIn('c1.status', [0,1]) - ->where('c1.plan_date', '<', Carbon::today()->addDays(30)->format('Y-m-d')) - ->orderBy('c1.plan_date') - ->get(); - - // Fetch measures for all controls in one query - $controlMeasures = DB::table('control_measure') + private function getControlsTodo() + { + // Fetch the controls todo with necessary joins + $controlsTodo = DB::table('controls as c1') ->select([ - 'control_id', - 'measure_id', - 'clause', + 'c1.id', 'c1.name', 'c1.scope', 'c1.plan_date', 'c1.status', + 'c2.id as prev_id', 'c2.realisation_date as prev_date', 'c2.score as score', ]) - ->leftjoin('measures', 'measures.id', '=', 'measure_id') - ->whereIn('control_id', $controls_todo->pluck('id')) - ->orderBy('clause') + ->leftJoin('controls as c2', 'c1.id', '=', 'c2.next_id') + ->whereIn('c1.status', [0, 1]) + ->where('c1.plan_date', '<', Carbon::today()->addDays(30)) + ->orderBy('c1.plan_date') ->get(); - // Group measures by control_id - $measuresByControlId = $controlMeasures->groupBy('control_id'); + // Fetch related control measures in a single query + $controlMeasures = DB::table('control_measure') + ->select(['control_id', 'measure_id', 'clause']) + ->leftJoin('measures', 'measures.id', '=', 'measure_id') + ->whereIn('control_id', $controlsTodo->pluck('id')) + ->orderBy('clause') + ->get() + ->groupBy('control_id'); - // map clauses - foreach ($controls_todo as $control) { - $control->measures = $measuresByControlId->get($control->id, collect())->map(function ($controlMeasure) { + // Map over controlsTodo to add measures + $controlsTodo->map(function ($control) use ($controlMeasures) { + $control->measures = $controlMeasures->get($control->id, collect())->map(function ($controlMeasure) { return [ 'id' => $controlMeasure->measure_id, 'clause' => $controlMeasure->clause, ]; }); - } - - // planed controls this month - $planed_controls_this_month_count = DB::table('controls') - ->where( - [ - ['realisation_date','=',null], - ['plan_date','>=', (new Carbon('first day of this month'))->toDateString()], - ['plan_date','<', (new Carbon('first day of next month'))->toDateString()], - ] - ) - ->count(); - $request->session()->put('planed_controls_this_month_count', $planed_controls_this_month_count); - - // late controls - $late_controls_count = DB::table('controls') - ->where( - [ - ['realisation_date','=',null], - ['plan_date','<', Carbon::today()->format('Y-m-d')], - ] - ) - ->count(); - $request->session()->put('late_controls_count', $late_controls_count); - - // Count number of action plans - $action_plans_count = - DB::table('actions') - ->where('status', 0) - ->count(); + return $control; + }); - $request->session()->put('action_plans_count', $action_plans_count); + return $controlsTodo; + } - // Get all controls + private function getExpandedControls() + { $controls = DB::table('controls') - ->select(['id', 'score', 'realisation_date', 'plan_date']) + ->select('id', 'score', 'realisation_date', 'plan_date', 'periodicity') ->get(); - // return - return view('welcome') - ->with('active_domains_count', $active_domains_count) - ->with('active_controls', $active_controls) - ->with('controls_count', $controls_count) - ->with('active_measures_count', $active_measures_count) - ->with('controls_made_count', $controls_made_count) - ->with('controls_never_made', $controls_never_made) - - ->with('controls_todo', $controls_todo) - ->with('active_controls', $active_controls) - ->with('action_plans_count', $action_plans_count) - ->with('late_controls_count', $late_controls_count) - - ->with('controls', $controls) - ; + return $controls->flatMap(function ($control) { + $expanded = collect([$control]); + + if ($control->realisation_date === null && $control->periodicity > 0 && $control->periodicity <= 12) { + for ($i = 1; $i <= 12 / $control->periodicity; $i++) { + $repeatedControl = clone $control; + $repeatedControl->id = null; + $repeatedControl->score = null; + $repeatedControl->observations = null; + $repeatedControl->realisation_date = null; + $repeatedControl->plan_date = Carbon::parse($control->plan_date)->addMonthsNoOverflow($i * $control->periodicity); + $expanded->push($repeatedControl); + } + } + + return $expanded; + }); } - public function test() - { - $domain = DB::table('domains')->first(); - - return view('test') - ->with('domain', $domain); - } }