/** 
  * 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;
 }
Example #2
0
 /** 
  * 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;
             }
         }
     }
 }