diff --git a/application/WarehouseOrder/WarehouseOrderController.php b/application/WarehouseOrder/WarehouseOrderController.php index ba62aa0c6..1cd3c881b 100644 --- a/application/WarehouseOrder/WarehouseOrderController.php +++ b/application/WarehouseOrder/WarehouseOrderController.php @@ -373,24 +373,21 @@ $appendToBody } protected function uploadFileAction() { - if (!isset($_FILES['file']) || $_FILES['file']['error'] !== UPLOAD_ERR_OK) { - self::returnJson(['error' => 'No file uploaded or upload error occurred']); - return; - } + $file = $_FILES['file'] ?? null; - $_FILES = ['WarehouseOrder' => $_FILES['file']]; + if (!$file || $file['error'] !== UPLOAD_ERR_OK) { + self::returnJson(['error' => 'File upload failed']); + exit; + } try { - $file = mfUpload::handleFormUpload("WarehouseOrder", false, "/WarehouseOrder"); - - // Return the file ID - self::returnJson(['success' => true, 'fileId' => $file->id]); - } catch (Exception $ex) { - self::returnJson(['error' => 'Error uploading file: ' . $ex->getMessage()]); + $uploaded = mfUpload::handleFormUpload("file", false, "/WarehouseOrder"); + self::returnJson(['success' => true, 'fileId' => $uploaded->id]); + } catch (Exception $e) { + self::returnJson(['error' => 'Upload error: ' . $e->getMessage()]); } } - protected function getLogByIdAction() { $orderId = $this->request->id; if (empty($orderId)) { @@ -402,33 +399,42 @@ $appendToBody self::returnJson($log); } - - protected function afterUpdate($postData) { - $this->updateOrderRequestLinkedOrderIds($postData['id']); - } - protected function afterCreate($postData) { - $this->updateOrderRequestLinkedOrderIds($postData['id']); + $this->updateLinkedOrders($postData['id'], 'add'); } - protected function updateOrderRequestLinkedOrderIds($id) { - $order = (array) WarehouseOrderModel::get($id); - foreach (json_decode($order['positions'], true) as $position) { - if (!empty($position['linkedOrderRequestId'])) { - $warehouseOrderRequest = (array) WarehouseOrderRequestModel::get($position['linkedOrderRequestId']); - if (is_null($warehouseOrderRequest['linkedOrderIds'])) { - $warehouseOrderRequest['linkedOrderIds'] = [$id]; - WarehouseOrderRequestModel::update($warehouseOrderRequest); - } else { - if (!in_array($id, $warehouseOrderRequest['linkedOrderIds'])) { - $warehouseOrderRequest['linkedOrderIds'][] = $id; - WarehouseOrderRequestModel::update($warehouseOrderRequest); - } - } + protected function beforeDelete($postData): bool { + $this->updateLinkedOrders($postData['id'], 'remove'); + return true; + } + + protected function updateLinkedOrders($orderId, $action) { + $order = (array) WarehouseOrderModel::get($orderId); + $requestIds = array_unique(array_filter(array_column( + json_decode($order['positions'], true) ?: [], + 'linkedOrderRequestId' + ))); + + foreach ($requestIds as $requestId) { + $request = (array) WarehouseOrderRequestModel::get($requestId); + $linkedIds = $request['linkedOrderIds'] ? json_decode($request['linkedOrderIds'], true) : []; + + if ($action === 'add' && !in_array($orderId, $linkedIds)) { + $linkedIds[] = $orderId; + } elseif ($action === 'remove') { + $index = array_search($orderId, $linkedIds); + if ($index !== false) { + unset($linkedIds[$index]); + } + } + + if ($request['linkedOrderIds'] !== $linkedIds) { + $request['linkedOrderIds'] = $linkedIds; + WarehouseOrderRequestModel::update($request); } } - } + } \ No newline at end of file diff --git a/lib/TTCrud/TTCrud.php b/lib/TTCrud/TTCrud.php index 8359aa12d..b91f1237d 100644 --- a/lib/TTCrud/TTCrud.php +++ b/lib/TTCrud/TTCrud.php @@ -251,6 +251,10 @@ class TTCrud extends mfBaseController { $affectedRows = $this->model::delete($this->postData['id']); + if (method_exists($this, 'afterDelete')) { + $this->afterDelete($this->postData); + } + self::returnJson(['success' => $affectedRows > 0, 'message' => $affectedRows > 0 ? $this->infoMessages['delete'] : $this->infoMessages['noChanges']]); } @@ -291,7 +295,7 @@ class TTCrud extends mfBaseController { } $data = (array) $this->model::get($id); - if (method_exists($this, 'getByIdParse') && !isset($_GET['disableParse'])) $data = $this->getByIdParse($data); + if (!empty($data) && method_exists($this, 'getByIdParse') && !isset($_GET['disableParse'])) $data = $this->getByIdParse($data); self::returnJson($data); } diff --git a/lib/TTCrudBaseModel/TTCrudBaseModel.php b/lib/TTCrudBaseModel/TTCrudBaseModel.php index 4815dde9f..72647faf7 100644 --- a/lib/TTCrudBaseModel/TTCrudBaseModel.php +++ b/lib/TTCrudBaseModel/TTCrudBaseModel.php @@ -2,6 +2,7 @@ class TTCrudBaseModel { public function __construct($data = []) { + if (empty($data)) return; foreach ($data as $field => $value) { if (property_exists(get_called_class(), $field)) { $this->$field = $value; diff --git a/public/js/pages/WarehouseOrder/WarehouseOrder.js b/public/js/pages/WarehouseOrder/WarehouseOrder.js index 1b1d59a3f..7d958f542 100644 --- a/public/js/pages/WarehouseOrder/WarehouseOrder.js +++ b/public/js/pages/WarehouseOrder/WarehouseOrder.js @@ -14,6 +14,7 @@ Vue.component('change-status-modal', { sendEmail: false, sendEmailViewedPDF: false, sendEmailMail: '', + submitLoading: false }; }, async mounted() { @@ -24,8 +25,6 @@ Vue.component('change-status-modal', { window.notify('error', 'Bestellung wurde storniert'); } this.order = response.data; - - }, computed: { availableStatuses() { @@ -107,11 +106,14 @@ Vue.component('change-status-modal', { }, removeFile: index => this.uploadedFiles.splice(index, 1), async submit() { + this.submitLoading = true; if (this.newStatus === 'accepted' && this.sendEmail && !this.sendEmailMail) { window.notify('error', 'Bitte geben Sie eine E-Mail-Adresse ein'); + this.submitLoading = false; return; } else if (this.newStatus === 'accepted' && this.sendEmail && !this.sendEmailViewedPDF) { window.notify('error', 'Bitte öffnen Sie das PDF bevor Sie die E-Mail senden'); + this.submitLoading = false; return; } else if (this.newStatus === 'accepted' && this.sendEmail && this.sendEmailMail) { if (this.order.sendShippingNote > 0) { @@ -135,6 +137,7 @@ Vue.component('change-status-modal', { window.notify('error', response.data.errors ? Object.values(response.data.errors).join('
') : response.data.message || 'Ein Fehler ist aufgetreten'); } + this.submitLoading = false; }, async generateShippingNote() { const positions = this.order.positions.map(position => ({ @@ -171,7 +174,7 @@ Vue.component('change-status-modal', { } }, template: ` - +