needlogin = true; $me = new User(); $me->loadMe(); $this->me = $me; $this->layout()->set("me", $me); if (!$me->is(["employee"])) { $this->redirect("Dashboard"); } } protected function indexAction() { $timerecordingCategoriess = TimerecordingCategoryModel::getAll(); $this->layout()->set("timerecordingCategoriess", $timerecordingCategoriess); $this->layout()->setTemplate("Timerecording/Index"); } protected function apiAction() { $do = $this->request->do; $datatype = $this->request->datatype; $dataweek = $this->request->dataweek; $datamonth = $this->request->datamonth; $datayear = $this->request->datayear; $data = []; switch ($do) { case "getTimerecordings": $return = $this->getTimerecordingsApi($datatype, $dataweek, $datamonth, $datayear); break; default: $return = false; } if (!is_array($return) || !count($return)) { $data = ["status" => "error"]; $this->returnJson($data); } $data['status'] = "OK"; $data['result'] = $return; $this->returnJson($data); } protected function addAction() { $timerecordingCategoriess = TimerecordingCategoryModel::getAll(); $this->layout()->set("timerecordingCategoriess", $timerecordingCategoriess); $this->layout()->setTemplate("Timerecording/Form"); } protected function editAction() { $id = $this->request->id; if (!is_numeric($id) || !$id) { $this->layout()->setFlash("Buchung nicht gefunden", "error"); $this->redirect("Timerecording"); } $timerecordings = new Timerecording($id); if ($timerecordings->id != $id) { $this->layout()->setFlash("Buchung nicht gefunden", "error"); $this->redirect("Timerecording"); } $this->layout()->set("timerecordings", $timerecordings); return $this->addAction(); } protected function checkTimerecording($starttime, $endtime, $id = NULL) { $r = $this->request; if ($r->user_id) { $userid = $r->user_id; } else { $userid = $this->me->id; } $searchArray = ['user_id' => $userid, 'starttime' => $starttime, 'endtime' => $endtime]; if ($id) { $searchArray['id'] = $id; } $timerecordings = TimerecordingModel::search($searchArray); if ($timerecordings) { $result['state'] = "error"; $result['error'] = "Zeitüberschneidung mit anderer Buchung"; } else { $result['state'] = "success"; } return $result; } protected function saveAction() { $r = $this->request; $id = $r->id; $enddate = $r->enddate; if (!$enddate && $r->start && $r->end) { $starttime = strtotime($r->date . " " . $r->start . ":00"); $endtime = strtotime($r->date . " " . $r->end . ":00"); } elseif ($enddate) { $starttime = strtotime($r->date . " 00:00:00"); $endtime = strtotime($enddate . " 23:59:00"); } else if (!$enddate && !$r->start && !$r->end) { $starttime = strtotime($r->date . " 00:00:00"); $endtime = NULL; } $result = $this->checkTimerecording($starttime, $endtime, $id); if ($result['state'] == "error") { if ($r->ajax == 1) { echo json_encode($result); die(); } $this->layout()->setFlash($result['error'], "error"); $this->redirect("Timerecording"); } if (is_numeric($id) && $id > 0) { $mode = "edit"; $timerecordings = new Timerecording($id); if (!$timerecordings->id) { $this->layout()->setFlash("Buchungen nicht gefunden", "error"); $this->redirect("Timerecording"); } } else { $mode = "add"; } $data = []; if ($r->user_id) { $data['user_id'] = $r->user_id; } else { $data['user_id'] = $this->me->id; } $data['start'] = $starttime; $data['end'] = $endtime; $data['timerecordingCategory_id'] = trim($r->timerecordingCategory_id); $data['comment'] = trim($r->comment); if (!$data['user_id']) { $this->layout()->setFlash("Benutzer darf nicht leer sein", "error"); $this->redirect("Timerecording"); } if ($data['start'] < 1577833200) { $this->layout()->setFlash("Ungültige Startzeit", "error"); $this->redirect("Timerecording"); } if ($data['end'] && $data['end'] < 1577833200) { $this->layout()->setFlash("Ungültige Endzeit", "error"); $this->redirect("Timerecording"); } if (!$data['timerecordingCategory_id']) { $data['timerecordingCategory_id'] = NULL; } if (!$data['comment']) { $data['comment'] = NULL; } if ($mode == "edit") { $timerecordings->update($data); } else { $timerecordings = TimerecordingModel::create($data); } // var_dump($filestore); // exit; $id = $timerecordings->save(); if (!$id) { $message = "Buchung konnte nicht angelegt werden"; if ($r->ajax == 1) { $result['state'] = "error"; $result['error'] = $message; echo json_encode($result); die(); } $this->layout()->setFlash($message, "error"); $this->redirect("Timerecording"); } if ($id) { $timerecordingCategoriess = TimerecordingCategoryModel::search(['id' => $data['timerecordingCategory_id']]); if ($timerecordingCategoriess[0]->approval == "1") { $body = 'Beantrag von: ' . $this->me->name . ' '; $body .= 'Buchungsart: ' . $timerecordingCategoriess[0]->name . ' '; if ($timerecordingCategoriess[0]->hourday == "1") { $body .= 'von: ' . date("d.m.Y H:i", $data['start']) . ' bis: ' . date("H:i", $data['end']); } else if ($timerecordingCategoriess[0]->hourday == "2") { $body .= 'von: ' . date("d.m.Y", $data['start']) . ' bis: ' . date("d.m.Y", $data['end']); } $email = new Emailnotification(); $email->setSubject('Antrag für ' . $timerecordingCategoriess[0]->name . ' erstellt'); $email->setBody($body); $email->setFrom('zeiterfassung@xinon.at', 'Xinon Zeiterfassung'); $email->setTo('daniel.spitzer@inode.at'); $email->send(); } } if ($mode == "edit") { $message = "Buchung erfolgreich geändert"; } else if ($mode = "add") { $message = "Buchung erfolgreich angelegt"; } if ($r->ajax == 1) { $result['state'] = "success"; $result['message'] = "$message"; echo json_encode($result); die(); } $this->layout()->setFlash($message, "success"); $this->redirect("Timerecording"); } protected function getTimerecordingsApi($datatype, $dataweek, $datamonth, $datayear) { $mustSeconds = 0; $isSeconds = 0; $holiDays = 0; $plusHours = 0; $rows = []; $employee = TimerecordingEmployeeModel::search(['user_id' => $this->me->id]); if ($employee) { $holiDays = $employee[0]->holidays; $plusHours = $employee[0]->plushours; } $workinghours = TimerecordingEmployeeWorkingHourModel::search(['user_id' => $this->me->id]); $holidays = TimerecordingHolidayModel::getAll(); foreach ($workinghours as $workinghour) { $whstart = strtotime(date('Y-m-d', time()) . " " . $workinghour->start . ":00"); $whend = strtotime(date('Y-m-d', time()) . " " . $workinghour->end . ":00"); if (!$workingHours[$workinghour->day]) { $workingHours[$workinghour->day] = $whend - $whstart; } else { $workingHours[$workinghour->day] = $workingHours[$workinghour->day] + $whend - $whstart; } } foreach ($holidays as $holiday) { $holiDay[date('Y-m-d', $holiday->timestamp)] = $holiday->timestamp; } if ($datatype == 1) { $kw = date('W', $dataweek); $year = date('Y', $dataweek); $timestamp_montag = strtotime("{$year}-W{$kw}"); $timestamp_sonntag = strtotime("{$year}-W{$kw}-7"); $lastdate = strtotime(date("Y-m-d", $timestamp_sonntag) . ' 23:59:59'); $searchArray = ['user_id' => $this->me->id, 'start' => $timestamp_montag, 'end' => $lastdate]; $daycounter = '0'; $timestamp = $timestamp_montag; for ($i = 1; $i <= 7; $i++) { $dDate = date('Y-m-d', $timestamp); $dDay = date('w', $timestamp); if (!$holiDay[$dDate]) { $mustSeconds = $mustSeconds + $workingHours[$dDay]; } $timestamp = $timestamp + 86400; } } else if ($datatype == 2) { $firstdate = strtotime(date("Y-m-01", $datamonth)); $lastdate = strtotime(date("Y-m-t", $datamonth)); $daycount = date("t", $datamonth); $lastdate = strtotime(date("Y-m-d", $lastdate) . ' 23:59:59'); $searchArray = ['user_id' => $this->me->id, 'start' => $firstdate, 'end' => $lastdate]; $timestamp = $firstdate; for ($i = 1; $i <= $daycount; $i++) { $dDate = date('Y-m-d', $timestamp); $dDay = date('w', $timestamp); if (!$holiDay[$dDate]) { $mustSeconds = $mustSeconds + $workingHours[$dDay]; } $timestamp = $timestamp + 86400; } } else if ($datatype == 3) { $firstdate = strtotime(date("Y-01-01", $datayear)); $lastdate = strtotime(date("Y-12-31 23:59:59", $datayear)); $daycount = date("t", $datamonth); $lastdate = strtotime(date("Y-m-d", $lastdate) . ' 23:59:59'); $searchArray = ['user_id' => $this->me->id, 'start' => $firstdate, 'end' => $lastdate]; $timestamp = $firstdate; for ($i = 1; $i <= $daycount; $i++) { $dDate = date('Y-m-d', $timestamp); $dDay = date('w', $timestamp); if (!$holiDay[$dDate]) { $mustSeconds = $mustSeconds + $workingHours[$dDay]; } $timestamp = $timestamp + 86400; } } $daysgerm = array("So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"); $timerecordingcategories = TimerecordingCategoryModel::getAll(); $timerecordings = TimerecordingModel::search($searchArray); $responsecount = count($timerecordings); foreach ($timerecordings as $timerecording): $state = ""; $enddate = ""; $sum = "-"; $day = ""; $orderdate = $timerecording->start; if ($timerecording->timerecordingCategory->hourday == 1) { $date = date("d.m.Y", $timerecording->start); $datadate = date("Y-m-d", $timerecording->start); $start = date("H:i", $timerecording->start); $end = date("H:i", $timerecording->end); $seconds = $timerecording->end - $timerecording->start; $minutes = floor(($seconds % 3600) / 60); $hours = floor($seconds / 3600); $sum = sprintf("%02d", $hours) . ":" . sprintf("%02d", $minutes); $day = $daysgerm[date("w", $timerecording->start)]; $isSeconds = $isSeconds + $seconds; } else if ($timerecording->timerecordingCategory->hourday == 2) { $date = date("d.m.", $timerecording->start) . " - " . $daysgerm[date("w", $timerecording->end)] . " " . date("d.m.Y", $timerecording->end); $datadate = date("Y-m-d", $timerecording->start); $enddate = date("Y-m-d", $timerecording->end); $start = "-"; $end = "-"; $day = $daysgerm[date("w", $timerecording->start)]; if ($lastdate < $timerecording->end) { $endtimecalc = $lastdate; } else { $endtimecalc = $timerecording->end; } $summcounter = 0; for ($i = $timerecording->start; $i <= $endtimecalc; $i = $i + 86400) { $holidaycounter = $workingHours[date("w", $i)]; $isSeconds = $isSeconds + $holidaycounter; $summcounter = $summcounter + $holidaycounter; } $seconds = $summcounter; $minutes = floor(($seconds % 3600) / 60); $hours = floor($seconds / 3600); $sum = sprintf("%02d", $hours) . ":" . sprintf("%02d", $minutes); } else if ($timerecording->timerecordingCategory->hourday == 3 || $timerecording->timerecordingCategory->hourday == 4) { $date = date("d.m.Y", $timerecording->start); $datadate = date("Y-m-d", $timerecording->start); $start = "-"; $end = "-"; $day = $daysgerm[date("w", $timerecording->start)]; } if ($timerecording->timerecordingCategory->approval == 1 && $timerecording->approved == 0) { $state = ''; } else if ($timerecording->timerecordingCategory->approval == 1 && $timerecording->approved == 1) { $state = ''; } $edit = ""; if ($timerecording->completed == 0 && $timerecording->timerecordingCategory->only_admin == 0): if ($timerecording->approved == 0) : $edit = ''; else : $edit .= '
'; endif; $edit .= ''; endif; if ($datatype == 3 && $timerecording->timerecordingCategory->hourday == 1) { } else { $rows[] = array( 'date' => array('date' => $state . $day . " " . $date, 'order' => $orderdate), 'start' => array('start' => $start, 'order' => $start), 'end' => array('end' => $end, 'order' => $end), 'sum' => array('sum' => $sum, 'order' => $sum), 'category' => array('category' => $timerecording->timerecordingCategory->name, 'order' => $timerecording->timerecordingCategory->name), 'comment' => array('comment' => $timerecording->comment, 'order' => $timerecording->comment), 'edit' => array('edit' => $edit, 'order' => $edit), ); } endforeach; $json['success'] = true; $json['time']['is'] = sprintf('%02dh:%02dm', floor($isSeconds / 3600), floor($isSeconds / 60 % 60)); $json['time']['must'] = sprintf('%02dh:%02dm', floor($mustSeconds / 3600), floor($mustSeconds / 60 % 60)); $json['time']['holidays'] = $holiDays; $json['time']['plushours'] = sprintf('%02dh:%02dm', floor($plusHours / 3600), floor($plusHours / 60 % 60)); $json['data'] = $rows; $json['recordsFiltered'] = $responsecount; $json['recordsTotal'] = $responsecount; $json = json_encode($json); echo trim($json); die(); } protected function deleteAction() { $id = $this->request->id; $timerecordings = new Timerecording($id); if (!$timerecordings->id || $timerecordings->id != $id) { $this->layout()->setFlash("Buchung nicht gefunden.", "error"); $this->redirect("Timerecording"); } $timerecordings->delete(); if ($this->request->ajax == 1) { die(); } $this->redirect("Timerecording"); } }