|
|
@ -565,6 +565,8 @@ class MasterFunctionsHelper |
|
|
|
# hitung untuk persentase progress planning |
|
|
|
# hitung untuk persentase progress planning |
|
|
|
if($keyPlanM->duration == 0){ |
|
|
|
if($keyPlanM->duration == 0){ |
|
|
|
$duration = 2; |
|
|
|
$duration = 2; |
|
|
|
|
|
|
|
}else{ |
|
|
|
|
|
|
|
$duration = $keyPlanM->duration + 1; |
|
|
|
} |
|
|
|
} |
|
|
|
// $startPlan = new DateTime($keyPlanM->planned_start); |
|
|
|
// $startPlan = new DateTime($keyPlanM->planned_start); |
|
|
|
// $endPlan = new DateTime($keyPlanM->planned_end); |
|
|
|
// $endPlan = new DateTime($keyPlanM->planned_end); |
|
|
@ -950,7 +952,7 @@ class MasterFunctionsHelper |
|
|
|
return $dataFinal; |
|
|
|
return $dataFinal; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public function calculateSCurve($projectId) |
|
|
|
public function calculateSCurveOld($projectId) |
|
|
|
{ |
|
|
|
{ |
|
|
|
DB::enableQueryLog(); |
|
|
|
DB::enableQueryLog(); |
|
|
|
|
|
|
|
|
|
|
@ -1289,6 +1291,179 @@ class MasterFunctionsHelper |
|
|
|
return $dataFinal; |
|
|
|
return $dataFinal; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
public function calculateSCurve($projectId) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
DB::enableQueryLog(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$dataFinal = []; |
|
|
|
|
|
|
|
$dataPayload = []; |
|
|
|
|
|
|
|
$dataPayload['period'] = 'week'; |
|
|
|
|
|
|
|
$totalACWP = 0; |
|
|
|
|
|
|
|
$totalBCWP = 0; |
|
|
|
|
|
|
|
$tempPercentage = []; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$dataProject = Project::find($projectId); |
|
|
|
|
|
|
|
$dataHeader = Activity::where('type_activity', 'header')->where("proyek_id", $projectId)->first(); |
|
|
|
|
|
|
|
if (isset($dataPayload['end_date']) && $dataPayload['end_date'] > $dataProject->akhir_proyek) { |
|
|
|
|
|
|
|
$dataPayload['end_date'] = $dataProject->akhir_proyek; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ($dataHeader) { |
|
|
|
|
|
|
|
$totalRencanaBudget = Activity::where('parent_id', $dataHeader->id)->where("proyek_id", $projectId)->sum("rencana_biaya"); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
$totalRencanaBudget = Activity::whereNull('parent_id')->where("proyek_id", $projectId)->sum("rencana_biaya"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$minDate = $dataProject->mulai_proyek; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$begin = new \DateTime($minDate); |
|
|
|
|
|
|
|
$begin = $begin->modify('-1 day'); |
|
|
|
|
|
|
|
if (isset($dataPayload['end_date'])) { |
|
|
|
|
|
|
|
$maxDate = $dataPayload['end_date']; |
|
|
|
|
|
|
|
$end = new \DateTime($maxDate . ' Friday'); |
|
|
|
|
|
|
|
// $end->modify('next Friday'); |
|
|
|
|
|
|
|
// $end->modify('next Friday'); |
|
|
|
|
|
|
|
/* $interval = \DateInterval::createFromDateString('1 day'); */// should be using this but its bugged |
|
|
|
|
|
|
|
$interval = new \DateInterval('P1D'); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
$maxDate = $dataProject->akhir_proyek; |
|
|
|
|
|
|
|
$end = new \DateTime($maxDate); |
|
|
|
|
|
|
|
$end = new \DateTime($maxDate->format('Y-m-d') . ' Friday'); |
|
|
|
|
|
|
|
// $end->modify('next Friday'); |
|
|
|
|
|
|
|
// $end->modify('next Friday'); |
|
|
|
|
|
|
|
$interval = new \DateInterval('P1D'); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
$period = new \DatePeriod($begin, $interval, $end); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$arr_ActualM = []; |
|
|
|
|
|
|
|
$tempDate = []; |
|
|
|
|
|
|
|
$tempPercentagePlan = []; |
|
|
|
|
|
|
|
$tempPercentagePlanWhr = []; |
|
|
|
|
|
|
|
$tempPercentageReal = []; |
|
|
|
|
|
|
|
$tempTtlPercentPlan = 0; |
|
|
|
|
|
|
|
$tempTtlPercentActual = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$currentACWP = 0; |
|
|
|
|
|
|
|
$currentBCWP = 0; |
|
|
|
|
|
|
|
$dataActivityPlanDate = []; |
|
|
|
|
|
|
|
$progressPlanKomulatifWeek = []; |
|
|
|
|
|
|
|
$progressActualKomulatifWeek = []; |
|
|
|
|
|
|
|
$dateWeek = []; |
|
|
|
|
|
|
|
$tmpProgressPlanWeek = 0; |
|
|
|
|
|
|
|
$tmpProgressActualWeek = 0; |
|
|
|
|
|
|
|
foreach ($period as $dt) { |
|
|
|
|
|
|
|
$loopDay = $dt->format("Y-m-d"); |
|
|
|
|
|
|
|
//new \Datetime($dt->format("Y-m-d")); |
|
|
|
|
|
|
|
// $minSevenDays = $minSevenDays->modify('-7 day')->format("Y-m-d"); |
|
|
|
|
|
|
|
$tempDate[] = array($dt->format("Y-m-d")); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$dataPlanM = DB::table('m_activity') |
|
|
|
|
|
|
|
->where('type_activity', 'task') |
|
|
|
|
|
|
|
->where('bobot_planning', '>', 0) |
|
|
|
|
|
|
|
->where('proyek_id', $projectId) |
|
|
|
|
|
|
|
->whereDate('planned_start', '<=', $loopDay) |
|
|
|
|
|
|
|
->whereDate('planned_end', '>=', $loopDay) |
|
|
|
|
|
|
|
->select('name', 'bobot_planning', 'biaya_actual', 'duration', 'persentase_progress', 'id', 'planned_start', 'planned_end') |
|
|
|
|
|
|
|
->get(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$dataActualM = DB::table('report_activity_material as ram') |
|
|
|
|
|
|
|
->join('m_activity as ma', 'ma.id', '=', 'ram.activity_id') |
|
|
|
|
|
|
|
->select('ram.activity_id', 'ram.qty as qty_actual', 'ma.bobot_planning', 'ma.name', |
|
|
|
|
|
|
|
DB::raw('(SELECT SUM(amta.qty_planning) FROM assign_material_to_activity amta WHERE amta.activity_id = ram.activity_id) AS qty_plan'), |
|
|
|
|
|
|
|
DB::raw('(SELECT SUM(ram.qty) FROM report_activity_material ram WHERE ram.activity_id = ma.id) AS sum_qty_actual'), |
|
|
|
|
|
|
|
DB::raw('(SELECT DISTINCT status_activity FROM assign_material_to_activity amta WHERE amta.activity_id = ram.activity_id) AS status_activity') |
|
|
|
|
|
|
|
) |
|
|
|
|
|
|
|
->where('ram.report_date', $loopDay) |
|
|
|
|
|
|
|
->where('ma.proyek_id', $projectId) |
|
|
|
|
|
|
|
->get(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$dataActivityPlan = []; |
|
|
|
|
|
|
|
$dataActivityActual = []; |
|
|
|
|
|
|
|
$today = new DateTime(); |
|
|
|
|
|
|
|
if (new \DateTime($loopDay) == new \DateTime($loopDay . ' Friday')){ |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$progressPlanKomulatifWeek[] += round($tmpProgressPlanWeek,2); |
|
|
|
|
|
|
|
if (new \DateTime($loopDay) < $today) { |
|
|
|
|
|
|
|
// $tempPercentageReal[] = round($tempTtlPercentActual, 2); |
|
|
|
|
|
|
|
$progressActualKomulatifWeek[] += round($tmpProgressActualWeek,2); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
$dateWeek[] = [$loopDay]; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// $progressPlanKomulatifWeek[] += $tmpProgressPlanWeek; |
|
|
|
|
|
|
|
foreach ($dataPlanM as $keyPlanM) { |
|
|
|
|
|
|
|
# hitung untuk persentase progress planning |
|
|
|
|
|
|
|
if($keyPlanM->duration == 0){ |
|
|
|
|
|
|
|
$duration = 2; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
// $startPlan = new DateTime($keyPlanM->planned_start); |
|
|
|
|
|
|
|
// $endPlan = new DateTime($keyPlanM->planned_end); |
|
|
|
|
|
|
|
// $interval = $startPlan->diff($endPlan); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// // Mengambil hasil selisih hari |
|
|
|
|
|
|
|
// $duration = $interval->days; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$progressPlanWeek = $keyPlanM->bobot_planning / $duration; |
|
|
|
|
|
|
|
$dataActivityPlan[] = array( |
|
|
|
|
|
|
|
'progressPlanDay' => $progressPlanWeek, |
|
|
|
|
|
|
|
'name' => $keyPlanM->name, |
|
|
|
|
|
|
|
'bobot_p' => $keyPlanM->bobot_planning, |
|
|
|
|
|
|
|
'duration' => $keyPlanM->duration |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
$tmpProgressPlanWeek += $progressPlanWeek; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// hitung progress actual |
|
|
|
|
|
|
|
foreach ($dataActualM as $keyActualM) { |
|
|
|
|
|
|
|
# hitung untuk persentase progress actual |
|
|
|
|
|
|
|
// $progressActualWeek = ((((($keyActualM->qty_actual / $keyActualM->sum_qty_actual) * 100) / $keyActualM->qty_plan)*100)*$keyActualM->bobot_planning)/100; |
|
|
|
|
|
|
|
if($keyActualM->sum_qty_actual > $keyActualM->qty_plan){ |
|
|
|
|
|
|
|
$progressActualWeek = (($keyActualM->qty_actual / $keyActualM->sum_qty_actual) * 100) *$keyActualM->bobot_planning/100; |
|
|
|
|
|
|
|
}else{ |
|
|
|
|
|
|
|
$progressActualWeek = ((($keyActualM->qty_actual / $keyActualM->sum_qty_actual) * 100) / $keyActualM->qty_plan)*$keyActualM->bobot_planning; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if($keyActualM->status_activity == 'done'){ |
|
|
|
|
|
|
|
$progressActualWeek = $progressActualWeek > $keyActualM->bobot_planning ? $keyActualM->bobot_planning : $progressActualWeek; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else{ |
|
|
|
|
|
|
|
$progressActualWeek = $progressActualWeek > ($keyActualM->bobot_planning*95)/100 ? ($keyActualM->bobot_planning*95)/100 : $progressActualWeek; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
$dataActivityActual[] = array( |
|
|
|
|
|
|
|
'progressActualDay' => $progressActualWeek, |
|
|
|
|
|
|
|
'qty_act' => $keyActualM->qty_actual, |
|
|
|
|
|
|
|
'bobot_p' => $keyActualM->bobot_planning, |
|
|
|
|
|
|
|
'qty_plan' => $keyActualM->qty_plan, |
|
|
|
|
|
|
|
'status_activity' => $keyActualM->status_activity, |
|
|
|
|
|
|
|
'sum_qty_actual' => $keyActualM->sum_qty_actual, |
|
|
|
|
|
|
|
'name' => $keyActualM->name |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$tmpProgressActualWeek += $progressActualWeek; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$dataActivityPlanDate[] = array( |
|
|
|
|
|
|
|
"date" => $loopDay, |
|
|
|
|
|
|
|
"statusWeek" => new \DateTime($loopDay) == new \DateTime($loopDay . ' Friday') ? true : false, |
|
|
|
|
|
|
|
"activity-plan" => $dataActivityPlan, |
|
|
|
|
|
|
|
"activity-actual" => $dataActivityActual, |
|
|
|
|
|
|
|
"tmpProgressActualWeek" => $tmpProgressActualWeek, |
|
|
|
|
|
|
|
"progressPlanWeek" => $tmpProgressPlanWeek |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$dataFinal[] = array( |
|
|
|
|
|
|
|
// "date" => $dateWeek, |
|
|
|
|
|
|
|
"proyek_name" => $dataProject->nama, |
|
|
|
|
|
|
|
"data" => ["date" => $dateWeek, |
|
|
|
|
|
|
|
"percentagePlan" => $progressPlanKomulatifWeek, |
|
|
|
|
|
|
|
"percentageReal" => $progressActualKomulatifWeek, |
|
|
|
|
|
|
|
"data_details" => $dataActivityPlanDate |
|
|
|
|
|
|
|
] |
|
|
|
|
|
|
|
); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return $dataFinal; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
public function calculateProgressBasedOnSimple($keyGantt) |
|
|
|
public function calculateProgressBasedOnSimple($keyGantt) |
|
|
|
{ |
|
|
|
{ |
|
|
|
DB::enableQueryLog(); |
|
|
|
DB::enableQueryLog(); |
|
|
|