diff --git a/application/WarehouseEShopOrder/WarehouseEShopOrderController.php b/application/WarehouseEShopOrder/WarehouseEShopOrderController.php index 0d37e5e3d..e590c48b0 100644 --- a/application/WarehouseEShopOrder/WarehouseEShopOrderController.php +++ b/application/WarehouseEShopOrder/WarehouseEShopOrderController.php @@ -27,6 +27,7 @@ class WarehouseEShopOrderController extends TTCrud { protected array $additionalActions = [ ['key' => 'openHistory', 'title' => 'Historie', 'class' => 'fas fa-history text-primary'], + ['key' => 'openSingleOrderEmail', 'title' => 'Bestellbestätigung', 'class' => 'fas fa-envelope text-primary'], ]; protected array $infoMessages = [ @@ -48,6 +49,50 @@ class WarehouseEShopOrderController extends TTCrud { $this->columns[8]['modal']['items'] = $users; } + 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; + $id = $this->request->id; + + $order = WarehouseEShopOrderModel::get($id); + $orderItems = WarehouseEShopOrderItemModel::getAll(['orderId' => $id]); + $articles = WarehouseArticleModel::getAll(); + $articlePackets = WarehouseArticlePacketModel::getAll(); + + $paddedId = str_pad($id, 3, '0', STR_PAD_LEFT); + $body = "Bestellung #$paddedId\n\n"; + $body .= "Lieferadresse:\n"; + $body .= $order->deliveryAddressName . "\n"; + $body .= $order->deliveryAddressLine . "\n"; + $body .= $order->deliveryAddressPLZ . ' ' . $order->deliveryAddressCity . "\n\n"; + $body .= "Bestellte Artikel:\n"; + foreach ($orderItems as $item) { + $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; + $body .= "$quantity x $articleTitle\n"; + } + $body .= "\n\n"; + $body .= "CSV der Bestellung ist im Anhang.\n\n"; + $body .= "XINON GmbH\nFladnitz im Raabtal 150\n8322 Studenzen\n"; + + if ($isDryRun) { + self::returnJson(['success' => true, 'message' => 'E-Mail Body wurde erstellt', 'body' => $body]); + } else { + $email = new Emailnotification(); + $email->setSubject("Bestellbestätigung Bestellung #$paddedId"); + $email->setBody($body); + $email->setFrom(TT_OUTGOING_EMAIL_2FA, TT_OUTGOING_EMAIL_2FA); +// $email->setTo('ftth-versand@triotronik.com'); + $email->setTo('luca.haid@xinon.eu'); + $csvContent = $this->CSVExportNewOrdersMarkAcceptedAction(true, [$id]); + $email->addAttachment(null, $csvContent, "Bestellung_$paddedId.csv", "text/csv"); + self::returnJson(['success' => true, 'message' => 'E-Mail wurde versendet']); + } + } + protected function getAllOrderItemsPerOrder(): array { $items = WarehouseEShopOrderItemModel::getAll(); $articles = WarehouseArticleModel::getAll(); @@ -146,13 +191,14 @@ class WarehouseEShopOrderController extends TTCrud { $user = UserModel::getOne($json['createBy']); - - $email = new Emailnotification(); - $email->setSubject("Bestellbestätigung Bestellung #$subjectId"); - $email->setBody($body); - $email->setFrom(TT_OUTGOING_EMAIL_2FA, TT_OUTGOING_EMAIL_2FA); - $email->setTo($user->email); - $email->send(); + foreach (["office@xinon.at", $user->email] as $emailAddr) { + $email = new Emailnotification(); + $email->setSubject("Bestellbestätigung Bestellung #$subjectId"); + $email->setBody($body); + $email->setFrom(TT_OUTGOING_EMAIL_2FA, TT_OUTGOING_EMAIL_2FA); + $email->setTo($emailAddr); + $email->send(); + } self::returnJson(['success' => true, 'message' => $this->infoMessages['create'], @@ -162,12 +208,18 @@ class WarehouseEShopOrderController extends TTCrud { die(json_encode($json)); } - protected function CSVExportNewOrdersMarkAcceptedAction() { + protected function CSVExportNewOrdersMarkAcceptedAction($returnCSV = false, $orderIds = []) { $orders = WarehouseEShopOrderModel::getAll(['status' => 'new']); $orders = array_map(function($order) { return (array) $order; }, $orders); + if (!empty($orderIds)) { + $orders = array_filter($orders, function($order) use ($orderIds) { + return in_array($order['id'], $orderIds); + }); + } + if (empty($orders)) { self::returnJson(['success' => false, 'message' => 'Keine neuen Bestellungen']); die(); @@ -210,6 +262,10 @@ class WarehouseEShopOrderController extends TTCrud { WarehouseEShopOrderModel::update($order); } + if ($returnCSV) { + return Helper::arrayToCsv($rows); + } + self::returnJson($rows); } diff --git a/lib/Helper/Helper.php b/lib/Helper/Helper.php index b63e05c81..de447bf20 100644 --- a/lib/Helper/Helper.php +++ b/lib/Helper/Helper.php @@ -135,5 +135,26 @@ class Helper { $controller->layout()->setTemplate("VueViews/Vue"); } + /** + * Converts an array of objects to a CSV file. + * @param array $rows The array of objects to convert to CSV. + * @return string The CSV file content. + */ + public static function arrayToCsv(array $rows): string { + $output = fopen('php://temp', 'w'); + // Add headers + fputcsv($output, array_keys((array) $rows[0])); + + // Add rows + foreach ($rows as $row) { + fputcsv($output, (array) $row); + } + + rewind($output); + $csv = stream_get_contents($output); + fclose($output); + + return $csv; + } } \ No newline at end of file diff --git a/public/js/pages/WarehouseEShop/WarehouseEShop.js b/public/js/pages/WarehouseEShop/WarehouseEShop.js index b2299c39a..23bbe02b1 100644 --- a/public/js/pages/WarehouseEShop/WarehouseEShop.js +++ b/public/js/pages/WarehouseEShop/WarehouseEShop.js @@ -103,10 +103,10 @@ Vue.component('warehouse-e-shop', { const response = await axios.post(`${window['TT_CONFIG']['BASE_PATH']}/WarehouseEShopOrder/createOrder`, { shoppingCart: this.shoppingCart, deliveryMode: this.createOrderDialogData.deliveryMode, - deliveryAddressName: this.createOrderDialogData.deliveryAddressName, - deliveryAddressLine: this.createOrderDialogData.deliveryAddressLine, - deliveryAddressPLZ: this.createOrderDialogData.deliveryAddressPLZ, - deliveryAddressCity: this.createOrderDialogData.deliveryAddressCity, + deliveryAddressName: this.createOrderDialogData.deliveryAddressName.trim(), + deliveryAddressLine: this.createOrderDialogData.deliveryAddressLine.trim(), + deliveryAddressPLZ: this.createOrderDialogData.deliveryAddressPLZ.trim(), + deliveryAddressCity: this.createOrderDialogData.deliveryAddressCity.trim(), }); if (response.data.success) { this.window.notify('success', response.data.message || 'Erfolgreich gespeichert'); diff --git a/public/js/pages/WarehouseEShopOrder/WarehouseEShopOrder.js b/public/js/pages/WarehouseEShopOrder/WarehouseEShopOrder.js index 5e8bc1878..adda88c16 100644 --- a/public/js/pages/WarehouseEShopOrder/WarehouseEShopOrder.js +++ b/public/js/pages/WarehouseEShopOrder/WarehouseEShopOrder.js @@ -3,7 +3,9 @@ Vue.component('warehouse-e-shop-order', { //language=Vue template: ` - +