Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
249 changes: 137 additions & 112 deletions app/Http/Controllers/HomeController.php
Original file line number Diff line number Diff line change
Expand Up @@ -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')
Expand All @@ -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);
}
}