/** * observe AttendanceLog event saving * 1. check actual status * 2. check modified status * 3. modify count status * 4. act, accept or refuse * * @param $model * @return bool */ public function saving($model) { $errors = new MessageBag(); //1. check actual status if (!$model->processlog()->count()) { if ($model->margin_start == 0 && $model->margin_end == 0) { $actual_status = 'AS'; } elseif ($model->margin_start >= 0 && $model->margin_end >= 0) { $actual_status = 'HB'; } else { if ($model->process_log->schedule_start < $model->process_log->start && $model->process_log->schedule_end < $model->process_log->start) { $actual_status = 'AS'; } elseif ($model->process_log->schedule_start > $model->process_log->end && $model->process_log->schedule_end > $model->process_log->end) { $actual_status = 'AS'; } else { $actual_status = 'HC'; } } $model->actual_status = $actual_status; $current_status = $actual_status; } //2. check modified status if ($model->modified_status != '') { if (strtoupper($model->actual_status) == 'HB') { $errors->add('modified', 'Tidak dapat mengubah status dengan status awal HB'); } elseif (strtoupper($model->actual_status) == 'HC' && !in_array(strtoupper($model->modified_status), ['HT', 'HD', 'HC', 'HP'])) { $errors->add('modified', 'Status untuk kedatangan cacat tidak valid. Pilih diantara status berikut : HT, HD, HC, HP'); } elseif (strtoupper($model->actual_status) == 'AS' && !in_array(strtoupper($model->modified_status), ['DN', 'SS', 'SL', 'CN', 'CB', 'CI', 'UL', 'AS'])) { $errors->add('modified', 'Status untuk absensi tidak valid. Pilih diantara status berikut : DN, SS, SL, CN, CB, CI, UL, AS'); } $model->modified_at = Carbon::now()->format('Y-m-d H:i:s'); $current_status = $model->modified_status; } //3. modify count status if ($model->processlog()->count()) { $count = 1; $prev_data = ProcessLog::personid($model->processlog->person_id)->notid($model->process_log_id)->orderby('on', 'desc')->first(); if ($prev_data) { $prev_status = AttendanceLog::processlogid($model->process_log_id)->orderby('created_at', 'desc')->first(); if ($prev_status && $prev_status->modified_status != '') { $current_prev_status = $prev_status->modified_status; } elseif ($prev_status) { $current_prev_status = $prev_status->actual_status; } if (isset($current_prev_status) && $current_status == $current_prev_status) { $count = $prev_status['count_status'] + 1; } } $model->count_status = $count; } if ($errors->count()) { $model['errors'] = $errors; return false; } return true; }
/** * observe Lumen event deleting * 1. check if prev day * 2. delete logs and process logs * 3. act, accept or refuse * * @param $model * @return bool */ public function deleting($model) { //1. check if prev day if ($model->on->format('Y-m-d') <= Carbon::now()->format('Y-m-d')) { $model['errors'] = ['Tidak dapat menghapus log yang sudah lewat dari tanggal hari ini.']; return false; } //2. delete logs and process logs $logs = Log::personid($model->person_id)->ondate([$model->on->startOfDay()->format('Y-m-d H:i:s'), $model->on->endOfDay()->format('Y-m-d H:i:s')])->get(); if ($logs->count() && $logs->count() <= 1) { $processes = ProcessLog::personid($model->person_id)->ondate([$model->on->startOfDay()->format('Y-m-d H:i:s'), $model->on->endOfDay()->format('Y-m-d H:i:s')])->get(); foreach ($processes as $key => $value) { if (!$value->delete()) { $model['errors'] = $value->getError(); return false; } } } }