public function getPunch($req) { $date = $req->date; $arr = explode(" ", $date); $date = $arr[0]; $employee = $this->baseService->getElement('Employee', $this->getCurrentEmployeeId(), null, true); //Find any open punch $attendance = new Attendance(); $attendance->Load("employee = ? and DATE_FORMAT( in_time, '%Y-%m-%d' ) = ? and (out_time is NULL or out_time = '0000-00-00 00:00:00')", array($employee->id, $date)); if ($attendance->employee == $employee->id) { //found an open punch return new IceResponse(IceResponse::SUCCESS, $attendance); } else { return new IceResponse(IceResponse::SUCCESS, null); } }
public function savePunch($req) { $employee = $this->baseService->getElement('Employee', $req->employee, null, true); $inDateTime = $req->in_time; $inDateArr = explode(" ", $inDateTime); $inDate = $inDateArr[0]; $outDateTime = $req->out_time; $outDate = ""; if (!empty($outDateTime)) { $outDateArr = explode(" ", $outDateTime); $outDate = $outDateArr[0]; } $note = $req->note; //check if dates are differnet if (!empty($outDate) && $inDate != $outDate) { return new IceResponse(IceResponse::ERROR, "Attendance entry should be within a single day"); } //compare dates if (!empty($outDateTime) && strtotime($outDateTime) <= strtotime($inDateTime)) { return new IceResponse(IceResponse::ERROR, "Punch-in time should be lesser than Punch-out time"); } //Find all punches for the day $attendance = new Attendance(); $attendanceList = $attendance->Find("employee = ? and DATE_FORMAT( in_time, '%Y-%m-%d' ) = ?", array($employee->id, $inDate)); foreach ($attendanceList as $attendance) { if (!empty($req->id) && $req->id == $attendance->id) { continue; } if (empty($attendance->out_time) || $attendance->out_time == "0000-00-00 00:00:00") { return new IceResponse(IceResponse::ERROR, "There is a non closed attendance entry for today. Please mark punch-out time of the open entry before adding a new one"); } else { if (!empty($outDateTime)) { if (strtotime($attendance->out_time) >= strtotime($outDateTime) && strtotime($attendance->in_time) <= strtotime($outDateTime)) { //-1---0---1---0 || ---0--1---1---0 return new IceResponse(IceResponse::ERROR, "Time entry is overlapping with an existing one"); } else { if (strtotime($attendance->out_time) >= strtotime($inDateTime) && strtotime($attendance->in_time) <= strtotime($inDateTime)) { //---0---1---0---1 || ---0--1---1---0 return new IceResponse(IceResponse::ERROR, "Time entry is overlapping with an existing one"); } else { if (strtotime($attendance->out_time) <= strtotime($outDateTime) && strtotime($attendance->in_time) >= strtotime($inDateTime)) { //--1--0---0--1-- return new IceResponse(IceResponse::ERROR, "Time entry is overlapping with an existing one"); } } } } else { if (strtotime($attendance->out_time) >= strtotime($inDateTime) && strtotime($attendance->in_time) <= strtotime($inDateTime)) { //---0---1---0 return new IceResponse(IceResponse::ERROR, "Time entry is overlapping with an existing one"); } } } } $attendance = new Attendance(); if (!empty($req->id)) { $attendance->Load("id = ?", array($req->id)); } $attendance->in_time = $inDateTime; if (empty($outDateTime)) { $attendance->out_time = "0000-00-00 00:00:00"; } else { $attendance->out_time = $outDateTime; } $attendance->employee = $req->employee; $attendance->note = $note; $ok = $attendance->Save(); if (!$ok) { error_log($attendance->ErrorMsg()); return new IceResponse(IceResponse::ERROR, "Error occured while saving attendance"); } return new IceResponse(IceResponse::SUCCESS, $attendance); }