From 8b8ee50e45f62387f0fc0113c9446fd623711fef Mon Sep 17 00:00:00 2001 From: wahyuun Date: Tue, 21 Nov 2023 10:01:18 +0700 Subject: [PATCH 1/3] add getSCurveCarausell method --- app/Helpers/MasterFunctionsHelper.php | 29 +++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/app/Helpers/MasterFunctionsHelper.php b/app/Helpers/MasterFunctionsHelper.php index 53f0be8..8448e3c 100644 --- a/app/Helpers/MasterFunctionsHelper.php +++ b/app/Helpers/MasterFunctionsHelper.php @@ -106,6 +106,35 @@ class MasterFunctionsHelper } } } + public static function getSCurveCarausell($request) + { + $allGantt = []; + if (!is_int($request->gantt_id) && !is_int($request->project_id) && !is_int($request->period)) { + if (isset($request->gantt_id)) { + $allGantt[] = $request->gantt_id; + } else { + $allGantt[] = MasterFunctionsHelper::getLatestGantt($request->project_id); + } + } else { + $allGantt[] = MasterFunctionsHelper::getLatestGantt($request->project_id); + } + foreach ($allGantt as $gantt) { + if (!isset($gantt['last_gantt_id'])) { + $ganttId = $gantt; + } else { + $ganttId = $gantt['last_gantt_id']; + } + $gantt = VersionGantt::find($ganttId)->toArray(); + if (isset($gantt['calculation_type'])) { + if ($gantt['calculation_type'] == 'simple') { + // to do + return MasterFunctionsHelper::calculateProgressBasedOnSimple($gantt); + } else { + return MasterFunctionsHelper::calculateProgressBasedOnReportMaterial($gantt); + } + } + } + } public function getLinearSCurve($request) { From 2257469b848174d3e58aa6a8bf32c873ffd503a5 Mon Sep 17 00:00:00 2001 From: wahyuun Date: Tue, 21 Nov 2023 10:02:44 +0700 Subject: [PATCH 2/3] create file --- .../ProjectCarausellController.php | 355 ++++++++++++++++++ 1 file changed, 355 insertions(+) create mode 100644 app/Http/Controllers/ProjectCarausellController.php diff --git a/app/Http/Controllers/ProjectCarausellController.php b/app/Http/Controllers/ProjectCarausellController.php new file mode 100644 index 0000000..7c2eb06 --- /dev/null +++ b/app/Http/Controllers/ProjectCarausellController.php @@ -0,0 +1,355 @@ +startOfDay(); + // $dateEnd = Carbon::now()->endOfDay(); + // // Mengatur waktu awal bulan dan mengurangkan 1 tahun + // $startDate = Carbon::now()->startOfMonth()->subYear()->format('Y-m-d'); + // // Mengatur waktu saat ini dan mengurangkan 1 tahun + // $endDate = Carbon::now()->subYear()->format('Y-m-d'); + + // if(empty($id) || !is_int((int)$id)){ + // return response()->json(['status'=>'failed','message'=>'id is required!','code'=>400], 400); + // } + + // $result = Project::select('id','nama','budget_health','kode_sortname','pm_id','rencana_biaya','company','scurve','calculation_status')->find($id); + // if(!$result){ + // return response()->json(['status'=>'failed','message'=> 'Project not found!','code'=> 404], 404); + // } + // $ganttData = VersionGantt::where('proyek_id', $id) + // ->select('id', 'name_version','hierarchy_ftth_id','cost_to_complete') + // ->get(); + + // // Get Id Gantt & hierarchy_ftth_id + // $gantt_id = $ganttData->pluck('id')->toArray(); + // $hierarchy_ftth_id = $ganttData->pluck('hierarchy_ftth_id')->toArray(); + + // // Heararchy + // $finalData = []; + // if($hierarchy_ftth_id){ + // $ftth = HierarchyFtth::whereIn('id',$hierarchy_ftth_id)->get(); + // if($ftth->first() != null) + // { + // array_push($finalData, $ftth->first()); + // } + // if($ftth->where('parent_id','!=', null)->first()){ + // $this->getParents($finalData, $ftth->pluck('parent_id')->toArray()); + // } + // } else { + // return $finalData; + // } + + // // SCurve + // $SCurve = MasterFunctionsHelper::getSCurveCarausell($result['id'],$gantt_id,'week'); + + // // Overdue Activities + // $endDate = Activity::where('proyek_id', $result['id']) + // ->orderByDesc('end_date') + // ->value('end_date'); + // $overdueActivities = Activity::whereIn('version_gantt_id', $gantt_id)->whereNotNull('parent_id')->where('persentase_progress', '!=', 100)->whereDate('end_date','<=',$endDate)->orderBy('end_date', 'asc')->get(); + + // // Project Comment + // $projectComment = ProjectComment::query() + // ->select('project_id','gantt_id','comment','created_at') + // ->where('project_id',$result['id']) + // ->whereIn('gantt_id',$gantt_id) + // ->get(); + + // // Manpower + // $manCount = UserToProyek::where('proyek_id', $result['id'])->count(); + // // Assigned + // $utAct = UserToActivity::query() + // ->whereIn('version_gantt_id', $gantt_id) + // ->get(); + // // Actual + // $presence = Presence::whereBetween('clock_in', [$dateStart, $dateEnd]) + // ->select('m_users.name','m_users.ktp_number') + // ->join('m_users','t_clock_in_out.user_id','m_users.id') + // ->get(); + + // // Report distribution + // $reportsDistribution = DB::table('assign_material_to_activity as ama') + // ->select('u.name', 'a.name as activity_name', 'ama.qty_planning', 'ram.qty as qty_real','rm.description as material_name', 'rm.uom as material_unit', + // 'ram.lat', 'ram.lon', 'ram.description as report_notes', 'ram.report_date') + // ->join('report_activity_material as ram', 'ram.assign_material_id', '=', 'ama.id') + // ->join('m_req_material as rm', 'rm.id', '=', 'ama.material_id') + // ->join('m_activity as a', 'a.id', '=', 'ama.activity_id') + // ->join('m_users as u', 'u.id', '=', 'ram.user_id') + // ->where('ama.proyek_id', '=', $result['id']) + // ->whereNotNull('ram.lat') + // ->whereBetween('ram.report_date', [$startDate, $startDate]); + + // // Check Existing + // $actualStartExist = Activity::whereIn('version_gantt_id',$gantt_id)->whereNotNull('actual_start')->exists(); + // $actualEndExist = Activity::whereIn('version_gantt_id',$gantt_id)->exists(); + + // $query = Activity::query()->whereIn('version_gantt_id', $gantt_id); + // // Start + // if ($actualStartExist) { + // $startDate = $query->select('version_gantt_id',DB::raw('MIN(start_date) as min_start')) + // ->groupBy('version_gantt_id') + // ->get(); + // } else { + // $startDate = $query->select('version_gantt_id',DB::raw('MIN(start_date) as min_start','version_gantt_id')) + // ->groupBy('version_gantt_id') + // ->orderBy('min_start', 'ASC') + // ->get(); + // } + // // End + // if($actualEndExist) + // { + // $maxIds = $query->selectRaw('MAX(id) as max_id') + // ->groupBy('version_gantt_id') + // ->pluck('max_id', 'version_gantt_id'); + + // $endDate = Activity::whereIn('id', $maxIds)->select('end_date','version_gantt_id')->get(); + // } + + // $plannedStart = $query->selectRaw('MIN(planned_start) as min_planned_start, version_gantt_id') + // ->groupBy('version_gantt_id') + // ->orderBy('min_planned_start') + // ->get(); + // $plannedEnd = $query->selectRaw('MAX(planned_end) as max_planned_end, version_gantt_id') + // ->groupBy('version_gantt_id') + // ->orderByDesc('max_planned_end') + // ->get(); + + // $projectManager = User::whereId($result['pm_id'])->value('name'); + // $key =1; + // foreach($ganttData as $gantt) + // { + // $pStart =$plannedStart->where('version_gantt_id',$gantt['id'])->first(); + // $actStart =$startDate->where('version_gantt_id',$gantt['id'])->first(); + // $actEnd =$endDate->where('version_gantt_id',$gantt['id'])->first(); + // $pEnd =$plannedEnd->where('version_gantt_id',$gantt['id'])->first(); + // $matchingActivities = $overdueActivities->where('version_gantt_id', $gantt['id']); + // $matchingProjectComment = $projectComment->where('version_gantt_id', $gantt['id']); + // $usAtc = $utAct->where('version_gantt_id', $gantt['id']); + // $arr[] = + // [ + // 'gantt_id'=>$gantt['id'], + // 'projectManager'=>$projectManager, + // 'name_version'=>$gantt['name_version'], + // 'cost_to_complete'=>$gantt['cost_to_complete'], + // 'schedule' => [ + // 'plannedStart'=> $pStart['min_planned_start'], + // 'actual_start'=>$actStart['min_start'], + // 'plannedFinish'=>$pEnd['max_planned_end'], + // 'estimatedFinish'=>$actEnd['end_date'] + // ], + // 'manpower'=>$manCount, + // 'assigned'=>$usAtc->toArray(), + // 'actual'=>count($presence->toArray()), + // 'overdue_activities'=>$matchingActivities->toArray(), + // 'project_comment'=>$matchingProjectComment->toArray(), + // 'hierarchy'=>$finalData, + // 'proyek'=>$result, + // 'key'=>$key++ + // ]; + // } + // return response()->json(['status'=>'success','code'=> 200,'data'=>$arr,'report_distribution'=>$reportsDistribution,'sCurve'=>$SCurve, 'count'=>count($arr)], 200); + // } + + // public function getParents(&$data, $id){ + // $ftth = HierarchyFtth::whereIn('id',$id)->get(); + // array_push($data, $ftth); + // if ($ftth->pluck('parent_id')->toArray()) { + // $this->getParents($data, $ftth->pluck('parent_id')->toArray()); + // } + // } + + public function invoke() + { + // Data Master + // Mengatur waktu awal bulan dan mengurangkan 1 tahun + $startDate = Carbon::now()->startOfMonth()->subYear()->format('Y-m-d'); + // Mengatur waktu saat ini dan mengurangkan 1 tahun + $endDate = Carbon::now()->subYear()->format('Y-m-d'); + $ganttData = VersionGantt::query() + ->select('id', 'name_version','hierarchy_ftth_id','cost_to_complete','proyek_id') + ->get(); + $projectData = Project::query() + ->select("id","nama","kode_sortname","pm_id","budget_health","calculation_status","mulai_proyek","akhir_proyek","rencana_biaya","company","scurve") + ->get(); + // nested looping + $arr = []; + foreach($projectData as $project) { + $ganttForProject = []; + foreach ($ganttData as $gantt) { + if ($gantt['proyek_id'] === $project['id']) { + // Gantt + $ganttForProject[] = [ + "gantt_id" => $gantt['id'], + 'proyek_id' => $gantt['proyek_id'], + "name_version" => $gantt['name_version'], + "hierarchy_ftth_id" => $gantt['hierarchy_ftth_id'], + "cost_to_complete" => $gantt['cost_to_complete'], + ]; + // Activity + $activity = Activity::query() + ->select('id','name','proyek_id','version_gantt_id','type_activity','parent_id','kode_sortname','rencana_biaya','start_date','end_date','biaya_actual','persentase_bobot','persentase_progress','planned_start','planned_end','actual_start','actual_end') + ->whereNull('parent_id') + ->where([ + ["proyek_id", $project['id']], + ["version_gantt_id", $gantt['id']] + ]) + ->first(); + $actualStartExist = Activity::query() + ->where('version_gantt_id', $gantt['id']) + ->whereNotNull('actual_start') + ->exists(); + $actualEndExist = Activity::query() + ->where('version_gantt_id', $gantt['id']) + ->exists(); + $query = Activity::where('version_gantt_id', $gantt['id']); + + if ($actualStartExist) { + $startDate = $query->orderBy('actual_start')->value('start_date'); + } else { + $startDate = $query->orderBy('start_date')->value('start_date'); + } + if($actualEndExist) + { + $maxEndDate = $query->max('id'); + $endDate = $query->where('id',$maxEndDate)->first()->end_date; + } + + $plannedStart = Activity::where('version_gantt_id', $gantt['id']) + ->orderBy('planned_start') + ->value('planned_start'); + $plannedEnd = Activity::where('version_gantt_id', $gantt['id']) + ->orderByDesc('planned_end') + ->value('planned_end'); + + // SCurve + $req = (object)[ + 'project_id' => $project['id'], + 'gantt_id' => $gantt['id'], + 'period' => 'week', + ]; + $SCurve = MasterFunctionsHelper::getSCurveCarausell($req); + + // Overdue + $endDate = Activity::where('proyek_id', $project['id']) + ->orderByDesc('end_date') + ->value('end_date'); + $overdueActivities = Activity::query() + ->where([ + ['version_gantt_id', $gantt['id']], + ['persentase_progress', '!=', 100] + ]) + ->whereNotNull('parent_id') + ->whereDate('end_date','<=',$endDate) + ->orderBy('end_date', 'asc') + ->get(); + + // Manpower + $manCount = UserToProyek::where('proyek_id', $project['id'])->count(); + // Assigned + $assigned = UserToActivity::query() + ->select('assign_hr_to_activity.proyek_id', 'assign_hr_to_activity.user_id', 'm_activity.id', 'm_activity.name', 'm_activity.start_date', 'm_activity.end_date') + ->join('m_activity', 'm_activity.id', '=', 'assign_hr_to_activity.activity_id') + ->where('assign_hr_to_activity.version_gantt_id', $gantt['id']) + ->get(); + // Project Comment + $projectComment = ProjectComment::query() + ->select('m_users.name','m_users.username','m_project_comment.project_id','m_project_comment.gantt_id','m_project_comment.comment','m_project_comment.created_at') + ->join('m_users','m_project_comment.sender_id','m_users.id') + ->where([ + ['project_id',$project['id']], + ['gantt_id',$gantt['id']] + ]) + ->get(); + // Hierarchy + $finalData = []; + $ganttHierarchy = VersionGantt::find($gantt['id']); + if ($ganttHierarchy->hierarchy_ftth_id) { + $ftth = HierarchyFtth::find($ganttHierarchy->hierarchy_ftth_id); + array_push($finalData, $ftth); + if($ftth->parent_id){ + $this->getParents($finalData, $ftth->parent_id); + } + }else{ + $finalData = $finalData; + } + + $reports = DB::table('assign_material_to_activity as ama') + ->select('u.name', 'a.name as activity_name', 'ama.qty_planning', 'ram.qty as qty_real','rm.description as material_name', 'rm.uom as material_unit', + 'ram.lat', 'ram.lon', 'ram.description as report_notes', 'ram.report_date') + ->join('report_activity_material as ram', 'ram.assign_material_id', '=', 'ama.id') + ->join('m_req_material as rm', 'rm.id', '=', 'ama.material_id') + ->join('m_activity as a', 'a.id', '=', 'ama.activity_id') + ->join('m_users as u', 'u.id', '=', 'ram.user_id') + ->where('ama.proyek_id', '=', $project['id']) + ->whereNotNull('ram.lat') + ->whereBetween('ram.report_date', [$startDate, $endDate]); + } + } + + $projectManager = User::where('id', $project['pm_id'])->value('name'); + + $arr[]= [ + "project"=> [ + "id"=>$project['id'], + "pm_id"=>$project['pm_id'], + "nama"=>$project['nama'], + "kode_sortname"=>$project['kode_sortname'], + "budget_health"=>$project['budget_health'], + "calculation_status"=>$project['calculation_status'], + "mulai_proyek"=>$project['mulai_proyek'], + "akhir_proyek"=>$project['akhir_proyek'], + "rencana_biaya"=>$project['rencana_biaya'], + "company"=>$project['company'], + "scurve"=>$project['scurve'], + "gantt"=>$ganttForProject + ], + "hierarchy"=>$finalData, + "manpower"=>$manCount, + "assigned"=>$assigned, + "actual"=>0, + "project_comment"=>$projectComment, + "project_manager"=> $projectManager, + "activity" => [ + "data" => $activity, + "start_date"=>$startDate, + "end_date"=>$endDate, + "planned_start"=>$plannedStart, + "planned_end"=>$plannedEnd + ], + "report_distribution"=>$reports, + "overdueActivities"=>$overdueActivities, + "SCurve"=>$SCurve + ]; + } + return response()->json(['status'=>'success','code'=> 200,'data'=>$arr, "count"=>count($arr)], 200); + } + + public function getParents(&$data, $id){ + $ftth = HierarchyFtth::find($id); + array_push($data, $ftth); + if ($ftth->parent_id) { + $this->getParents($data, $ftth->parent_id); + } + } +} From 08a37beeb8b8b30bfeee86f5f4a1edf9e86cb25a Mon Sep 17 00:00:00 2001 From: wahyuun Date: Tue, 21 Nov 2023 10:03:24 +0700 Subject: [PATCH 3/3] create endpoint --- routes/web.php | 1 + 1 file changed, 1 insertion(+) diff --git a/routes/web.php b/routes/web.php index f9e79b4..816c9cf 100644 --- a/routes/web.php +++ b/routes/web.php @@ -79,6 +79,7 @@ $router->group(['prefix'=>'api', 'middleware' => 'cors'], function () use ($rout /* $router->get('/project/get-status-health-schedule/{id}', 'ProjectController@getStatusSchedule'); */ /* $router->get('/project/get-status-health-budget/{id}', 'ProjectController@getStatusBudget'); */ + $router->get('/project-carausell','ProjectCarausellController@invoke'); $router->post('/project-charter/search', 'ProjectCharterController@search'); $router->post('/project-charter/add', 'ProjectCharterController@add');