diff --git a/Layout/default/Device/Detail.php b/Layout/default/Device/Detail.php index efaec921f..9643d471e 100644 --- a/Layout/default/Device/Detail.php +++ b/Layout/default/Device/Detail.php @@ -2,7 +2,7 @@ ?> - @@ -64,12 +105,16 @@ $daysgerm = array("So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"); @@ -126,6 +171,11 @@ $daysgerm = array("So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"); +
+
+ +
+
@@ -133,14 +183,58 @@ $daysgerm = array("So", "Mo", "Di", "Mi", "Do", "Fr", "Sa");
-
-
-
-

Liste aller Buchungen

+
+
+ +
+
+ +
+
+
+
+
+ +
+
+ +
+
+
+
+
+
+ +
+
+
+
+ +
+
-
+ + @@ -163,72 +257,6 @@ $daysgerm = array("So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"); - 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)]; - } 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)]; - } 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 = ''; - } - ?> - - - - - - - - - -
timerecordingCategory->name ?>commend ?> - completed == 0): - if ($timerecording->approved == 0) : ?> - - -
- - $timerecording->id]) ?>" - onclick="if(!confirm('Buchung wirklich löschen?')) return false;" class="text-danger" - title="Löschen"> - -
@@ -241,96 +269,14 @@ $daysgerm = array("So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"); + src="js/pages/timerecording/index.js?"> \ No newline at end of file diff --git a/Layout/default/TimerecordingCategories/Form.php b/Layout/default/TimerecordingCategories/Form.php index 32ca2a197..47c969c5b 100644 --- a/Layout/default/TimerecordingCategories/Form.php +++ b/Layout/default/TimerecordingCategories/Form.php @@ -65,7 +65,7 @@
- approval) echo 'checked="checked"'; ?> + approval) echo 'checked="checked"'; ?> type="checkbox" name="approval" value="1" id="olt">
@@ -75,7 +75,7 @@ Pflichtfeld
- require_comment) echo 'checked="checked"'; ?> + require_comment) echo 'checked="checked"'; ?> type="checkbox" name="require_comment" value="1">
@@ -84,7 +84,7 @@
- only_admin) echo 'checked="checked"'; ?> + only_admin) echo 'checked="checked"'; ?> type="checkbox" name="only_admin" value="1">
diff --git a/Layout/default/TimerecordingEmployee/Form.php b/Layout/default/TimerecordingEmployee/Form.php new file mode 100644 index 000000000..78de5bf12 --- /dev/null +++ b/Layout/default/TimerecordingEmployee/Form.php @@ -0,0 +1,219 @@ +'; +foreach ($days as $key => $day) { + $daysSelect .= ''; +} +$daysSelect .= ""; +?> + + + + + + +
+
+
+
+ +
+

id) ? "Personaladministration" : "Personaladministration" ?>

+
+
+
+ +
+
+ +
+
+

id) ? "Personaladministration" : "Personaladministration" ?>

+ +
"> +
+
+ +
+ +
+ +
+
+
+ +
+ +
+
+
+ +
+ plushours / 3600) ?>"/> +
+
+
+ +
+
+ auto_workinghours) echo 'checked="checked"'; ?> + type="checkbox" name="auto_workinghours" value="1"/> +
+
+
+
+
+ +
+ +
+
+ + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + +
+
+
+
+ +
+ + "> + + +
+
+ +
+
+
+ +
+
+ + + + \ No newline at end of file diff --git a/Layout/default/TimerecordingEmployee/Index.php b/Layout/default/TimerecordingEmployee/Index.php new file mode 100644 index 000000000..495dab686 --- /dev/null +++ b/Layout/default/TimerecordingEmployee/Index.php @@ -0,0 +1,94 @@ + + + +
+
+
+
+ +
+

Personaladministration

+
+
+
+ +
+
+
+
+
+

Liste aller Personaladministration

+
+
+ +
+
+
+
+ + + + + + + + + + + + + + + + + + + id]['secondcounter']; + $minutes = floor(($seconds % 3600) / 60); + $hours = floor($seconds / 3600); + $sum = sprintf("%02d", $hours) . ":" . sprintf("%02d", $minutes); + } else { + $sum = ""; + } + ?> + + + + + + + + + + +
MitarbeiterSollzeitenSollstundenSchnellbuchung
name ?>id]['datetimetext'] : "" ?>id]['auto_workinghours'] == '1') ? 'Ja' : 'Nein' ?> + $timerecordingemployees[$timerecordinguser->id]['id'],"userid" => $timerecordinguser->id]) ?>"> +
+
+
+
+ +
+
+ + + + + + + \ No newline at end of file diff --git a/Layout/default/TimerecordingHoliday/Form.php b/Layout/default/TimerecordingHoliday/Form.php index 538cf7ebf..858f26b1b 100644 --- a/Layout/default/TimerecordingHoliday/Form.php +++ b/Layout/default/TimerecordingHoliday/Form.php @@ -36,17 +36,17 @@
timestamp) ?>"/> + value="timestamp) ? date("Y-m-d",$timerecordingholidays->timestamp) : date("Y-m-d",time()) ?>"/>
- +
- +
diff --git a/application/LoggingCommunication/LoggingCommunication.php b/application/LoggingCommunication/LoggingCommunication.php new file mode 100644 index 000000000..31fc83544 --- /dev/null +++ b/application/LoggingCommunication/LoggingCommunication.php @@ -0,0 +1,60 @@ +$name == null) { + + if (!$this->id) { + return null; + } + + if ($name == "creator") { + $this->creator = mfValuecache::singleton()->get("Worker-id-" . $this->create_by); + if ($this->creator === null) { + $this->creator = new User($this->create_by); + if ($this->creator->id) { + mfValuecache::singleton()->set("Worker-id-" . $this->create_by, $this->creator); + } + } + return $this->creator; + } + + if ($name == "editor") { + $this->editor = mfValuecache::singleton()->get("Worker-id-" . $this->edit_by); + if ($this->editor === null) { + $this->editor = new User($this->edit_by); + if ($this->editor->id) { + mfValuecache::singleton()->set("Worker-id-" . $this->edit_by, $this->editor); + } + } + return $this->editor; + } + + $classname = ucfirst($name); + $idfield = $name . "_id"; + $this->$name = mfValuecache::singleton()->get("mfObjectmodel-$name-" . $this->$idfield); + if (!$this->$name) { + $this->$name = new $classname($this->$idfield); + } + + if ($this->$name->id) { + mfValuecache::singleton()->set("mfObjectmodel-$name-" . $this->$name->id, $this->$name); + return $this->$name; + } else { + return null; + } + + } + + return $this->$name; +} + +} \ No newline at end of file diff --git a/application/LoggingCommunication/LoggingCommunicationController.php b/application/LoggingCommunication/LoggingCommunicationController.php new file mode 100644 index 000000000..1ca14771b --- /dev/null +++ b/application/LoggingCommunication/LoggingCommunicationController.php @@ -0,0 +1,129 @@ +needlogin = true; + $me = new User(); + $me->loadMe(); + $this->me = $me; + $this->layout()->set("me", $me); + + if (!$me->is(["Admin"])) { + $this->redirect("Dashboard"); + } + } + + protected function indexAction() + { + + $this->layout()->setTemplate("LoggingCommunication/Index"); + $loggingcommunications = LoggingCommunicationModel::getAll(); + $this->layout()->set("loggingcommunications", $loggingcommunications); + + } + + protected function addAction() + { + + $this->layout()->setTemplate("LoggingCommunication/Form"); + + } + + protected function editAction() + { + $id = $this->request->id; + + if (!is_numeric($id) || !$id) { + $this->layout()->setFlash("Logging nicht gefunden", "error"); + $this->redirect("LoggingCommunication"); + } + + $loggingcommunications = new LoggingCommunication($id); + if ($loggingcommunications->id != $id) { + $this->layout()->setFlash("Logging nicht gefunden", "error"); + $this->redirect("LoggingCommunication"); + } + + $this->layout()->set("loggingcommunications", $loggingcommunications); + return $this->addAction(); + } + + protected function saveAction() + { + $r = $this->request; + $id = $r->id; + //var_dump($r->get());exit; + if (is_numeric($id) && $id > 0) { + $mode = "edit"; + $loggingcommunications = new LoggingCommunication($id); + if (!$loggingcommunications->id) { + $this->layout()->setFlash("Logging nicht gefunden", "error"); + $this->redirect("LoggingCommunication"); + } + } else { + $mode = "add"; + } + + $data = []; + $data['type'] = trim($r->type); + $data['message'] = trim($r->message); + $data['response'] = trim($r->response); + + + if (!$data['type']) { + $data['type']=NULL; + } + if (!$data['message']) { + $data['message']=NULL; + } + if (!$data['response']) { + $data['response']=NULL; + } + + +// var_dump($_FILES); +// var_dump($upload); +// exit; + + + if ($mode == "edit") { + $loggingcommunications->update($data); + + } else { + $loggingcommunications = LoggingCommunicationModel::create($data); + } +// var_dump($filestore); +// exit; + $id = $loggingcommunications->save(); + + if (!$id) { + $this->layout()->setFlash("Logging konnte nicht angelegt werden", "error"); + $this->redirect("LoggingCommunication"); + } + + if ($mode == "edit") { + $this->layout()->setFlash("Logging erfolgreich geändert", "success"); + } else if ($mode = "add") { + $this->layout()->setFlash("Logging erfolgreich angelegt", "success"); + } + $this->redirect("LoggingCommunication"); + } + + + protected function deleteAction() + { + $id = $this->request->id; + $loggingcommunications = new LoggingCommunication($id); + if (!$loggingcommunications->id || $loggingcommunications->id != $id) { + $this->layout()->setFlash("Logging nicht gefunden.", "error"); + $this->redirect("LoggingCommunication"); + } + + $loggingcommunications->delete(); + $this->redirect("LoggingCommunication"); + } + +} diff --git a/application/LoggingCommunication/LoggingCommunicationModel.php b/application/LoggingCommunication/LoggingCommunicationModel.php new file mode 100644 index 000000000..f2dcd7b78 --- /dev/null +++ b/application/LoggingCommunication/LoggingCommunicationModel.php @@ -0,0 +1,130 @@ + $value) { + if (property_exists(get_called_class(), $field)) { + if (substr($field, 0, 5) == "vlan_" && !$value) { + $model->$field = null; + continue; + } + $model->$field = $value; + } + } + + $me = mfValuecache::singleton()->get("me"); + if (!$me) { + $me = new User(); + $me->loadMe(); + mfValuecache::singleton()->set("me", $me); + } + + if ($model->create_by === null) { + $model->create_by = $me->id; + } + if ($model->edit_by === null) { + $model->edit_by = $me->id; + } + + return $model; + } + + public static function getOne($id) + { + if (!is_numeric($id) || !$id) { + throw new Exception("Invalid number", 400); + } + $item = []; + $db = FronkDB::singleton(); + + $res = $db->select("LoggingCommunication", "*", "id=$id LIMIT 1"); + if ($db->num_rows($res)) { + $data = $db->fetch_object($res); + $item = new LoggingCommunication($data); + } + return $item; + } + + public static function getAll() + { + $items = []; + + $db = FronkDB::singleton(); + + $res = $db->select("LoggingCommunication", "*", "1=1"); + if ($db->num_rows($res)) { + while ($data = $db->fetch_object($res)) { + $items[] = new LoggingCommunication($data); + } + } + return $items; + + } + + public static function getFirst() + { + $db = FronkDB::singleton(); + + $where = self::getSqlFilter($filter); + $res = $db->select("LoggingCommunication", "*", "$where "); + if ($db->num_rows($res)) { + $data = $db->fetch_object($res); + $item = new LoggingCommunication($data); + if ($item->id) { + return $item; + } else { + return null; + } + } + return null; + } + + public static function search($filter) + { + $items = []; + $db = FronkDB::singleton(); + + $where = self::getSqlFilter($filter); + $res = $db->select("LoggingCommunication", "*", "$where"); + if ($db->num_rows($res)) { + while ($data = $db->fetch_object($res)) { + $items[] = new LoggingCommunication($data); + } + } + return $items; + } + + private static function getSqlFilter($filter) + { + $where = "1=1 "; + + //var_dump($filter);exit; + if (array_key_exists("network_id", $filter)) { + $networkid = $filter['network_id']; + if (is_numeric($networkid)) { + $where .= " AND network_id=$networkid"; + } + } + + //var_dump($filter, $where);exit; + return $where; + } + +} diff --git a/application/Timerecording/TimerecordingController.php b/application/Timerecording/TimerecordingController.php index 0996afd98..28e77f3b2 100644 --- a/application/Timerecording/TimerecordingController.php +++ b/application/Timerecording/TimerecordingController.php @@ -18,13 +18,38 @@ class TimerecordingController extends mfBaseController protected function indexAction() { - $this->layout()->setTemplate("Timerecording/Index"); $timerecordingCategoriess = TimerecordingCategoryModel::getAll(); $this->layout()->set("timerecordingCategoriess", $timerecordingCategoriess); - $timerecordings = TimerecordingModel::search(['user_id' => $this->me->id]); - $this->layout()->set("timerecordings", $timerecordings); + $this->layout()->setTemplate("Timerecording/Index"); } + protected function apiAction() + { + $do = $this->request->do; + $datatype = $this->request->datatype; + $dataweek = $this->request->dataweek; + $datamonth = $this->request->datamonth; + + $data = []; + + switch ($do) { + case "getTimerecordings": + $return = $this->getTimerecordingsApi($datatype, $dataweek, $datamonth); + 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(); @@ -52,6 +77,22 @@ class TimerecordingController extends mfBaseController return $this->addAction(); } + protected function checkTimerecording($starttime, $endtime, $id = NULL) + { + $searchArray = ['user_id' => $this->me->id, '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; @@ -68,6 +109,17 @@ class TimerecordingController extends mfBaseController $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); @@ -110,25 +162,204 @@ class TimerecordingController extends mfBaseController } else { $timerecordings = TimerecordingModel::create($data); + } // var_dump($filestore); // exit; $id = $timerecordings->save(); if (!$id) { - $this->layout()->setFlash("Buchung konnte nicht angelegt werden", "error"); + $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") { - $this->layout()->setFlash("Buchung erfolgreich geändert", "success"); + $message = "Buchung erfolgreich geändert"; } else if ($mode = "add") { - $this->layout()->setFlash("Buchung erfolgreich angelegt", "success"); + $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) + { + $mustSeconds = 0; + $isSeconds=0; + $rows = []; + $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"); + $timestamp_sonntag = strtotime(date("Y-m-d", $timestamp_sonntag) . ' 23:59:59'); + $searchArray = ['user_id' => $this->me->id, 'start' => $timestamp_montag, 'end' => $timestamp_sonntag]; + + $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; + } + + + } + + + $daysgerm = array("So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"); + $timerecordingCategoriess = 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)]; +// echo $enddate-$datadate."
"; + } 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; + + $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), + 'commend' => array('commend' => $timerecording->commend, 'order' => $timerecording->commend), + '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['data'] = $rows; + $json['recordsFiltered'] = $responsecount; + $json['recordsTotal'] = $responsecount; + $json = json_encode($json); + echo trim($json); + die(); + } + protected function deleteAction() { $id = $this->request->id; @@ -139,6 +370,9 @@ class TimerecordingController extends mfBaseController } $timerecordings->delete(); + if ($this->request->ajax == 1) { + die(); + } $this->redirect("Timerecording"); } diff --git a/application/Timerecording/TimerecordingModel.php b/application/Timerecording/TimerecordingModel.php index f8b6b8039..89911a000 100644 --- a/application/Timerecording/TimerecordingModel.php +++ b/application/Timerecording/TimerecordingModel.php @@ -9,7 +9,7 @@ class TimerecordingModel private $commend; private $approved; private $completed; - + public static function find($data) { @@ -78,6 +78,7 @@ class TimerecordingModel return $items; } + public static function getAllPermits() { $items = []; @@ -140,8 +141,27 @@ class TimerecordingModel $where .= " AND user_id=$userid"; } } + if (array_key_exists("start", $filter) && array_key_exists("end", $filter)) { + $start = $filter['start']; + $end = $filter['end']; + if (is_numeric($start) && is_numeric($end)) { + $where .= " AND `start` > $start AND `start` < $end"; + } + } + if (array_key_exists("starttime", $filter) && array_key_exists("endtime", $filter)) { + $starttime = $filter['starttime']; + $endtime = $filter['endtime']; + $id = $filter['id']; + if (is_numeric($starttime) && is_numeric($endtime)) { + $where .= " AND ((`start` <= $starttime AND `end` >= $starttime ) || (`start` >= $endtime AND `end` <= $endtime) || (`start` >= $starttime AND `end` >= $starttime AND `start` <= $endtime AND `end` <= $endtime))"; + if ($id && is_numeric($id)) { + $where .= " AND `id` != $id"; + } - //var_dump($filter, $where);exit; + } + } +// +// var_dump($filter, $where);exit; return $where; } diff --git a/application/TimerecordingCategory/TimerecordingCategoryModel.php b/application/TimerecordingCategory/TimerecordingCategoryModel.php index 155c3ac76..b6f59b09f 100644 --- a/application/TimerecordingCategory/TimerecordingCategoryModel.php +++ b/application/TimerecordingCategory/TimerecordingCategoryModel.php @@ -119,10 +119,10 @@ class TimerecordingCategoryModel $where = "1=1 "; //var_dump($filter);exit; - if (array_key_exists("network_id", $filter)) { - $networkid = $filter['network_id']; - if (is_numeric($networkid)) { - $where .= " AND network_id=$networkid"; + if (array_key_exists("id", $filter)) { + $id = $filter['id']; + if (is_numeric($id)) { + $where .= " AND id=$id"; } } diff --git a/application/TimerecordingEmployee/TimerecordingEmployee.php b/application/TimerecordingEmployee/TimerecordingEmployee.php new file mode 100644 index 000000000..4804deb8f --- /dev/null +++ b/application/TimerecordingEmployee/TimerecordingEmployee.php @@ -0,0 +1,60 @@ +$name == null) { + + if (!$this->id) { + return null; + } + + if ($name == "creator") { + $this->creator = mfValuecache::singleton()->get("Worker-id-" . $this->create_by); + if ($this->creator === null) { + $this->creator = new User($this->create_by); + if ($this->creator->id) { + mfValuecache::singleton()->set("Worker-id-" . $this->create_by, $this->creator); + } + } + return $this->creator; + } + + if ($name == "editor") { + $this->editor = mfValuecache::singleton()->get("Worker-id-" . $this->edit_by); + if ($this->editor === null) { + $this->editor = new User($this->edit_by); + if ($this->editor->id) { + mfValuecache::singleton()->set("Worker-id-" . $this->edit_by, $this->editor); + } + } + return $this->editor; + } + + $classname = ucfirst($name); + $idfield = $name . "_id"; + $this->$name = mfValuecache::singleton()->get("mfObjectmodel-$name-" . $this->$idfield); + if (!$this->$name) { + $this->$name = new $classname($this->$idfield); + } + + if ($this->$name->id) { + mfValuecache::singleton()->set("mfObjectmodel-$name-" . $this->$name->id, $this->$name); + return $this->$name; + } else { + return null; + } + + } + + return $this->$name; +} + +} \ No newline at end of file diff --git a/application/TimerecordingEmployee/TimerecordingEmployeeController.php b/application/TimerecordingEmployee/TimerecordingEmployeeController.php new file mode 100644 index 000000000..621bc9605 --- /dev/null +++ b/application/TimerecordingEmployee/TimerecordingEmployeeController.php @@ -0,0 +1,158 @@ +needlogin = true; + $me = new User(); + $me->loadMe(); + $this->me = $me; + $this->layout()->set("me", $me); + + if (!$me->can(["Fibu"])) { + $this->redirect("Dashboard"); + } + } + + protected function indexAction() + { + + $this->layout()->setTemplate("TimerecordingEmployee/Index"); + $timerecordingemployees = TimerecordingEmployeeModel::getAllArray(); + $timerecordingusers = UserModel::search(['employee' => 'true']); + $timerecordingworkinghours = TimerecordingEmployeeWorkingHourModel::getAllArray(); + $this->layout()->set("timerecordingemployees", $timerecordingemployees); + $this->layout()->set("timerecordingworkinghours", $timerecordingworkinghours); + $this->layout()->set("timerecordingusers", $timerecordingusers); + + } + + protected function addAction() + { + $id = $this->request->id; + $userid = $this->request->userid; + $days = TimerecordingEmployeeWorkingHourModel::$days_definition; + $timerecordingworkinghours = TimerecordingEmployeeWorkingHourModel::search(['user_id' => $userid]); + $this->layout()->set("days", $days); + $this->layout()->set("timerecordingworkinghours", $timerecordingworkinghours); + $this->layout()->setTemplate("TimerecordingEmployee/Form"); + } + + protected function editAction() + { + $id = $this->request->id; + $userid = $this->request->userid; + if (!is_numeric($id) || !$id) { + + + } else { + $timerecordingemployees = new TimerecordingEmployee($id); + if ($timerecordingemployees->id != $id) { + $this->layout()->setFlash("Personaladministration nicht gefunden", "error"); + $this->redirect("TimerecordingEmployee"); + } + + $this->layout()->set("timerecordingemployees", $timerecordingemployees); + } + $timerecordinguser = UserModel::search(['worker_id' => $userid]); + $this->layout()->set("timerecordinguser", $timerecordinguser); + return $this->addAction(); + } + + protected function saveAction() + { + $r = $this->request; + $id = $r->id; + //var_dump($r->get());exit; + if (is_numeric($id) && $id > 0) { + $mode = "edit"; + $timerecordingemployees = new TimerecordingEmployee($id); + if (!$timerecordingemployees->id) { + $this->layout()->setFlash("Personaladministration nicht gefunden", "error"); + $this->redirect("TimerecordingEmployee"); + } + } else { + $mode = "add"; + } + + + TimerecordingEmployeeWorkingHourModel::deleteUserHours($r->user_id); + if ($r->day) { + foreach ($r->day as $key => $day) { + unset($dataWorkHours); + $dataWorkHours = []; + $starttime = $r->timestart[$key]; + $endtime = $r->timeend[$key]; + + if ($starttime && $endtime) { + $dataWorkHours['user_id'] = $r->user_id; + $dataWorkHours['day'] = $day; + $dataWorkHours['start'] = $starttime; + $dataWorkHours['end'] = $endtime; + $timerecordingemployeesworkinghours = TimerecordingEmployeeWorkingHourModel::create($dataWorkHours); + $timerecordingemployeesworkinghours->save(); + } + } + } + $plushours = $r->plushours; + $plushours = str_replace(',', '.', $plushours); + if (is_numeric($plushours)) { + $plushours = $plushours * 3600; + } + + $data = []; + $data['user_id'] = trim($r->user_id); + $data['auto_workinghours'] = trim($r->auto_workinghours); + $data['holidays'] = trim($r->holidays); + $data['plushours'] = $plushours; + + + if (!$data['user_id']) { + $this->layout()->setFlash("Mitarbeiter darf nicht leer sein", "error"); + $this->redirect("TimerecordingEmployee"); + } + if (!$data['auto_workinghours']) { + $data['auto_workinghours'] = 0; + } + + + if ($mode == "edit") { + $timerecordingemployees->update($data); + + } else { + $timerecordingemployees = TimerecordingEmployeeModel::create($data); + } +// var_dump($filestore); +// exit; + $id = $timerecordingemployees->save(); + + if (!$id) { + $this->layout()->setFlash("Personaladministration konnte nicht angelegt werden", "error"); + $this->redirect("TimerecordingEmployee"); + } + + if ($mode == "edit") { + $this->layout()->setFlash("Personaladministration erfolgreich geändert", "success"); + } else if ($mode = "add") { + $this->layout()->setFlash("Personaladministration erfolgreich angelegt", "success"); + } + $this->redirect("TimerecordingEmployee"); + } + + + protected function deleteAction() + { + $id = $this->request->id; + $timerecordingemployees = new TimerecordingEmployee($id); + if (!$timerecordingemployees->id || $timerecordingemployees->id != $id) { + $this->layout()->setFlash("Personaladministration nicht gefunden.", "error"); + $this->redirect("TimerecordingEmployee"); + } + + $timerecordingemployees->delete(); + $this->redirect("TimerecordingEmployee"); + } + +} diff --git a/application/TimerecordingEmployee/TimerecordingEmployeeModel.php b/application/TimerecordingEmployee/TimerecordingEmployeeModel.php new file mode 100644 index 000000000..826d7281a --- /dev/null +++ b/application/TimerecordingEmployee/TimerecordingEmployeeModel.php @@ -0,0 +1,144 @@ + $value) { + if (property_exists(get_called_class(), $field)) { + if (substr($field, 0, 5) == "vlan_" && !$value) { + $model->$field = null; + continue; + } + $model->$field = $value; + } + } + + $me = mfValuecache::singleton()->get("me"); + if (!$me) { + $me = new User(); + $me->loadMe(); + mfValuecache::singleton()->set("me", $me); + } + + if ($model->create_by === null) { + $model->create_by = $me->id; + } + if ($model->edit_by === null) { + $model->edit_by = $me->id; + } + + return $model; + } + + public static function getOne($id) + { + if (!is_numeric($id) || !$id) { + throw new Exception("Invalid number", 400); + } + $item = []; + $db = FronkDB::singleton(); + + $res = $db->select("TimerecordingEmployee", "*", "id=$id LIMIT 1"); + if ($db->num_rows($res)) { + $data = $db->fetch_object($res); + $item = new TimerecordingEmployee($data); + } + return $item; + } + + public static function getAll() + { + $items = []; + + $db = FronkDB::singleton(); + + $res = $db->select("TimerecordingEmployee", "*", "1=1"); + if ($db->num_rows($res)) { + while ($data = $db->fetch_object($res)) { + $items[] = new TimerecordingEmployee($data); + } + } + return $items; + + } + + public static function getAllArray() + { + $items = []; + + $db = FronkDB::singleton(); + + $res = $db->select("TimerecordingEmployee", "*", "1=1"); + if ($db->num_rows($res)) { + while ($data = $db->fetch_array($res)) { + $items[$data['user_id']] = $data; + } + } + return $items; + + } + + public static function getFirst() + { + $db = FronkDB::singleton(); + + $where = self::getSqlFilter($filter); + $res = $db->select("TimerecordingEmployee", "*", "$where "); + if ($db->num_rows($res)) { + $data = $db->fetch_object($res); + $item = new TimerecordingEmployee($data); + if ($item->id) { + return $item; + } else { + return null; + } + } + return null; + } + + public static function search($filter) + { + $items = []; + $db = FronkDB::singleton(); + + $where = self::getSqlFilter($filter); + $res = $db->select("TimerecordingEmployee", "*", "$where"); + if ($db->num_rows($res)) { + while ($data = $db->fetch_object($res)) { + $items[] = new TimerecordingEmployee($data); + } + } + return $items; + } + + private static function getSqlFilter($filter) + { + $where = "1=1 "; + + //var_dump($filter);exit; + if (array_key_exists("network_id", $filter)) { + $networkid = $filter['network_id']; + if (is_numeric($networkid)) { + $where .= " AND network_id=$networkid"; + } + } + + //var_dump($filter, $where);exit; + return $where; + } + +} diff --git a/application/TimerecordingEmployeeWorkingHour/TimerecordingEmployeeWorkingHour.php b/application/TimerecordingEmployeeWorkingHour/TimerecordingEmployeeWorkingHour.php new file mode 100644 index 000000000..cfdb292ca --- /dev/null +++ b/application/TimerecordingEmployeeWorkingHour/TimerecordingEmployeeWorkingHour.php @@ -0,0 +1,60 @@ +$name == null) { + + if (!$this->id) { + return null; + } + + if ($name == "creator") { + $this->creator = mfValuecache::singleton()->get("Worker-id-" . $this->create_by); + if ($this->creator === null) { + $this->creator = new User($this->create_by); + if ($this->creator->id) { + mfValuecache::singleton()->set("Worker-id-" . $this->create_by, $this->creator); + } + } + return $this->creator; + } + + if ($name == "editor") { + $this->editor = mfValuecache::singleton()->get("Worker-id-" . $this->edit_by); + if ($this->editor === null) { + $this->editor = new User($this->edit_by); + if ($this->editor->id) { + mfValuecache::singleton()->set("Worker-id-" . $this->edit_by, $this->editor); + } + } + return $this->editor; + } + + $classname = ucfirst($name); + $idfield = $name . "_id"; + $this->$name = mfValuecache::singleton()->get("mfObjectmodel-$name-" . $this->$idfield); + if (!$this->$name) { + $this->$name = new $classname($this->$idfield); + } + + if ($this->$name->id) { + mfValuecache::singleton()->set("mfObjectmodel-$name-" . $this->$name->id, $this->$name); + return $this->$name; + } else { + return null; + } + + } + + return $this->$name; +} + +} \ No newline at end of file diff --git a/application/TimerecordingEmployeeWorkingHour/TimerecordingEmployeeWorkingHourModel.php b/application/TimerecordingEmployeeWorkingHour/TimerecordingEmployeeWorkingHourModel.php new file mode 100644 index 000000000..4ea253a79 --- /dev/null +++ b/application/TimerecordingEmployeeWorkingHour/TimerecordingEmployeeWorkingHourModel.php @@ -0,0 +1,201 @@ + "Montag", 2 => "Dienstag", 3 => "Mittwoch", 4 => "Donnerstag", 5 => "Freitag", 6 => "Samstag", 0 => "Sonntag"); + public static $days_short = array(0 => "So", 1 => "Mo", 2 => "Di", 3 => "Mi", 4 => "Do", 5 => "Fr", 6 => "Sa"); + + public static function cleardays($days) + { + $days_short = TimerecordingEmployeeWorkingHourModel::$days_short; + foreach ($days_short as $day_short) { + $days = str_replace($day_short . " - " . $day_short, $day_short, $days); + } + return $days; + } + + public static function find($data) + { + + } + + public static function create(array $data) + { + $model = new TimerecordingEmployeeWorkingHour(); + + foreach ($data as $field => $value) { + if (property_exists(get_called_class(), $field)) { + if (substr($field, 0, 5) == "vlan_" && !$value) { + $model->$field = null; + continue; + } + $model->$field = $value; + } + } + + $me = mfValuecache::singleton()->get("me"); + if (!$me) { + $me = new User(); + $me->loadMe(); + mfValuecache::singleton()->set("me", $me); + } + + if ($model->create_by === null) { + $model->create_by = $me->id; + } + if ($model->edit_by === null) { + $model->edit_by = $me->id; + } + + return $model; + } + + public static function getOne($id) + { + if (!is_numeric($id) || !$id) { + throw new Exception("Invalid number", 400); + } + $item = []; + $db = FronkDB::singleton(); + + $res = $db->select("TimerecordingEmployeeWorkingHour", "*", "id=$id LIMIT 1"); + if ($db->num_rows($res)) { + $data = $db->fetch_object($res); + $item = new TimerecordingEmployeeWorkingHour($data); + } + return $item; + } + + public static function getAll() + { + $items = []; + + $db = FronkDB::singleton(); + + $res = $db->select("TimerecordingEmployeeWorkingHour", "*", "1=1"); + if ($db->num_rows($res)) { + while ($data = $db->fetch_object($res)) { + $items[] = new TimerecordingEmployeeWorkingHour($data); + } + } + return $items; + + } + + public static function getAllArray() + { + $items = []; + $daysshort = TimerecordingEmployeeWorkingHourModel::$days_short; + $db = FronkDB::singleton(); + + $res = $db->select("TimerecordingEmployeeWorkingHour", "*", "1=1 ORDER by `user_id`,`day`"); + if ($db->num_rows($res)) { + $olduser = 0; + $counter = 0; + $oldend = ""; + $oldstart = ""; + $oldday = ""; + $datetimetext = ""; + $secondcounter = 0; + + while ($data = $db->fetch_array($res)) { + if ($olduser != $data['user_id']) { + if ($counter > 0) { + $secondcounter = 0; + $datetimetext .= " - " . $daysshort[$oldday] . " " . $oldstart . " - " . $oldend; + $datetimetext = TimerecordingEmployeeWorkingHourModel::cleardays($datetimetext); + $items[$olduser]['datetimetext'] = $datetimetext; + } + $datetimetext = ""; + unset($oldstart); + unset($oldend); + unset($oldday); + $items[$data['user_id']] = $data; + } + $secondcounter = $secondcounter + strtotime(date("Y-m-d " . $data['end'] . ":00")) - strtotime(date("Y-m-d " . $data['start'] . ":00")); + + if (!$datetimetext) { + $datetimetext = $daysshort[$data['day']]; + } + echo $oldstart . $data['start']; + if (($oldstart != $data['start'] || $oldend != $data['end']) && $oldend) { + $datetimetext .= " - " . $daysshort[$oldday] . " " . $oldstart . " - " . $oldend; + $datetimetext .= "
" . $daysshort[$data['day']]; + } + + $items[$data['user_id']]['datetimetext'] = $datetimetext; + $items[$data['user_id']]['secondcounter'] = $secondcounter; + $olduser = $data['user_id']; + $oldstart = $data['start']; + $oldend = $data['end']; + $oldday = $data['day']; + $counter++; + } + $datetimetext .= " - " . $daysshort[$oldday] . " " . $oldstart . " - " . $oldend; + $datetimetext = TimerecordingEmployeeWorkingHourModel::cleardays($datetimetext); + $items[$olduser]['datetimetext'] = $datetimetext; + } + return $items; + + } + + public static function deleteUserHours($userid) + { + $db = FronkDB::singleton(); + $sql = "DELETE FROM `TimerecordingEmployeeWorkingHour` WHERE `user_id`='" . $userid . "'"; + $res = $db->query($sql); + } + + public static function getFirst() + { + $db = FronkDB::singleton(); + + $where = self::getSqlFilter($filter); + $res = $db->select("TimerecordingEmployeeWorkingHour", "*", "$where "); + if ($db->num_rows($res)) { + $data = $db->fetch_object($res); + $item = new TimerecordingEmployeeWorkingHour($data); + if ($item->id) { + return $item; + } else { + return null; + } + } + return null; + } + + public static function search($filter) + { + $items = []; + $db = FronkDB::singleton(); + + $where = self::getSqlFilter($filter); + $res = $db->select("TimerecordingEmployeeWorkingHour", "*", "$where ORDER by `day`,`start`"); + if ($db->num_rows($res)) { + while ($data = $db->fetch_object($res)) { + $items[] = new TimerecordingEmployeeWorkingHour($data); + } + } + return $items; + } + + private static function getSqlFilter($filter) + { + $where = "1=1 "; + + if (array_key_exists("user_id", $filter)) { + $userid = $filter['user_id']; + if (is_numeric($userid)) { + $where .= " AND user_id=$userid"; + } + } + + //var_dump($filter, $where);exit; + return $where; + } + +} diff --git a/application/TimerecordingHoliday/TimerecordingHolidayController.php b/application/TimerecordingHoliday/TimerecordingHolidayController.php index 123910ada..8b24f26ac 100644 --- a/application/TimerecordingHoliday/TimerecordingHolidayController.php +++ b/application/TimerecordingHoliday/TimerecordingHolidayController.php @@ -27,7 +27,7 @@ class TimerecordingHolidayController extends mfBaseController protected function addAction() { - + $this->layout()->setTemplate("TimerecordingHoliday/Form"); } @@ -66,11 +66,18 @@ class TimerecordingHolidayController extends mfBaseController } else { $mode = "add"; } + if ($r->timestamp) { + $timestamp = strtotime($r->timestamp . " 00:00:00"); + if ($timestamp< 1577833200) + { + $timestamp=""; + } + } $data = []; - $data['timestamp'] = trim($r->timestamp); + $data['timestamp'] = trim($timestamp); $data['description'] = trim($r->description); - + if (!$data['timestamp']) { $this->layout()->setFlash("Datum darf nicht leer sein", "error"); @@ -80,7 +87,7 @@ class TimerecordingHolidayController extends mfBaseController $this->layout()->setFlash("Name darf nicht leer sein", "error"); $this->redirect("TimerecordingHoliday"); } - + // var_dump($_FILES); // var_dump($upload); diff --git a/db/migrations/20240112114633_timerecording_employee.php b/db/migrations/20240112114633_timerecording_employee.php index 52f32d224..c6d6ef855 100644 --- a/db/migrations/20240112114633_timerecording_employee.php +++ b/db/migrations/20240112114633_timerecording_employee.php @@ -11,6 +11,8 @@ final class TimerecordingEmployee extends AbstractMigration $table = $this->table("TimerecordingEmployee", ["signed" => true]); $table->addColumn("user_id", "integer", ["null" => false]); $table->addColumn("auto_workinghours", "integer", ["null" => false, "default" => "0"]); + $table->addColumn("holidays", "integer", ["null" => false, "default" => "0"]); + $table->addColumn("plushours", "integer", ["null" => false, "default" => "0"]); $table->addColumn("create_by", "integer", ["null" => false]); $table->addColumn("edit_by", "integer", ["null" => false]); $table->addColumn("create", "integer", ["null" => false]); diff --git a/public/assets/css/datatables-std.css b/public/assets/css/datatables-std.css index 358edbcf2..67f34371b 100644 --- a/public/assets/css/datatables-std.css +++ b/public/assets/css/datatables-std.css @@ -129,6 +129,22 @@ table.dataTable.table-sm > thead > tr > th:not(.sorting_disabled) { { color: #f00; } +.edit-td { + text-align: left; + letter-spacing: 12px; + font-size: 1.1em; +} +.display-calendar +{ + color:#0d6efd; + font-size: 30px; + margin-right:20px; + cursor: pointer; +} +.active-calendar +{ + color:#25b343; +} @media (max-width: 1200px) { .fa-circle-xmark, .fa-ban, .fa-trash, .fa-edit, .fa-square-check, .fa-arrows-up-down-left-right { font-size: 25px; @@ -196,6 +212,18 @@ table.dataTable.table-sm > thead > tr > th:not(.sorting_disabled) { font-size: 14px; margin: 12px 3px 7px 0px; } + .display-calendar + { + font-size:35px; + margin-top:5px; + margin-right:30px; + margin-bottom:20px; + + } + .label-calendar + { + margin-top:7px; + } } table.dataTable > tbody > tr.child span.dtr-data { diff --git a/public/js/pages/timerecording/index.js b/public/js/pages/timerecording/index.js new file mode 100644 index 000000000..b32a175ca --- /dev/null +++ b/public/js/pages/timerecording/index.js @@ -0,0 +1,323 @@ +let table; +if (typeof hidesearch === "undefined") { + var hidesearch; + hidesearch = [100]; +} + +if (typeof cstmdom === "undefined") { + var cstmdom; + cstmdom = "flBrtip"; + +} +if (typeof columndefs === "undefined") { + var columndefs; + columndefs = ""; + +} + +if (typeof columnfilter === "undefined") { + var columnfilter; + columnfilter = ""; +} +if (typeof columnoptions === "undefined") { + var columnoptions; + columnoptions = ""; +} + +$('#filterrow th').each(function (i) { + let title = $('#datatable thead th').eq($(this).index()).text(); + + if (hidesearch.includes($(this).index())) { + + } else if (columnfilter.includes($(this).index())) { + $(this).html(''); + + } else { + $(this).html(''); + } +}); + +table = $('#datatable').DataTable({ + responsive: true, + "order": [[0, "desc"]], + buttons: [ + { + extend: 'excelHtml5', + text: 'XLSX Export', + className: 'btn-success margina d-none d-lg-block', + exportOptions: { + columns: ['th:not(:last-child)'] + } + } + ], columnDefs: [ + columndefs + ], + "language": { + "url": "/datatables/json/german.json?v1" + }, + orderCellsTop: true, + stateSave: true, + "initComplete": function () { + $('#datatable_filter').append(''); + $('#clear_cookie').click(function () { + $('#filterrow input').val(''); + $('#filterrow select').val(''); + table.search('').columns().search('').draw(); + }); + }, + "dom": cstmdom, + "ajax": { + "url": requestUrl, + "type": "GET", + "data": function (d) { + $('.display-calendar').each(function (index) { + if ($(this).hasClass('active-calendar')) { + d.datatype = $(this).data('datatype'); + } + }) + + d.dataweek = $('#dataweek').val(); + d.datamonth = $('#datamonth').val(); + }, + "dataSrc": function (json) { + $('#is-time').text(json.time.is); + $('#must-time').text(json.time.must); + return json.data; + } + + }, + "columns": [ + { + "data": { + _: "date.date", + "sort": "date.order" + }, + className: "text-nowrap" + }, { + "data": { + _: "start.start", + "sort": "start.order" + }, + className: "text-center" + }, { + "data": { + _: "end.end", + "sort": "end.order" + }, + className: "text-center" + }, { + "data": { + _: "sum.sum", + "sort": "sum.order" + }, + className: "text-center" + }, { + "data": { + _: "category.category", + "sort": "category.order" + }, + className: "" + } + , { + "data": { + _: "commend.commend", + "sort": "commend.order" + }, + className: "text-center" + }, { + "data": { + _: "edit.edit", + "sort": "edit.order" + }, + className: "edit-td" + } + ] + +}); + +$('#filterrow').on('keyup', 'input', function () { + + table + .column($(this).data('index')) + .search(this.value) + .draw(); + +}); + +$('#selectsearch').change(function () { + table + .column($(this).data('index')) + .search(this.value) + .draw(); + + +}); +let state = table.state.loaded(); +if (state) { + table.columns().eq(0).each(function (colIdx) { + var colSearch = state.columns[colIdx].search; + + if (colSearch.search) { + $('#filterrow').find("[data-index='" + colIdx + "']").val(colSearch.search); + } + }); + table.draw(); +} + +$(document).ready(function () { + $(".select2").select2(); + + $("body").on("change", "#timerecordingCategory_id", function () { + if (parseInt($(this).find(':selected').data('hourday')) === 2) { + $("#endtime-div").hide(); + $("#endtime-div").find('input').each(function () { + $(this).prop("required", false); + }); + $("#enddate-div").show(); + $("#enddate-div").find('input').each(function () { + $(this).prop("required", true); + $(this).prop("min", $('#date').val()); + $(this).val($('#date').val()); + }) + } else if (parseInt($(this).find(':selected').data('hourday')) === 1) { + $("#endtime-div").show(); + $("#endtime-div").find('input').each(function () { + $(this).prop("required", true); + $(this).prop("disabled", false); + }); + $("#enddate-div").hide(); + $("#enddate-div").find('input').each(function () { + $(this).prop("required", false); + $(this).prop("min", ''); + $(this).val(''); + }) + } else if (parseInt($(this).find(':selected').data('hourday')) === 3 || parseInt($(this).find(':selected').data('hourday')) === 4) { + $("#endtime-div").hide(); + $("#endtime-div").find('input').each(function () { + $(this).prop("required", false); + $(this).prop("disabled", true); + + }); + $("#enddate-div").hide(); + $("#enddate-div").find('input').each(function () { + $(this).prop("required", false); + $(this).prop("min", ''); + $(this).val(''); + }) + } + if (parseInt($(this).find(':selected').data('comment')) === 1) { + $('#commend').prop("required", true); + } else { + $('#commend').prop("required", false); + } + }); + $("body").on("change", "#date", function () { + if ($('#enddate-div').css('display') === "block") { + if ($('#date').val() > $('#enddate').val()) { + $('#enddate').prop("min", $('#date').val()); + $('#enddate').val($('#date').val()); + } + } + }); + $("body").on("change", "#start", function () { + + if ($('#start').val() > $('#end').val()) { + $('#end').val($('#start').val()); + } + $('#end').prop("min", $('#start').val()); + }); + + $("body").on("click", ".edit-button", function () { + $('#submit-button').hide().removeClass('btn-primary').addClass('btn-danger').show(); + $('#submit-button').text('Ändern'); + $('#cancel-button').show(); + $('#timerecordingCategory_id').val($(this).data('category')).change(); + $('#id').val($(this).data('id')); + $('#date').val($(this).data('date')); + $('#start').val($(this).data('start')); + $('#end').val($(this).data('end')); + $('#enddate').val($(this).data('enddate')); + $('#commend').val($(this).data('commend')); + $('.alert-success').remove(); + window.scrollTo(0, 0); + }); + $("body").on("click", "#cancel-button", function () { + $('#submit-button').hide().removeClass('btn-danger').addClass('btn-primary').show(); + $('#submit-button').text('Speichern'); + $('#cancel-button').hide(); + $('#id').val(''); + }); + + $("body").on("change", "#dataweek,#datamonth", function () { + table.ajax.reload(); + }); + $("body").on("click", ".display-calendar", function () { + $('.display-calendar').each(function (index) { + $(this).removeClass('active-calendar'); + }); + $(this).addClass('active-calendar'); + + if ($(this).data('datatype') == "1") { + console.log($(this).data('datatype')); + $('#dataweek-col').show(); + $('#datamonth-col').hide(); + } else if ($(this).data('datatype') == "2") { + $('#datamonth-col').show(); + $('#dataweek-col').hide(); + } + $(".select2").select2(); + table.ajax.reload(); + }); + $("body").on("click", ".delete-item", function () { + if (confirm('Buchung wirklich löschen?')) { + $.post(deleteUrl, { + id: $.trim($(this).data('id')), + ajax: 1 + }).done(function (data) { + + table.ajax.reload(); + }); + } + }) + + $('form').submit(function (e) { + e.preventDefault(); + $('#alert-box').remove(); + $.post(insertUrl, { + id: $.trim($('#id').val()), + timerecordingCategory_id: $.trim($('#timerecordingCategory_id').val()), + date: $.trim($('#date').val()), + enddate: $.trim($('#enddate').val()), + start: $.trim($('#start').val()), + end: $.trim($('#end').val()), + commend: $.trim($('#commend').val()), + ajax: 1 + }).done(function (data) { + var result = $.parseJSON(data); + if (result.state === "success") { + $('.wrapper .container-fluid').prepend(`
+
+
+ +
Erfolgreich
+ ` + result.message + `
+
`); + } + if (result.state === "error") { + $('.wrapper .container-fluid').prepend(`
+
+
+ +
Fehler
+ ` + result.error + `
+
`); + } + $('#submit-button').hide().removeClass('btn-danger').addClass('btn-primary').show(); + $('#submit-button').text('Speichern'); + $('#cancel-button').hide(); + $('#id').val(''); + table.ajax.reload(); + }); + }); +}) +; \ No newline at end of file