<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use App\Models\Activity; use App\Models\Link; use DateTime; class VersionGantt extends Model { protected $table = 'm_version_gantt'; const CREATED_AT = 'created_at'; const UPDATED_AT = 'updated_at'; protected $fillable = [ 'name_version', 'description', 'date_base_line', 'proyek_id', 'config_dayoff', 'auto_schedule', 'calculation_type', 'committed_cost', 'cost_to_complete', 'progress', 'bobot', 'hierarchy_ftth_id', 'created_at', 'created_by', 'updated_at', 'updated_by' ]; public static function boot() { parent::boot(); static::updated(function($data) { $data->updateActDuration(); }); static::deleted(function ($data) { $activities = Activity::where('version_gantt_id', $data->id)->get(); foreach ($activities as $activity) { $activity->delete(); } }); } public function updateActDuration(){ $daysOff = explode(',', $this->config_dayoff); if (in_array('0', $daysOff)) { $key = array_search('0', $daysOff, false); $daysOff[$key] = '7'; } $activities = Activity::where('version_gantt_id', $this->id)->get(); foreach ($activities as $value) { $exist = Link::where('t_activity_id', $value->id)->exists(); $startDate = new DateTime($value->start_date); $endDate = new DateTime($value->end_date); $duration = $endDate->diff($startDate)->days + 1; if ($exist) { $duration--; } // Iterate through each day and subtract the days off for ($i = 0; $i < $duration; $i++) { $currentDate = clone $startDate; $currentDate->modify("+$i day"); $currentDayOfWeek = $currentDate->format('N'); // Get the day of the week (1 - Monday, 7 - Sunday) if (in_array($currentDayOfWeek, $daysOff)) { $duration--; // Subtract one day from the duration for each day off } } // Update the activity duration $value->duration = $duration; $value->save(); } } }