Muhammad Sulaiman Yusuf
2 years ago
committed by
Gitea
2 changed files with 180 additions and 0 deletions
@ -0,0 +1,170 @@
|
||||
<?php |
||||
|
||||
namespace App\Http\Controllers; |
||||
|
||||
use App\Models\Project; |
||||
use App\Models\Divisi; |
||||
use App\Models\ProjectPhase; |
||||
use Illuminate\Support\Collection; |
||||
use DB; |
||||
|
||||
class DashboardBoDController extends Controller |
||||
{ |
||||
private function interpolateYear($year){ |
||||
if($year) |
||||
$year = '%'.$year.'%'; |
||||
return $year; |
||||
} |
||||
|
||||
public function getCompanyCashFlow($year = '%') { |
||||
$year = $this->interpolateYear($year); |
||||
|
||||
// we can't use eloquent's sum() method because someone decided to use varchar as datatype in rencana_biaya field |
||||
$totalBudgets = Project::select(DB::raw('SUM(CAST("rencana_biaya" AS DOUBLE PRECISION))')) |
||||
->where('mulai_proyek', 'like', $year) |
||||
->pluck('sum') |
||||
->first(); |
||||
|
||||
return response()->json([ |
||||
'data' => [ |
||||
'total_budget' => (int) $totalBudgets ?? rand(0,10), |
||||
'total_expenditure' => rand(0,10), // to do integrasi |
||||
'total_invoice' => rand(0,10), |
||||
'total_paid_invoice' => rand(0,10), |
||||
] |
||||
], 200); |
||||
} |
||||
|
||||
public function getProjectPerScheduleHealth($year = '%'){ |
||||
$year = $this->interpolateYear($year); |
||||
// get data plan (vol) in % |
||||
// get data actual in % |
||||
return response()->json([ |
||||
'data' => [ |
||||
'behind-schedule' => rand(0,10), |
||||
'warning' => rand(0,10), |
||||
'on-schedule' => rand(0,10), |
||||
] |
||||
], 200); |
||||
} |
||||
|
||||
public function getProjectScheduleHealthPerDivision($year = '%'){ |
||||
$year = $this->interpolateYear($year); |
||||
|
||||
$divisions = Divisi::whereNull('parent')->get(); |
||||
foreach($divisions as $division){ |
||||
$scheduleData = new Collection(); |
||||
$scheduleData->prepend(rand(0, 10), 'behindSchedule'); |
||||
$scheduleData->prepend(rand(0, 10), 'warning'); |
||||
$scheduleData->prepend(rand(0, 10), 'onSchedule'); |
||||
$division->scheduleData = $scheduleData; |
||||
} |
||||
return response()->json([ |
||||
'data' => [ |
||||
$divisions |
||||
] |
||||
], 200); |
||||
} |
||||
|
||||
public function getProjectPerBudgetHealth($year = '%'){ |
||||
$year = $this->interpolateYear($year); |
||||
return response()->json([ |
||||
'data' => [ |
||||
'overrun' => rand(0,10), |
||||
'warning' => rand(0,10), |
||||
'on-budget' => rand(0,10), |
||||
] |
||||
], 200); |
||||
} |
||||
|
||||
public function getProjectBudgetHealthPerDivision($year = '%'){ |
||||
$year = $this->interpolateYear($year); |
||||
|
||||
$divisions = Divisi::whereNull('parent')->get(); |
||||
foreach($divisions as $division){ |
||||
$budgetData = new Collection(); |
||||
$budgetData->prepend(rand(0, 10), 'overrun'); |
||||
$budgetData->prepend(rand(0, 10), 'warning'); |
||||
$budgetData->prepend(rand(0, 10), 'onBudget'); |
||||
$division->budgetData = $budgetData; |
||||
} |
||||
return response()->json([ |
||||
'data' => [ |
||||
$divisions |
||||
] |
||||
], 200); |
||||
} |
||||
|
||||
public function getProjectPerPhase($year = '%'){ |
||||
$year = $this->interpolateYear($year); |
||||
$projectPhases = ProjectPhase::orderBy('order')->get(); |
||||
foreach($projectPhases as $phase){ |
||||
$phase->totalProject = rand(0,10); |
||||
} |
||||
return response()->json([ |
||||
'data' => [ |
||||
$projectPhases |
||||
] |
||||
], 200); |
||||
} |
||||
|
||||
private function countTotalProjectInDivision($id, $year){ |
||||
return Project::where('divisi_id', $id) |
||||
->where('mulai_proyek', 'like', $year) |
||||
->count(); |
||||
} |
||||
|
||||
public function getTotalProjectPerDivision($year = '%') { |
||||
$year = $this->interpolateYear($year); |
||||
|
||||
$totalProjectPerDivision = Divisi::select('id','name') |
||||
->with('children') |
||||
->whereNull('parent') |
||||
->get(); |
||||
|
||||
// to do : count in more than 1 level child |
||||
foreach($totalProjectPerDivision as $v){ |
||||
$v->total = $this->countTotalProjectInDivision($v->id, $year); |
||||
foreach($v->children as $d){ |
||||
$v->total += $this->countTotalProjectInDivision($d->id, $year); |
||||
} |
||||
unset($v->children); |
||||
} |
||||
|
||||
return response()->json([ |
||||
'data' => $totalProjectPerDivision |
||||
], 200); |
||||
} |
||||
|
||||
private function countTotalProjectValueInDivision($id, $year){ |
||||
return Project::select(DB::raw('SUM(CAST("rencana_biaya" AS DOUBLE PRECISION))')) |
||||
->where('mulai_proyek', 'like', $year) |
||||
->where('divisi_id', $id) |
||||
->pluck('sum') |
||||
->first(); |
||||
} |
||||
|
||||
public function getTotalProjectValuePerDivision($year = '%') { |
||||
$year = $this->interpolateYear($year); |
||||
|
||||
$totalProjectValuePerDivision = Divisi::select('id','name') |
||||
->with('children') |
||||
->whereNull('parent') |
||||
->get(); |
||||
|
||||
// to do : count in more than 1 level child |
||||
foreach($totalProjectValuePerDivision as $v){ |
||||
$v->total = $this->countTotalProjectValueInDivision($v->id, $year); |
||||
foreach($v->children as $d){ |
||||
$v->total += $this->countTotalProjectValueInDivision($d->id, $year); |
||||
} |
||||
unset($v->children); |
||||
} |
||||
|
||||
return response()->json([ |
||||
'data' => $totalProjectValuePerDivision |
||||
], 200); |
||||
} |
||||
|
||||
} |
||||
|
Loading…
Reference in new issue