diff --git a/application/WarehouseEShopOrder/WarehouseEShopOrderController.php b/application/WarehouseEShopOrder/WarehouseEShopOrderController.php index 5f2817398..125f809d6 100644 --- a/application/WarehouseEShopOrder/WarehouseEShopOrderController.php +++ b/application/WarehouseEShopOrder/WarehouseEShopOrderController.php @@ -42,6 +42,7 @@ class WarehouseEShopOrderController extends TTCrud { protected array $additionalActions = [['key' => 'openHistory', 'title' => 'Historie', 'class' => 'fas fa-history text-primary'], ['key' => 'showTrackingHistory', 'title' => 'Tracking Historie', 'class' => 'fas fa-truck text-primary'], + ['key' => 'createShippingNote', 'title' => 'Lieferschein erstellen', 'class' => 'fas fa-file-invoice text-primary'], ['key' => 'openSingleOrderEmail', 'title' => 'Bestellbestätigung', 'class' => 'fas fa-envelope text-primary'],]; protected array $infoMessages = ['create' => 'Bestellung wurde erfolgreich erstellt, sie erhalten in Kürze eine Bestätigungsmail', @@ -61,6 +62,75 @@ class WarehouseEShopOrderController extends TTCrud { $this->columns[10]['modal']['items'] = $users; } + protected function createShippingNote() { + $id = $this->request->id; + if (!$id) { + self::returnJson(['success' => false, 'message' => 'Keine ID angegeben']); + die(); + } + + $existingShippingNote = WarehouseShippingNoteModel::getAll(['eShopOrderId' => $id]); + if (!empty($existingShippingNote)) { + self::returnJson(['success' => false, 'message' => 'Für diese Bestellung existiert bereits ein Lieferschein', 'shippingNoteId' => $existingShippingNote[0]->id]); + die(); + } + + $order = WarehouseEShopOrderModel::get($id); + $orderItems = WarehouseEShopOrderItemModel::getAll(['orderId' => $id]); + + $articles = WarehouseArticleModel::getAll(); + $articlePackets = WarehouseArticlePacketModel::getAll(); + + $positions = []; + foreach ($orderItems as $item) { + $newEntry = []; + $article = $item->articleId ? array_search($item->articleId, array_column($articles, 'id')) : null; + $articlePacket = $item->articlePacketId ? array_search($item->articlePacketId, array_column($articlePackets, 'id')) : null; + + $articleTitle = $item->articleId ? $articles[$article]->title : $articlePackets[$articlePacket]->title; + $quantity = $item->quantity; + $price = 0; + if ($item->articleId) { + $cheapestSellPrice = json_decode($articles[$article]->cheapestSellPrice, true); + foreach ($cheapestSellPrice as $price) { + if ($price['title'] === 'Energie Steiermark') { + $price = $price['price']; + break; + } + } + } else { + $price = $articlePackets[$articlePacket]->overrideSellPrice ?? $articlePackets[$articlePacket]->calculatedSellPrice; + } + + if ($item->articleId) { + $newEntry['article'] = $item->articleId; + } else { + $newEntry['articlePacket'] = $item->articlePacketId; + } + $newEntry['amount'] = $quantity; + $newEntry['price'] = $price; + + $positions[] = $newEntry; + } + + $positions = json_encode($positions); + + $shippingNoteId = WarehouseShippingNoteModel::create(['billingAddressId' => 3265, + 'deliveryAddressName' => $order->deliveryAddressName, + 'deliveryAddressLine' => $order->deliveryAddressLine, + 'deliveryAddressPLZ' => $order->deliveryAddressPLZ, + 'deliveryAddressCity' => $order->deliveryAddressCity, + 'status' => 'new', + 'positions' => $positions, + 'textElements' => '[]', + 'eShopOrderId' => $id, + 'create' => time(), + 'createBy' => $this->user->id]); + + self::returnJson(['success' => true, 'message' => 'Lieferschein wurde erstellt', 'shippingNoteId' => $shippingNoteId]); + + } + protected function singleOrderEmailAction() { // this has dryRun and id in get parameter create a E-Mail Body like the things below $isDryRun = $this->request->dryRun ?? false; @@ -110,7 +180,6 @@ class WarehouseEShopOrderController extends TTCrud { } - protected function CSVExportNewOrdersMarkAcceptedAction($returnCSV = false, $orderIds = []) { ini_set('display_errors', 1); ini_set('display_startup_errors', 1); @@ -318,6 +387,18 @@ class WarehouseEShopOrderController extends TTCrud { self::returnJson((new WarehouseHistoryController)->getHistory($this->request->id, $this->mod, $this->columns)); } + protected function fetchGLSTrackingAction() { + $orderId = $this->request->id; + + $order = WarehouseEShopOrderModel::get($orderId); + $trackingNumber = $order->trackingNumber; + $plz = $order->deliveryAddressPLZ; + + $tracking = $this->GLSTrackingApi($trackingNumber, $plz); + $this->checkAndUpdateTrackingState($tracking, $orderId); + die($tracking); + } + protected function GLSTrackingApi($trackingNumber, $plz) { $url = "https://gls-group.eu/app/service/open/rest/AT/de/rstt028/$trackingNumber?postalCode=$plz"; return file_get_contents($url); @@ -342,18 +423,6 @@ class WarehouseEShopOrderController extends TTCrud { } } - protected function fetchGLSTrackingAction() { - $orderId = $this->request->id; - - $order = WarehouseEShopOrderModel::get($orderId); - $trackingNumber = $order->trackingNumber; - $plz = $order->deliveryAddressPLZ; - - $tracking = $this->GLSTrackingApi($trackingNumber, $plz); - $this->checkAndUpdateTrackingState($tracking, $orderId); - die($tracking); - } - protected function readGLSEmailAction() { $host = '{mail.xinon.at:993/imap/ssl/novalidate-cert}INBOX'; $mbox = imap_open($host, 'eshop-versand@xinon.at', 'savemanfb545aw'); @@ -408,7 +477,9 @@ class WarehouseEShopOrderController extends TTCrud { // END TRACKING NUMBER PARSING - $orders = WarehouseEShopOrderModel::getAll(['deliveryAddressLine' => $addressLine, 'deliveryAddressPLZ' => $plz, 'deliveryAddressCity' => $city]); + $orders = WarehouseEShopOrderModel::getAll(['deliveryAddressLine' => $addressLine, + 'deliveryAddressPLZ' => $plz, + 'deliveryAddressCity' => $city]); if (empty($orders)) { continue; } diff --git a/application/WarehouseShippingNote/WarehouseShippingNoteController.php b/application/WarehouseShippingNote/WarehouseShippingNoteController.php index 2ddbb44b9..374ebef3c 100644 --- a/application/WarehouseShippingNote/WarehouseShippingNoteController.php +++ b/application/WarehouseShippingNote/WarehouseShippingNoteController.php @@ -182,11 +182,19 @@ class WarehouseShippingNoteController extends TTCrud { // loop through all positions and add articleTitle and articleDescription to each position entry foreach (json_decode($shippingNote->positions, true) as $position) { - $article = WarehouseArticleModel::get($position['article']); - $position['articleTitle'] = $article->title; - $position['articleDescription'] = $article->description; - $position['articleUnit'] = $article->unit; - $positions[] = $position; + if (isset($position['article'])) { + $article = WarehouseArticleModel::get($position['article']); + $position['articleTitle'] = $article->title; + $position['articleDescription'] = $article->description === $article->title ? "" : $article->description; + $position['articleUnit'] = $article->unit; + $positions[] = $position; + } elseif (isset($position['articlePacket'])) { + $articlePacket = WarehouseArticlePacketModel::get($position['articlePacket']); + $position['articleTitle'] = $articlePacket->title; + $position['articleDescription'] = $articlePacket->description === $articlePacket->title ? "" : $articlePacket->description; + $position['articleUnit'] = 'Stk.'; + $positions[] = $position; + } } $textElements = []; diff --git a/application/WarehouseShippingNote/WarehouseShippingNoteModel.php b/application/WarehouseShippingNote/WarehouseShippingNoteModel.php index 8e284d797..e97115139 100644 --- a/application/WarehouseShippingNote/WarehouseShippingNoteModel.php +++ b/application/WarehouseShippingNote/WarehouseShippingNoteModel.php @@ -10,6 +10,7 @@ class WarehouseShippingNoteModel extends TTCrudBaseModel { public string $status; // 'new'|'accepted'|'invoiced' public string $positions; public string $textElements; + public ?int $eShopOrderId; public int $create; public int $createBy; } diff --git a/db/migrations/20241010100000_shipping_note_add_order_id.php b/db/migrations/20241010100000_shipping_note_add_order_id.php new file mode 100644 index 000000000..0b2dac6a0 --- /dev/null +++ b/db/migrations/20241010100000_shipping_note_add_order_id.php @@ -0,0 +1,23 @@ +getEnvironment() == "thetool") { + $WarehouseShippingNote = $this->table("WarehouseShippingNote"); + $WarehouseShippingNote->addColumn('eShopOrderId', 'integer', ['null' => true]); + $WarehouseShippingNote->update(); + } + } + + public function down(): void { + if ($this->getEnvironment() == "thetool") { + $WarehouseShippingNote = $this->table("WarehouseShippingNote"); + $WarehouseShippingNote->removeColumn('eShopOrderId'); + $WarehouseShippingNote->update(); + } + } +} \ No newline at end of file diff --git a/public/js/pages/WarehouseEShopOrder/WarehouseEShopOrder.js b/public/js/pages/WarehouseEShopOrder/WarehouseEShopOrder.js index 65a63fba1..b8ae92fcd 100644 --- a/public/js/pages/WarehouseEShopOrder/WarehouseEShopOrder.js +++ b/public/js/pages/WarehouseEShopOrder/WarehouseEShopOrder.js @@ -5,6 +5,7 @@ Vue.component('warehouse-e-shop-order', { @@ -84,6 +85,14 @@ Vue.component('warehouse-e-shop-order', { const response = await axios.get(`${window['TT_CONFIG']['BASE_PATH']}/WarehouseEShopOrder/getAllItemsPerOrder`); this.articleItems = response.data; }, methods: { + async createShippingNote(id) { + const response = await axios.get(`${window['TT_CONFIG']['BASE_PATH']}/WarehouseEShopOrder/createShippingNote?id=${id}`); + + window.notify(response.data.success === true ? 'success' : 'info', response.data.message); + if (response.data.shippingNoteId) { + window.open(`${window['TT_CONFIG']['BASE_PATH']}/WarehouseShippingNote/createPDF?id=${response.data.shippingNoteId}&price=true`, '_blank'); + } + }, async sendSingleOrderEmail() { const response = await axios.get(`${window['TT_CONFIG']['BASE_PATH']}/WarehouseEShopOrder/singleOrderEmail?id=${this.singleOrderEmailModalId}`); if (response.data.message) { diff --git a/public/js/pages/WarehouseShippingNote/WarehouseShippingNote.js b/public/js/pages/WarehouseShippingNote/WarehouseShippingNote.js index 9d36a2e2f..d55c81643 100644 --- a/public/js/pages/WarehouseShippingNote/WarehouseShippingNote.js +++ b/public/js/pages/WarehouseShippingNote/WarehouseShippingNote.js @@ -19,7 +19,7 @@ Vue.component('warehouse-shipping-note-positions', { positions: Array }, data() { return { - articleData: {}, loading: false + articleData: {}, loading: false, articlePacketData: {} } }, template: `
@@ -30,15 +30,20 @@ Vue.component('warehouse-shipping-note-positions', {
  • - {{ position.amount }}x {{ articleData[position.article]?.text }} + {{ position.amount }}x {{ position.article ? articleData[position.article]?.text : articlePacketData[position.articlePacket]?.text }}
`, async mounted() { this.loading = true; for (const position of this.positions) { - const response = await axios.get(window.TT_CONFIG["BASE_PATH"] + '/WarehouseArticle/autoComplete?searchedID=' + position.article); - this.$set(this.articleData, position.article, response.data[0]); + if (position.article) { + const response = await axios.get(window.TT_CONFIG["BASE_PATH"] + '/WarehouseArticle/autoComplete?searchedID=' + position.article); + this.$set(this.articleData, position.article, response.data[0]); + } else if (position.articlePacket) { + const response = await axios.get(window.TT_CONFIG["BASE_PATH"] + '/WarehouseArticlePacket/autoComplete?searchedID=' + position.articlePacket); + this.$set(this.articlePacketData, position.articlePacket, response.data[0]); + } } this.loading = false; } @@ -58,7 +63,9 @@ Vue.component('warehouse-shipping-note', { :api-url="window.TT_CONFIG['BASE_PATH'] + '/Address/Api?do=findAddress'" label="Rechnungsadresse" sm row/> -