diff --git a/app/Console/Commands/CalculateProgressGantt.php b/app/Console/Commands/CalculateProgressGantt.php index 8e6796f..6db1d41 100644 --- a/app/Console/Commands/CalculateProgressGantt.php +++ b/app/Console/Commands/CalculateProgressGantt.php @@ -2,25 +2,27 @@ namespace App\Console\Commands; +use App\Models\HierarchyFtth; use Illuminate\Console\Command; use App\Helpers\MasterFunctionsHelper; use App\Models\Project; class CalculateProgressGantt extends Command { - protected $signature = 'calculate:progressgantt {project_id}'; + protected $signature = 'calculate:progressgantt {hierarchy_id}'; protected $description = 'Calculate Progress Gantt'; public function handle() { - $project_id = $this->argument('project_id'); - $project = Project::find($project_id); + $hierarchy_id = $this->argument('hierarchy_id'); + $hierarchy = HierarchyFtth::findOrFail($hierarchy_id); + $project = Project::find($hierarchy->project_id); $project->calculation_status = true; $project->save(); - $data = MasterFunctionsHelper::CalculateSCurve($project_id); + $data = MasterFunctionsHelper::CalculateSCurve(null, $hierarchy_id); $project->scurve = json_encode($data); $project->calculation_status = true; diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index a7fceee..726d069 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -14,7 +14,8 @@ class Kernel extends ConsoleKernel */ protected $commands = [ Commands\syncHumanResourceIntegration::class, - Commands\CalculateSCurve::class + Commands\CalculateSCurve::class, + Commands\CalculateProgressGantt::class ]; /** diff --git a/app/Helpers/MasterFunctionsHelper.php b/app/Helpers/MasterFunctionsHelper.php index 2f1770e..dfc4d89 100644 --- a/app/Helpers/MasterFunctionsHelper.php +++ b/app/Helpers/MasterFunctionsHelper.php @@ -1306,10 +1306,19 @@ class MasterFunctionsHelper return $dataFinal; } - public function calculateSCurve($projectId) + public function calculateSCurve($projectId, $hierarchyId = null) { DB::enableQueryLog(); + $hierarchyGantts = []; + if (isset($hierarchyId)) { + $hierarchy = HierarchyFtth::findOrFail($hierarchyId); + $projectId = $hierarchy->project_id; + if (isset($hierarchy)) { + $hierarchyGantts = VersionGantt::where('hierarchy_ftth_id', $hierarchyId)->get()->toArray(); + } + } + $dataFinal = []; $dataPayload = []; $dataPayload['period'] = 'week'; @@ -1371,17 +1380,43 @@ class MasterFunctionsHelper //new \Datetime($dt->format("Y-m-d")); // $minSevenDays = $minSevenDays->modify('-7 day')->format("Y-m-d"); $tempDate[] = array($dt->format("Y-m-d")); + $dataPlanM = []; + $dataActualM = []; + if (count($hierarchyGantts) > 0) { + foreach ($hierarchyGantts as $key => $gantt) { + $dataPlanM[] = DB::table('m_activity') + ->where('type_activity', 'task') + ->where('bobot_planning', '>', 0) + ->where('version_gantt_id', $gantt['id']) + ->whereDate('planned_start', '<=', $loopDay) + ->whereDate('planned_end', '>=', $loopDay) + ->select('name', 'bobot_planning', 'biaya_actual', 'duration', 'persentase_progress', 'id', 'planned_start', 'planned_end') + ->get()->toArray(); + + $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'), + DB::raw('(SELECT COUNT(id) FROM report_activity_material ram WHERE ram.activity_id = ma.id) AS count_report') + ) + ->where('ram.report_date', $loopDay) + ->where('ma.version_gantt_id', $gantt['id']) + ->get()->toArray(); + } + } else { - $dataPlanM = DB::table('m_activity') + $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(); + ->get()->toArray(); - $dataActualM = DB::table('report_activity_material as ram') + $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'), @@ -1391,7 +1426,8 @@ class MasterFunctionsHelper ) ->where('ram.report_date', $loopDay) ->where('ma.proyek_id', $projectId) - ->get(); + ->get()->toArray(); + } $dataActivityPlan = []; $dataActivityActual = []; @@ -1406,14 +1442,15 @@ class MasterFunctionsHelper $dateWeek[] = [$loopDay]; } // $progressPlanKomulatifWeek[] += $tmpProgressPlanWeek; + if (count($dataPlanM) > 0 && count($dataPlanM[0]) > 0) { foreach ($dataPlanM as $keyPlanM) { # hitung untuk persentase progress planning // if($keyPlanM->duration == 0){ // $duration = 2; // Tanggal awal - $startDate = new DateTime($keyPlanM->planned_start); + $startDate = new DateTime($keyPlanM[0]->planned_start); // Tanggal akhir - $endDate = new DateTime($keyPlanM->planned_end); + $endDate = new DateTime($keyPlanM[0]->planned_end); // Menghitung selisih hari $interval = $startDate->diff($endDate); // Mengambil hasil selisih hari @@ -1428,33 +1465,35 @@ class MasterFunctionsHelper // // Mengambil hasil selisih hari // $duration = $interval->days; // 2023-07-26 - $progressPlanWeek = $keyPlanM->bobot_planning / $duration; + $progressPlanWeek = $keyPlanM[0]->bobot_planning / $duration; $dataActivityPlan[] = array( 'progressPlanDay' => $progressPlanWeek, - 'name' => $keyPlanM->name, - 'bobot_p' => $keyPlanM->bobot_planning, - 'duration' => $keyPlanM->duration + 'name' => $keyPlanM[0]->name, + 'bobot_p' => $keyPlanM[0]->bobot_planning, + 'duration' => $keyPlanM[0]->duration ); $tmpProgressPlanWeek += $progressPlanWeek; } + } // hitung progress actual + if (count($dataActualM) > 0 && count($dataActualM[0]) > 0) { 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; // jika total report > dari planning - if($keyActualM->sum_qty_actual > $keyActualM->qty_plan){ - $progressActualWeek = (($keyActualM->qty_actual / $keyActualM->sum_qty_actual) * 100) *$keyActualM->bobot_planning/100; + if($keyActualM[0]->sum_qty_actual > $keyActualM[0]->qty_plan){ + $progressActualWeek = (($keyActualM[0]->qty_actual / $keyActualM[0]->sum_qty_actual) * 100) *$keyActualM[0]->bobot_planning/100; }else{ // jika total report < dari planning // $progressActualWeek = ((($keyActualM->qty_actual / $keyActualM->sum_qty_actual) * 100) / $keyActualM->qty_plan)*$keyActualM->bobot_planning; - if($keyActualM->qty_actual == 0){ + if($keyActualM[0]->qty_actual == 0){ $progressActualWeek = 0; }else{ - $progressActualWeek = ($keyActualM->qty_actual / $keyActualM->qty_plan) * $keyActualM->bobot_planning; + $progressActualWeek = ($keyActualM[0]->qty_actual / $keyActualM[0]->qty_plan) * $keyActualM[0]->bobot_planning; } } - if($keyActualM->status_activity == 'done'){ + if($keyActualM[0]->status_activity == 'done'){ // if($keyActualM->sum_qty_actual > $keyActualM->qty_plan){ // } @@ -1463,7 +1502,7 @@ class MasterFunctionsHelper // }else if($keyActualM->qty_actual == 0){ // $progressActualWeek = $keyActualM->bobot_planning; // }else if($keyActualM->qty_plan == $keyActualM->sum_qty_actual){ - $progressActualWeek = $keyActualM->bobot_planning / $keyActualM->count_report; + $progressActualWeek = $keyActualM[0]->bobot_planning / $keyActualM[0]->count_report; // }else { // $progressActualWeek = $progressActualWeek; // } @@ -1472,20 +1511,21 @@ class MasterFunctionsHelper // contoh ada 3 report, report ke 1 adalah 5 maka 100/3 dan di looping } else{ - $progressActualWeek = $progressActualWeek > ($keyActualM->bobot_planning*95)/100 ? ($keyActualM->bobot_planning*95)/100 : $progressActualWeek; + $progressActualWeek = $progressActualWeek > ($keyActualM[0]->bobot_planning*95)/100 ? ($keyActualM[0]->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 + 'qty_act' => $keyActualM[0]->qty_actual, + 'bobot_p' => $keyActualM[0]->bobot_planning, + 'qty_plan' => $keyActualM[0]->qty_plan, + 'status_activity' => $keyActualM[0]->status_activity, + 'sum_qty_actual' => $keyActualM[0]->sum_qty_actual, + 'name' => $keyActualM[0]->name ); $tmpProgressActualWeek += $progressActualWeek; } + } $dataActivityPlanDate[] = array( "date" => $loopDay, diff --git a/app/Http/Controllers/ActivityController.php b/app/Http/Controllers/ActivityController.php index 610c5fc..cbb425e 100644 --- a/app/Http/Controllers/ActivityController.php +++ b/app/Http/Controllers/ActivityController.php @@ -322,7 +322,7 @@ class ActivityController extends Controller $actualEndValues = array_column(array_filter($dataFinal, function($item) { return isset($item['actual_end']); }), 'actual_end'); - $returnActualStartOrEnd = count($actualEndValues) == count($dataFinal) ? max($actualEndValues) : null; + $returnActualStartOrEnd = count($actualEndValues) == count($dataFinal) && count($actualEndValues) > 0 ? max($actualEndValues) : null; if (isset($parent)) { $parent->actual_end = $returnActualStartOrEnd; $parent->save(); diff --git a/app/Http/Controllers/HierarchyFtthController.php b/app/Http/Controllers/HierarchyFtthController.php index a31c626..c880d6e 100644 --- a/app/Http/Controllers/HierarchyFtthController.php +++ b/app/Http/Controllers/HierarchyFtthController.php @@ -103,7 +103,7 @@ class HierarchyFtthController extends Controller } } - public function countProgress($project_id) { + public function countProgress($hierarchy_id) { // $ftthIds = VersionGantt::select('hierarchy_ftth_id') // ->where('proyek_id', $project_id) // ->groupBy('hierarchy_ftth_id') @@ -136,7 +136,7 @@ class HierarchyFtthController extends Controller // calculate ke curva berdasarkan site Artisan::call('calculate:progressgantt', [ - 'project_id' => $project_id + 'hierarchy_id' => $hierarchy_id ]); } @@ -185,12 +185,11 @@ class HierarchyFtthController extends Controller public function getTreeByProject($project_id) { - $this->countProgress(intval($project_id)); - $data = HierarchyFtth::where('project_id', $project_id)->whereNull('parent_id')->orderByRaw('id ASC')->get(); $finalData = []; foreach($data as $objRow){ $objRow->key = rand(1, 1000); + $this->countProgress(intval($objRow->id)); if (VersionGantt::where('hierarchy_ftth_id', $objRow->id)->exists()) { $dataGantt = VersionGantt::where('hierarchy_ftth_id', $objRow->id)->get(); $progress = $this->ganttProgress('hierarchy_ftth_id', $objRow->id);