diff --git a/Layout/default/VueViews/WarehouseLoginOverride.php b/Layout/default/VueViews/WarehouseLoginOverride.php
new file mode 100644
index 000000000..9453342b8
--- /dev/null
+++ b/Layout/default/VueViews/WarehouseLoginOverride.php
@@ -0,0 +1,123 @@
+
+
+
+
+
+ Lager-System Login
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/Layout/default/footer.php b/Layout/default/footer.php
index d937f845c..730bee028 100644
--- a/Layout/default/footer.php
+++ b/Layout/default/footer.php
@@ -15,7 +15,7 @@
- is("employee")): ?>
+ is("employee") && !isset($_SESSION[MFAPPNAME . '_warehouse_login_override'])): ?>
diff --git a/application/Address/AddressController.php b/application/Address/AddressController.php
index cec2e41c0..655c708e1 100644
--- a/application/Address/AddressController.php
+++ b/application/Address/AddressController.php
@@ -4,13 +4,36 @@ class AddressController extends mfBaseController {
private $filter;
protected function init() {
- $this->needlogin = true;
- $me = new User();
- $me->loadMe();
- $this->me = $me;
- $this->layout()->set("me", $me);
+ $user = null;
+ $overrideKey = MFAPPNAME . '_warehouse_login_override';
+ $timestampKey = MFAPPNAME . '_warehouse_login_override_timestamp';
- if (!$me->is(["Admin", "salespartner"])) {
+ $overrideId = $_SESSION[$overrideKey] ?? null;
+ $timestamp = $_SESSION[$timestampKey] ?? null;
+
+ if (is_numeric($overrideId) && $timestamp && (time() - $timestamp) < 600) {
+ $potentialUser = new User($overrideId);
+ if ($potentialUser->id && $potentialUser->address_id == 1) {
+ $user = $potentialUser;
+ } else {
+ unset($_SESSION[$overrideKey], $_SESSION[$timestampKey]);
+ $this->redirect('WarehouseShippingNote');
+ return;
+ }
+ } elseif ($overrideId) {
+ unset($_SESSION[$overrideKey], $_SESSION[$timestampKey]);
+ }
+
+ if (!$user) {
+ $this->needlogin = true;
+ $user = new User();
+ $user->loadMe();
+ }
+
+ $this->me = $user;
+ $this->layout()->set("me", $this->me);
+
+ if (!$this->me->is(["Admin", "salespartner"])) {
$this->redirect("Dashboard");
}
}
diff --git a/application/User/UserModel.php b/application/User/UserModel.php
index fe408da62..c170185f8 100644
--- a/application/User/UserModel.php
+++ b/application/User/UserModel.php
@@ -125,6 +125,8 @@ class UserModel
$where .= " AND WorkerPermission.employee = 'true'";
}
}
+ if (isset($filter['active']))
+ $where .= " AND Worker.active = " . (int)$filter['active'];
//var_dump($filter, $where);exit;
return $where;
diff --git a/application/WarehouseShippingNote/WarehouseShippingNoteController.php b/application/WarehouseShippingNote/WarehouseShippingNoteController.php
index c95cd762b..8f9e179fe 100644
--- a/application/WarehouseShippingNote/WarehouseShippingNoteController.php
+++ b/application/WarehouseShippingNote/WarehouseShippingNoteController.php
@@ -28,7 +28,7 @@ class WarehouseShippingNoteController extends TTCrud {
['key' => 'actions', 'text' => 'Aktionen', 'required' => false, 'modal' => false, 'table' => ['filter' => false, 'sortable' => false, 'class' => 'text-center']],];
protected array $defaultOrder = ['key' => 'create', 'order' => 'DESC'];
- protected array $additionalJSVariables = ['WAREHOUSE_ADMIN' => true];
+ protected array $additionalJSVariables = ['WAREHOUSE_ADMIN' => true, 'HIDE_MENU' => false];
protected array $infoMessages = ['create' => 'Lieferschein wurde erstellt.',
'update' => 'Lieferschein wurde aktualisiert',
'delete' => 'Lieferschein wurde gelöscht',
@@ -37,6 +37,7 @@ class WarehouseShippingNoteController extends TTCrud {
protected function prepareCrudConfig() {
if (!$this->user->can('WarehouseAdmin')) $this->additionalJSVariables['WAREHOUSE_ADMIN'] = false;
+ if (isset($_SESSION[MFAPPNAME . '_warehouse_login_override']) && is_numeric($_SESSION[MFAPPNAME . '_warehouse_login_override'])) $this->additionalJSVariables['HIDE_MENU'] = true;
}
protected function beforeCreate($postData): bool {
diff --git a/lib/TTCrud/TTCrud.php b/lib/TTCrud/TTCrud.php
index 35e84ba11..d0cb5077d 100644
--- a/lib/TTCrud/TTCrud.php
+++ b/lib/TTCrud/TTCrud.php
@@ -27,21 +27,26 @@ class TTCrud extends mfBaseController {
}
protected function init() {
- $this->needlogin = true;
- $me = new User();
- $me->loadMe();
- $this->user = $me;
- $this->layout()->set('me', $me);
+ $className = get_class($this);
- if (isset($this->permissionCheck) && !$me->can($this->permissionCheck)) {
- $this->redirect("Dashboard");
- } else if (!$me->can($this->permissionCheck) && !$me->is(["Admin"])) {
- $this->redirect("Dashboard");
+ if (defined('TT_WAREHOUSE_LOGIN_OVERRIDE') && is_array(TT_WAREHOUSE_LOGIN_OVERRIDE)
+ && in_array($className, TT_WAREHOUSE_LOGIN_OVERRIDE) && !mfLoginController::isLoggedIn())
+ $this->user = $this->loginOverride();
+ else {
+ $this->needlogin = true;
+ $this->user = new User();
+ $this->user->loadMe();
}
+ $this->layout()->set('me', $this->user);
- $c = get_class($this);
- foreach ([str_replace('Controller', 'Model', $c), str_replace('Controller', '', $c)] as $m)
- if (class_exists($m)) {
+ if (method_exists($this, 'permissionsCheckOverride'))
+ $this->permissionsCheckOverride();
+ else if (!$this->user->is(["Admin"]))
+ $this->redirect("Dashboard");
+
+
+ foreach ([str_replace('Controller', 'Model', $className), str_replace('Controller', '', $className)] as $m) {
+ if (class_exists($m))
$this->model = new $m();
break;
}
@@ -52,6 +57,37 @@ class TTCrud extends mfBaseController {
if (method_exists($this, 'afterInit')) $this->afterInit();
}
+ protected function loginOverride() {
+ $allowedIPs = ['193.105.204.200', '91.227.230.253', '193.105.204.195', '172.18.0.1'];
+ if (!in_array($_SERVER['REMOTE_ADDR'], $allowedIPs)) $this->redirect('Dashboard');
+
+ if (isset($_POST['wantedUserId']) && is_numeric($_POST['wantedUserId'])) {
+ $user = new User($_POST['wantedUserId']);
+ if ($user->id && $user->address_id == 1) {
+ $_SESSION[MFAPPNAME . '_warehouse_login_override'] = $user->id;
+ $_SESSION[MFAPPNAME . '_warehouse_login_override_timestamp'] = time();
+ $this->redirect('WarehouseShippingNote');
+ }
+ $this->redirect('Dashboard');
+ }
+
+ $sessionUserId = $_SESSION[MFAPPNAME . '_warehouse_login_override'] ?? null;
+ $sessionTimestamp = $_SESSION[MFAPPNAME . '_warehouse_login_override_timestamp'] ?? 0;
+
+ if (is_numeric($sessionUserId) && (time() - $sessionTimestamp <= 300)) {
+ $user = new User($sessionUserId);
+ if ($user->id && $user->address_id == 1) return $user;
+ $this->redirect('WarehouseShippingNote');
+ }
+
+ $users = UserModel::search(['employee' => true, 'active' => true]);
+ $userOptions = array_map(fn($user) => ['value' => (int)$user->id, 'text' => $user->name], $users);
+
+ $this->layout()->set('userOptions', $userOptions);
+ $this->layout()->setTemplate("VueViews/WarehouseLoginOverride");
+ echo $this->layout()->render();
+ exit;
+ }
/**
* Returns the checkArray for the CRUD component.
* @return array
diff --git a/lib/mvcfronk/mfLogin/mfLoginController.php b/lib/mvcfronk/mfLogin/mfLoginController.php
index 0813cc6e1..350821302 100644
--- a/lib/mvcfronk/mfLogin/mfLoginController.php
+++ b/lib/mvcfronk/mfLogin/mfLoginController.php
@@ -128,7 +128,7 @@ class mfLoginController extends mfBaseController
UserToken::checkToken();
- if ($_SESSION[MFAPPNAME . '_username'] && $_SESSION[MFAPPNAME . '_ip']) {
+ if (isset($_SESSION[MFAPPNAME . '_username']) && $_SESSION[MFAPPNAME . '_username'] && $_SESSION[MFAPPNAME . '_ip']) {
$username = $_SESSION[MFAPPNAME . '_username'];
$ip = $_SERVER['REMOTE_ADDR'];
$sid = session_id();
diff --git a/public/assets/images/xinon-sm-192.png b/public/assets/images/xinon-sm-192.png
new file mode 100644
index 000000000..70805c62e
Binary files /dev/null and b/public/assets/images/xinon-sm-192.png differ
diff --git a/public/assets/images/xinon-sm-512.png b/public/assets/images/xinon-sm-512.png
new file mode 100644
index 000000000..c853b3060
Binary files /dev/null and b/public/assets/images/xinon-sm-512.png differ
diff --git a/public/assets/pwa/shipping-note-tablet-manifest.json b/public/assets/pwa/shipping-note-tablet-manifest.json
new file mode 100644
index 000000000..ae6727cbe
--- /dev/null
+++ b/public/assets/pwa/shipping-note-tablet-manifest.json
@@ -0,0 +1,22 @@
+{
+ "name": "Lieferscheine",
+ "short_name": "Lieferscheine",
+ "description": "XINON Lieferscheine App",
+ "start_url": ".",
+ "display": "standalone",
+ "background_color": "#f1f5f9",
+ "theme_color": "#0055FF",
+ "orientation": "portrait-primary",
+ "icons": [
+ {
+ "src": "/assets/images/xinon-sm-192.png",
+ "type": "image/png",
+ "sizes": "192x192"
+ },
+ {
+ "src": "/assets/images/xinon-sm-512.png",
+ "type": "image/png",
+ "sizes": "512x512"
+ }
+ ]
+}
\ No newline at end of file
diff --git a/public/assets/pwa/shipping-note-tablet-sw.js b/public/assets/pwa/shipping-note-tablet-sw.js
new file mode 100644
index 000000000..5c12d8bb1
--- /dev/null
+++ b/public/assets/pwa/shipping-note-tablet-sw.js
@@ -0,0 +1,32 @@
+const CACHE_NAME = 'lager-system-cache-v1';
+const urlsToCache = [
+ '.',
+ 'https://cdn.jsdelivr.net/npm/vue@3.4.27/dist/vue.global.min.js',
+ 'https://cdn.tailwindcss.com',
+ '/assets/images/xinon-full.png',
+ '/assets/icons/icon-192x192.png',
+ '/assets/icons/icon-512x512.png'
+];
+
+self.addEventListener('install', event => {
+ event.waitUntil(
+ caches.open(CACHE_NAME).then(cache => cache.addAll(urlsToCache))
+ );
+});
+
+self.addEventListener('fetch', event => {
+ event.respondWith(
+ caches.match(event.request).then(response => response || fetch(event.request))
+ );
+});
+
+self.addEventListener('activate', event => {
+ const cacheWhitelist = [CACHE_NAME];
+ event.waitUntil(
+ caches.keys().then(cacheNames => Promise.all(
+ cacheNames
+ .filter(cacheName => !cacheWhitelist.includes(cacheName))
+ .map(cacheName => caches.delete(cacheName))
+ ))
+ );
+});
\ No newline at end of file