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