json($hierarchyFtths); } catch (\Exception $e) { return response()->json([ 'message' => 'Failed to retrieve hierarchy FTTHs.', 'error' => $e->getMessage() ], 500); } } public function search(Request $request) { $payload = $request->all(); $dataBuilder = $this->setUpPayload($payload, 'm_hierarchy_ftth'); $builder = $dataBuilder['builder']; $countBuilder = $dataBuilder['count']; $dataGet = $builder->get(); $totalRecord = $countBuilder->count(); return response()->json(['status'=>'success','code'=>200,'data'=>$dataGet, 'totalRecord'=>$totalRecord], 200); } public function store(Request $request) { try { $attributes = $request->only(['name', 'parent_id', 'project_id']); $hierarchyFtth = HierarchyFtth::create($attributes); return response()->json([ 'status'=>'success', 'code' => 200, 'message' => 'Hierarchy FTTH created successfully.', 'data' => $hierarchyFtth ],200); } catch (\Exception $e) { return response()->json([ 'message' => 'Failed to create hierarchy FTTH.', 'error' => $e->getMessage() ], 500); } } public function show($id) { $hierarchyFtth = HierarchyFtth::where('id', $id)->first(); try { return response()->json($hierarchyFtth); } catch (\Exception $e) { return response()->json([ 'message' => 'Failed to retrieve hierarchy FTTH.', 'error' => $e->getMessage() ], 500); } } public function update(Request $request, $id) { $hierarchyFtth = HierarchyFtth::where('id', $id)->first(); try { $hierarchyFtth->update($request->all()); return response()->json([ 'message' => 'Hierarchy FTTH updated successfully.', 'data' => $hierarchyFtth ],200); } catch (\Exception $e) { return response()->json([ 'message' => 'Failed to update hierarchy FTTH.', 'error' => $e->getMessage() ], 500); } } public function destroy($id) { $hierarchyFtth = HierarchyFtth::where('id', $id)->first(); try { $hierarchyFtth->delete(); return response()->json([ 'message' => 'Hierarchy FTTH deleted successfully.', 'data' => $hierarchyFtth ],200); } catch (\Exception $e) { return response()->json([ 'message' => 'Failed to delete hierarchy FTTH.', 'error' => $e->getMessage() ], 500); } } public function countProgress($project_id) { $ftthIds = VersionGantt::select('hierarchy_ftth_id') ->where('proyek_id', $project_id) ->groupBy('hierarchy_ftth_id') ->get(); if($ftthIds){ foreach ($ftthIds as $ftthId) { $gantts = VersionGantt::where('hierarchy_ftth_id', $ftthId->hierarchy_ftth_id)->sum('progress'); $ganttCount = VersionGantt::where('hierarchy_ftth_id', $ftthId->hierarchy_ftth_id)->count(); $ftth = HierarchyFtth::find($ftthId->hierarchy_ftth_id); if($ftth){ $round = $gantts/$ganttCount; $ftth->progress = round($round, 2); try { $ftth->save(); } catch (\Exception $e) { // Log the error or handle it in some other way Log::error($e->getMessage()); } if($ftth->parent_id){ $this->countParent($ftth); } } } } } public function countParent($ftth){ $parent = HierarchyFtth::find($ftth->parent_id); $children = HierarchyFtth::where('parent_id', $ftth->parent_id)->sum('progress'); $childrenCount = HierarchyFtth::where('parent_id', $ftth->parent_id)->count(); if($parent){ $round = $children/$childrenCount; $parent->progress = round($round, 2); try { $parent->save(); } catch (\Exception $e) { // Log the error or handle it in some other way Log::error($e->getMessage()); } if($parent->parent_id) { $this->countParent($parent); } } } 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); 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); foreach ($dataGantt as $gantt) { $gantt->key = $objRow->key; foreach ($progress as $p) { if ($p->id == $gantt->id) { $gantt->progress = $p->persentase_progress; } } } $objRow->dataGantt = $dataGantt; } $objRow->children = $this->getChildren($project_id, $objRow->id); $finalData[] = $objRow; } return response()->json(['status'=>'success','data'=>$finalData,'code'=>200], 200); } private function getChildren($project_id, $parent_id) { $finalData = []; $data = HierarchyFtth::where('project_id', $project_id)->where('parent_id', $parent_id)->orderByRaw('id ASC')->get(); foreach($data as $objRow){ $objRow->key = rand(1, 1000); 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); foreach ($dataGantt as $gantt) { $gantt->key = $objRow->key; foreach ($progress as $p) { if ($p->id == $gantt->id) { $gantt->progress = $p->persentase_progress; } } } $objRow->dataGantt = $dataGantt; } $objRow->children = $this->getChildren($project_id, $objRow->id); $finalData[] = $objRow; } return $finalData; } public function ganttProgress($column, $value){ $progress = VersionGantt::select('m_version_gantt.id','m_activity.persentase_progress') ->join('m_activity', 'm_version_gantt.id', '=', 'm_activity.version_gantt_id') ->where("m_version_gantt.".$column, $value) ->where('m_activity.type_activity', "project") ->where('m_activity.parent_id', null) ->get(); return $progress; } }