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); } } }