Fixed things for WarehouseOrder

This commit is contained in:
Luca Haid
2025-03-11 17:47:00 +01:00
parent 8b989fd135
commit a6ab876bf0
6 changed files with 60 additions and 43 deletions

View File

@@ -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);
}
}
}
}

View File

@@ -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);
}

View File

@@ -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;

View File

@@ -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('<br>') : 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: `
<tt-modal :show="true" @submit="submit" @update:show="$emit('close')" title="Status ändern">
<tt-modal :show="true" @submit="submit" @update:show="$emit('close')" title="Status ändern" :save-loading="submitLoading">
<tt-loader :absolute="false" v-if="!order"/>
<template v-else>
<tt-select label="Neuer Status" v-model="newStatus" :options="availableStatuses" sm row/>
@@ -199,7 +202,7 @@ Vue.component('change-status-modal', {
</div>
<tt-textarea label="Bemerkung*" v-model="note" sm/>
<tt-textarea label="Bemerkung" v-model="note" sm/>
<div v-if="newStatus === 'partiallyDelivered' || newStatus === 'fullyDelivered'">
<h4>Positionen</h4>
@@ -256,7 +259,7 @@ Vue.component('warehouse-order-modal', {
<tt-modal :show="true"
@submit="submit"
@delete="deleteOrder"
:delete="id !== 'create'"
:delete="false"
:title="id === 'create' ? 'Bestellung erstellen' : \`Bestellung #\${id} bearbeiten\`"
@update:show="$emit('close')">
<div style="width: 99%">
@@ -550,7 +553,7 @@ Vue.component('warehouse-order', {
<tt-table-crud emit-edit
@openpdf="openPDF"
@changeStatus="changeStatusModalId = $event.id"
@edit="orderModalId = $event.id" ref="table">
@edit="orderModalId = $event.id; $refs.table.$refs.table.refreshTable()" ref="table">
<template v-slot:expandedRow="{ row }">
<warehouse-order-detail :id="row.id"/>
</template>
@@ -566,9 +569,12 @@ Vue.component('warehouse-order', {
if (JSON.parse(localStorage.getItem('WarehouseOrder_create'))) this.orderModalId = 'create';
},
methods: {
closeModal() {
async closeModal() {
console.log("hi");
this.orderModalId = null;
this.changeStatusModalId = null;
console.log("hi");
await new Promise(resolve => setTimeout(resolve, 250));
this.$refs.table.$refs.table.refreshTable();
},
calculateSum: positions => positions.reduce((sum, {amount, buyPrice}) => sum + amount * buyPrice, 0),

View File

@@ -164,8 +164,7 @@ Vue.component('linked-order-status', {
//language=Vue
template: `
<div>
<span v-for="order in orders"
:key="order.id"
<span v-for="(order, index) in orders" :key="order.id" :class="{ 'mt-1': index > 0 }"
class="badge badge-pill badge-primary mr-1">{{ order.orderNumber }} - {{ statusTranslations[order.status] }}</span>
</div>`
});

View File

@@ -5,6 +5,7 @@ Vue.component('tt-modal', {
delete: {type: Boolean, default: true},
deleteText: {type: String, default: 'Löschen'},
save: {type: Boolean, default: true},
saveLoading: {type: Boolean, default: false},
saveText: {type: String, default: 'Speichern'},
}, watch: {
show(newVal) {