From 6dc3ab828a798609e216d412911adb5c1b8c1afa Mon Sep 17 00:00:00 2001 From: ibnu Date: Sun, 3 Dec 2023 08:37:50 +0700 Subject: [PATCH] update for duration +1 --- app/Helpers/MasterFunctionsHelper.php | 177 +++++++++++++++++++++++++- 1 file changed, 176 insertions(+), 1 deletion(-) diff --git a/app/Helpers/MasterFunctionsHelper.php b/app/Helpers/MasterFunctionsHelper.php index a507ec2..99196e7 100644 --- a/app/Helpers/MasterFunctionsHelper.php +++ b/app/Helpers/MasterFunctionsHelper.php @@ -565,6 +565,8 @@ class MasterFunctionsHelper # hitung untuk persentase progress planning if($keyPlanM->duration == 0){ $duration = 2; + }else{ + $duration = $keyPlanM->duration + 1; } // $startPlan = new DateTime($keyPlanM->planned_start); // $endPlan = new DateTime($keyPlanM->planned_end); @@ -950,7 +952,7 @@ class MasterFunctionsHelper return $dataFinal; } - public function calculateSCurve($projectId) + public function calculateSCurveOld($projectId) { DB::enableQueryLog(); @@ -1289,6 +1291,179 @@ class MasterFunctionsHelper 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) { DB::enableQueryLog();