Muhammad Sulaiman Yusuf
2 years ago
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