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");
+
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