From 1a02dd2d03dea20092536068fc0dded0f14ab505 Mon Sep 17 00:00:00 2001 From: wahyu Date: Tue, 26 Sep 2023 13:54:21 +0700 Subject: [PATCH 1/8] add status filter --- app/Http/Controllers/UserToActivityController.php | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/app/Http/Controllers/UserToActivityController.php b/app/Http/Controllers/UserToActivityController.php index 5951aa6..c422cf6 100644 --- a/app/Http/Controllers/UserToActivityController.php +++ b/app/Http/Controllers/UserToActivityController.php @@ -5,6 +5,7 @@ namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\UserToActivity; use App\Models\Activity; +use App\Models\AssignMaterial; use Datatables; class UserToActivityController extends Controller @@ -140,6 +141,7 @@ class UserToActivityController extends Controller if (isset($join_column)) { $startDate = $join_column['start_date']; $endDate = $join_column['end_date']; + $status = $join_column['status']; $startDate = date("Y-m-d H:i:sO", strtotime($startDate)); $endDate = date("Y-m-d H:i:sO", strtotime($endDate)); $builder->where(function ($query) use ($startDate, $endDate) { @@ -154,6 +156,16 @@ class UserToActivityController extends Controller }); } $dataGet = $builder->get(); + if (isset($status) && $status != "") { + $filteredData = []; + foreach ($dataGet as $value) { + $assignMaterial = AssignMaterial::where('activity_id', $value->activity_id)->first(); + if ($assignMaterial->status_activity == $status) { + $filteredData[] = $value; + } + } + $dataGet = $filteredData; + } $totalRecord = $countBuilder->count(); return response()->json(['status'=>'success','code'=>200,'data'=>$dataGet, 'totalRecord'=>$totalRecord], 200); } From ab1842f5c632f2b524138ab63fa08f1f5c44b125 Mon Sep 17 00:00:00 2001 From: wahyu Date: Wed, 27 Sep 2023 09:31:18 +0700 Subject: [PATCH 2/8] add filter project id --- app/Http/Controllers/PresenceController.php | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/app/Http/Controllers/PresenceController.php b/app/Http/Controllers/PresenceController.php index 0d79917..f5309ac 100644 --- a/app/Http/Controllers/PresenceController.php +++ b/app/Http/Controllers/PresenceController.php @@ -259,13 +259,17 @@ class PresenceController extends Controller // geom ada di table activity // $clock_time = $user = HumanResource::find($params->user_id); - $geom = DB::table("assign_hr_to_activity as ahta")->select("ma.geom", "ma.id") - ->join("m_activity as ma", "ma.id", "=", "ahta.activity_id") - ->where("ahta.user_id", $params->user_id) - ->whereNotNull("ma.geom") - ->whereDate("ma.start_date", "<=", $params->time) - ->whereDate("ma.end_date", ">=", $params->time) - ->get(); + $geomQuery = DB::table("assign_hr_to_activity as ahta")->select("ma.geom", "ma.id") + ->join("m_activity as ma", "ma.id", "=", "ahta.activity_id") + ->where("ahta.user_id", $params->user_id) + ->whereNotNull("ma.geom") + ->whereDate("ma.start_date", "<=", $params->time) + ->whereDate("ma.end_date", ">=", $params->time); + if (isset($params->report_k3['proyek_id'])) { + $geom = $geomQuery->where("ma.proyek_id", $params->report_k3['proyek_id'])->get(); + } else { + $geom = $geomQuery->get(); + } $temp = []; if (count($geom) > 0) { foreach($geom as $dataGeom){ From c422bade05f132ae292668d9858a3f17407cbc76 Mon Sep 17 00:00:00 2001 From: wahyu Date: Wed, 27 Sep 2023 14:15:42 +0700 Subject: [PATCH 3/8] fix work area restriction --- app/Http/Controllers/PresenceController.php | 28 ++++++++++++++++----- 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/app/Http/Controllers/PresenceController.php b/app/Http/Controllers/PresenceController.php index f5309ac..49b9da1 100644 --- a/app/Http/Controllers/PresenceController.php +++ b/app/Http/Controllers/PresenceController.php @@ -345,6 +345,13 @@ class PresenceController extends Controller "status_assign" => true ); } + } else { + // bypass work area restriction + $temp[]=array( + "activity_id" => null, + "boundary" => true, + "status_assign" => true + ); } } // assign and not in boundary @@ -359,12 +366,21 @@ class PresenceController extends Controller } } else{ - // not assign - $temp[]=array( - "activity_id" => null, - "boundary" => false, - "status_assign" => false - ); + if ($user->status_boundary) { + // bypass work area restriction + $temp[]=array( + "activity_id" => null, + "boundary" => true, + "status_assign" => true + ); + } else { + // not assign + $temp[]=array( + "activity_id" => null, + "boundary" => false, + "status_assign" => false + ); + } } return $temp; } From 53cb5d59f97b2e61ec64ee59c7e72ff6efcd251d Mon Sep 17 00:00:00 2001 From: wahyu Date: Mon, 2 Oct 2023 08:34:23 +0700 Subject: [PATCH 4/8] handling string --- app/Http/Controllers/ActivityController.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Http/Controllers/ActivityController.php b/app/Http/Controllers/ActivityController.php index b8af8d4..b04972d 100644 --- a/app/Http/Controllers/ActivityController.php +++ b/app/Http/Controllers/ActivityController.php @@ -428,6 +428,7 @@ class ActivityController extends Controller $activityToUpdate = $activity->firstWhere('id', $entity['data']['id']); $entity['data']['name'] = $entity['data']['text']; $entity['data']['persentase_progress'] = $entity['data']['progress'] * 100; + $entity['data']['rencana_biaya'] = str_replace(",", ".", $entity['data']['rencana_biaya']); if (isset($entity['data']['target'])) { $this->updateOrder($entity['data']['id'], $entity['data']['target']); } From 4f3f4aa71db897e7d6018c14fa2a30a100526058 Mon Sep 17 00:00:00 2001 From: wahyu Date: Fri, 6 Oct 2023 09:33:37 +0700 Subject: [PATCH 5/8] fix sync report --- app/Http/Controllers/ProjectController.php | 44 +++++++++++++--------- 1 file changed, 27 insertions(+), 17 deletions(-) diff --git a/app/Http/Controllers/ProjectController.php b/app/Http/Controllers/ProjectController.php index aee3fe3..7f5c8f9 100644 --- a/app/Http/Controllers/ProjectController.php +++ b/app/Http/Controllers/ProjectController.php @@ -416,17 +416,21 @@ class ProjectController extends Controller $firstReport = ReportActivityMaterial::where('activity_id', $activity_id)->orderBy('report_date')->first(); $reports[] = ProjectController::setSyncDate($activity_id, $activity, $firstReport); } + $successor = Link::where('t_activity_id', $activity->id)->first(); + if ($successor) { + $predecessor = Activity::find($successor->s_activity_id); + $activity->start_date = $predecessor->end_date; + $end_date = new DateTime($activity->start_date); + $end_date->modify("+" . $activity->duration . " days"); + $activity->end_date = $end_date->format("Y-m-d H:i:sO"); + } + $activity->save(); } /* return response()->json(['status'=>'success','data'=> $reports,'code'=>200], 200); */ /* return response()->json(['status'=>'success','data'=> $activities,'code'=>200], 200); */ for ($i=0; $i < count($reports); $i++) { $activity = Activity::find($reports[$i]['activity_id']); - $successor = Link::where('t_activity_id', $activity->id)->first(); - if ($successor) { - $predecessor = Activity::find($successor->s_activity_id); - $activity->start_date = $predecessor->end_date; - } if($reports[$i]['status'] != 'done'){ $reports[$i]['max_date']->modify('-1 day'); }else if($reports[$i]['status'] == 'done'){ @@ -434,19 +438,25 @@ class ProjectController extends Controller } $activity->start_date = $reports[$i]['min_date']; //same early $activity->end_date = $reports[$i]['max_date']->setTime(23,59,59); // same early - $activity->actual_start = $reports[$i]['min_date']; - $activity->save(); - } - - foreach($activities as $activity) { - $successor = Link::where('t_activity_id', $activity->id)->first(); - if ($successor) { - $predecessor = Activity::find($successor->s_activity_id); - $activity->start_date = $predecessor->end_date; - $end_date = new DateTime($activity->start_date); - $end_date->modify("+" . $activity->duration . " days"); - $activity->end_date = $end_date->format("Y-m-d H:i:sO"); + $dayOffs = VersionGantt::where('id', $activity->version_gantt_id)->first()->config_dayoff; + $startDate = new DateTime($activity->start_date); + $endDate = new DateTime($activity->end_date); + $diff = date_diff($startDate, $endDate); + $duration = $diff->days + 1; + $daysRemaining = $duration; + // Loop until the remaining days become zero + while ($daysRemaining > 0) { + $endDate->modify('-1 day'); + // Check if the current day is a day off (Sunday or Saturday) + $currentDayOfWeek = (int) $endDate->format('w'); + if (strpos($dayOffs, (string) $currentDayOfWeek) !== false) { + // continue; // Skip the day off and continue to the next day + $duration--; + } + $daysRemaining--; // Decrease the remaining days by one } + $activity->duration = $duration; + $activity->actual_start = $reports[$i]['min_date']; $activity->save(); } From 3252a98090820c01b7b72d7a9aef669dfdb73b78 Mon Sep 17 00:00:00 2001 From: wahyu Date: Fri, 6 Oct 2023 14:06:25 +0700 Subject: [PATCH 6/8] cek rencana biaya --- app/Http/Controllers/ActivityController.php | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/ActivityController.php b/app/Http/Controllers/ActivityController.php index b04972d..1b43a3e 100644 --- a/app/Http/Controllers/ActivityController.php +++ b/app/Http/Controllers/ActivityController.php @@ -428,7 +428,9 @@ class ActivityController extends Controller $activityToUpdate = $activity->firstWhere('id', $entity['data']['id']); $entity['data']['name'] = $entity['data']['text']; $entity['data']['persentase_progress'] = $entity['data']['progress'] * 100; - $entity['data']['rencana_biaya'] = str_replace(",", ".", $entity['data']['rencana_biaya']); + if (isset($entity['data']['rencana_biaya'])) { + $entity['data']['rencana_biaya'] = str_replace(",", ".", $entity['data']['rencana_biaya']); + } if (isset($entity['data']['target'])) { $this->updateOrder($entity['data']['id'], $entity['data']['target']); } From 6b74bf5852107092504dddd87b3c67ee6c2cc7fd Mon Sep 17 00:00:00 2001 From: wahyu Date: Mon, 9 Oct 2023 09:02:52 +0700 Subject: [PATCH 7/8] fix endline --- app/Models/UserToActivity.php | 122 +++++++++++++++++----------------- 1 file changed, 61 insertions(+), 61 deletions(-) diff --git a/app/Models/UserToActivity.php b/app/Models/UserToActivity.php index a33667c..76f948a 100644 --- a/app/Models/UserToActivity.php +++ b/app/Models/UserToActivity.php @@ -1,61 +1,61 @@ -activity_id); - $getWorkingHours = UserToProyek::where('user_id', $data->user_id)->where('proyek_id', $activity->proyek_id)->first(); - - $salary = ($getWorkingHours->standart_rate * $activity->duration) * ($getWorkingHours->max_used / 100); - - if($getWorkingHours->uom_standart_rate == "Hour") - $salary = ($getWorkingHours->standart_rate * 8) * $activity->duration * ($getWorkingHours->max_used / 100); - - $activity->rencana_biaya += $salary; - $activity->save(); - }); - - static::deleted(function($data) { - $activity = Activity::find($data->activity_id); - - $getWorkingHours = UserToProyek::where('user_id', $data->user_id)->where('proyek_id', $activity->proyek_id)->first(); - $salary = ($getWorkingHours->standart_rate * $activity->duration) * ($getWorkingHours->max_used / 100); - if($getWorkingHours->uom_standart_rate == "Hour"){ - $salary = ($getWorkingHours->standart_rate * 8) * $activity->duration * ($getWorkingHours->max_used / 100); - } - - $activity->rencana_biaya -= $salary; - if ($activity->rencana_biaya < 0) { - $activity->rencana_biaya = 0; - } - $activity->save(); - }); - - } - -} +activity_id); + $getWorkingHours = UserToProyek::where('user_id', $data->user_id)->where('proyek_id', $activity->proyek_id)->first(); + + $salary = ($getWorkingHours->standart_rate * $activity->duration) * ($getWorkingHours->max_used / 100); + + if($getWorkingHours->uom_standart_rate == "Hour") + $salary = ($getWorkingHours->standart_rate * 8) * $activity->duration * ($getWorkingHours->max_used / 100); + + $activity->rencana_biaya += $salary; + $activity->save(); + }); + + static::deleted(function($data) { + $activity = Activity::find($data->activity_id); + + $getWorkingHours = UserToProyek::where('user_id', $data->user_id)->where('proyek_id', $activity->proyek_id)->first(); + $salary = ($getWorkingHours->standart_rate * $activity->duration) * ($getWorkingHours->max_used / 100); + if($getWorkingHours->uom_standart_rate == "Hour"){ + $salary = ($getWorkingHours->standart_rate * 8) * $activity->duration * ($getWorkingHours->max_used / 100); + } + + $activity->rencana_biaya -= $salary; + if ($activity->rencana_biaya < 0) { + $activity->rencana_biaya = 0; + } + $activity->save(); + }); + + } + +} From 1bb91826ae8976eafb790058690ff5fa418850e3 Mon Sep 17 00:00:00 2001 From: wahyu Date: Mon, 9 Oct 2023 14:30:41 +0700 Subject: [PATCH 8/8] countDays, schedule, hr date --- app/Helpers/MasterFunctionsHelper.php | 20 ++++++++++ app/Http/Controllers/ActivityController.php | 40 +++++++++++++++++-- app/Http/Controllers/ProjectController.php | 16 +------- .../Controllers/UserToActivityController.php | 10 +++-- app/Models/UserToActivity.php | 2 + routes/web.php | 1 + 6 files changed, 67 insertions(+), 22 deletions(-) diff --git a/app/Helpers/MasterFunctionsHelper.php b/app/Helpers/MasterFunctionsHelper.php index 706d734..d681c40 100644 --- a/app/Helpers/MasterFunctionsHelper.php +++ b/app/Helpers/MasterFunctionsHelper.php @@ -36,6 +36,26 @@ class MasterFunctionsHelper return json_decode($output); } + public static function countDays($ganttId, $start, $end){ + $dayOffs = VersionGantt::where('id', $ganttId)->first()->config_dayoff; + $diff = date_diff($start, $end); + $endCount = clone $end; + $duration = $diff->days + 1; + $daysRemaining = $duration; + // Loop until the remaining days become zero + while ($daysRemaining > 0) { + $endCount->modify('-1 day'); + // Check if the current day is a day off (Sunday or Saturday) + $currentDayOfWeek = (int) $endCount->format('w'); + if (strpos($dayOffs, (string) $currentDayOfWeek) !== false) { + // continue; // Skip the day off and continue to the next day + $duration--; + } + $daysRemaining--; // Decrease the remaining days by one + } + return $duration; + } + public function getLatestGantt($id) { $maxGanttId = VersionGantt::where("proyek_id", $id)->max("id"); diff --git a/app/Http/Controllers/ActivityController.php b/app/Http/Controllers/ActivityController.php index 1b43a3e..a516e9e 100644 --- a/app/Http/Controllers/ActivityController.php +++ b/app/Http/Controllers/ActivityController.php @@ -1,6 +1,7 @@ json(['status' => 'success', 'message' => 'Activity Updated!', 'code' => 200], 200); } + public function updateSchedule($ganttId){ + if (empty($ganttId) || !is_int((int) $ganttId)) + return response()->json(['status' => 'failed', 'message' => 'id is required!', 'code' => 400], 400); + + $activities = Activity::where('version_gantt_id', $ganttId)->get(); + if (!$activities) + return response()->json(['status' => 'failed', 'message' => 'Activities not found!', 'code' => 404], 404); + $duration = 0; + foreach ($activities as $key => $activity) { + if (isset($activity->planned_start) && isset($activity->planned_end)) { + $today = new DateTime(); + $endDate = new DateTime($activity->end_date); + $startDate = new DateTime($activity->start_date); + $plannedStart = new DateTime($activity->planned_start); + $plannedEnd = new DateTime($activity->planned_end); + $duration = MasterFunctionsHelper::countDays($ganttId, $plannedStart, $plannedEnd); + if ($today >= $endDate) { + $endDate = $today; + $rerataBobot = $activity->bobot_planning / $duration; + $bobotActual = $activity->progress * $activity->bobot_planning; + $sisaBobot = $activity->bobot_planning - $bobotActual; + $sisaHari = $sisaBobot / $rerataBobot; + $endDate->modify("+".$sisaHari." Days"); + $actualDuration = MasterFunctionsHelper::countDays($ganttId, $startDate, $endDate); + $activity->duration = $actualDuration; + $activity->end_date = $endDate; + $activity->save(); + } + } + } + return response()->json(['status' => 'success', 'message' => 'Activities Updated!', 'code' => 200], 200); + } + public function batchUpdate(Request $request, $ganttId) { $entities = $request->all(); @@ -434,12 +468,12 @@ class ActivityController extends Controller if (isset($entity['data']['target'])) { $this->updateOrder($entity['data']['id'], $entity['data']['target']); } - if(!$activityToUpdate->update($entity['data'])) + if (!$activityToUpdate->update($entity['data'])) return response()->json(['status' => 'failed', 'message' => 'Failed to update activity !', 'code' => 500], 500); $updatedJobsDone = $activityToUpdate->jobs_done; - } else if ($entity['entity'] == "link"){ + } else if ($entity['entity'] == "link") { $linkToUpdate = $link->firstWhere('id', $entity['data']['id']); - if(!$linkToUpdate->update($entity['data'])) + if (!$linkToUpdate->update($entity['data'])) return response()->json(['status' => 'failed', 'message' => 'Failed to update link !', 'code' => 500], 500); } } diff --git a/app/Http/Controllers/ProjectController.php b/app/Http/Controllers/ProjectController.php index 7f5c8f9..75ecec4 100644 --- a/app/Http/Controllers/ProjectController.php +++ b/app/Http/Controllers/ProjectController.php @@ -438,23 +438,9 @@ class ProjectController extends Controller } $activity->start_date = $reports[$i]['min_date']; //same early $activity->end_date = $reports[$i]['max_date']->setTime(23,59,59); // same early - $dayOffs = VersionGantt::where('id', $activity->version_gantt_id)->first()->config_dayoff; $startDate = new DateTime($activity->start_date); $endDate = new DateTime($activity->end_date); - $diff = date_diff($startDate, $endDate); - $duration = $diff->days + 1; - $daysRemaining = $duration; - // Loop until the remaining days become zero - while ($daysRemaining > 0) { - $endDate->modify('-1 day'); - // Check if the current day is a day off (Sunday or Saturday) - $currentDayOfWeek = (int) $endDate->format('w'); - if (strpos($dayOffs, (string) $currentDayOfWeek) !== false) { - // continue; // Skip the day off and continue to the next day - $duration--; - } - $daysRemaining--; // Decrease the remaining days by one - } + $duration = MasterFunctionsHelper::countDays($activity->version_gantt_id, $startDate, $endDate); $activity->duration = $duration; $activity->actual_start = $reports[$i]['min_date']; $activity->save(); diff --git a/app/Http/Controllers/UserToActivityController.php b/app/Http/Controllers/UserToActivityController.php index c422cf6..2c3a658 100644 --- a/app/Http/Controllers/UserToActivityController.php +++ b/app/Http/Controllers/UserToActivityController.php @@ -27,7 +27,7 @@ class UserToActivityController extends Controller public function addMultiple(Request $request){ $users_id = $request->user_id; - $users_role = $request->role_proyek_id; + $users_role = $request->role_proyek_id; // $data = UserToActivity::where("activity_id", $request->activity_id); // if($data){ @@ -42,8 +42,10 @@ class UserToActivityController extends Controller "activity_id" => $request->activity_id, "role_proyek_id" => $users_role[$index], "proyek_id" => $request->proyek_id, - "created_by" => $this->currentName, - "version_gantt_id" => $request->version_gantt_id + "start_date" => $request->start_date, + "end_date" => $request->end_date, + "created_by" => $this->currentName, + "version_gantt_id" => $request->version_gantt_id ); $result = UserToActivity::create($dataInsert); if($result){ @@ -216,7 +218,7 @@ class UserToActivityController extends Controller public function datatables(Request $request){ $id_activity = $request->query('idact'); - $data = UserToActivity::select("assign_hr_to_activity.id as id", "u.name as user_name", "mrp.name as role_name") + $data = UserToActivity::select("assign_hr_to_activity.id as id", "assign_hr_to_activity.start_date", "assign_hr_to_activity.end_date", "u.name as user_name", "mrp.name as role_name") ->join("m_role_proyek as mrp", "mrp.id", "=", "assign_hr_to_activity.role_proyek_id") ->join("m_users as u", "u.id", "=", "assign_hr_to_activity.user_id") ->where('assign_hr_to_activity.activity_id', $id_activity) diff --git a/app/Models/UserToActivity.php b/app/Models/UserToActivity.php index 76f948a..1b795b1 100644 --- a/app/Models/UserToActivity.php +++ b/app/Models/UserToActivity.php @@ -18,6 +18,8 @@ class UserToActivity extends Model 'version_gantt_id', 'role_proyek_id', 'activity_id', + 'start_date', + 'end_date', 'created_at', 'created_by', 'updated_at', diff --git a/routes/web.php b/routes/web.php index bcc0e2b..7f62207 100644 --- a/routes/web.php +++ b/routes/web.php @@ -209,6 +209,7 @@ $router->group(['prefix'=>'api', 'middleware' => 'cors'], function () use ($rout $router->post('/activity/import-update', 'ActivityController@importUpdate'); $router->post('/activity/import-old', 'ActivityController@importOld'); $router->post('/activity/batch-update/{ganttId}', 'ActivityController@batchUpdate'); + $router->get('/activity/update-schedule/{ganttId}', 'ActivityController@updateSchedule'); $router->post('/task', 'ActivityController@add'); $router->get('/task/edit/{id}', 'ActivityController@edit'); $router->put('/task/{id}', 'ActivityController@update');