'id', 'text' => 'ID', 'modal' => false], ['key' => 'extRef', 'text' => 'Externe Referenz', 'required' => true], ['key' => 'status', 'text' => 'Status', 'required' => true, 'modal' => ['type' => 'select', 'items' => [['value' => 'new', 'text' => 'Neu'], ['value' => 'accepted', 'text' => 'An Lieferant übergeben'], ['value' => 'sent', 'text' => 'Gesendet'], ['value' => 'done', 'text' => 'Erledigt'],]], 'table' => ['filter' => 'select']], ['key' => 'deliveryMode', 'text' => 'Liefermodus', 'required' => true, 'modal' => ['type' => 'select', 'items' => [['value' => 'singleAddress', 'text' => 'Einzelne Adresse'], // ['value' => 'multipleAddresses', 'text' => 'Mehrere Adressen'], ]]], ['key' => 'deliveryAddressName', 'text' => 'Name', 'required' => true], ['key' => 'deliveryAddressLine', 'text' => 'Adresse', 'required' => true, 'required_length' => 4], ['key' => 'deliveryAddressPLZ', 'text' => 'PLZ', 'required' => true, 'regex' => '/^\d{4}$/'], ['key' => 'deliveryAddressCity', 'text' => 'Stadt', 'required' => true, 'required_length' => 3], ['key' => 'create', 'text' => 'Erstellt', 'required' => true, 'modal' => false, 'filter' => 'datetime'], ['key' => 'createBy', 'text' => 'Erstellt von', 'required' => true, 'table' => ['filter' => 'select'], 'modal' => ['type' => 'select', 'items' => []]], ['key' => 'actions', 'text' => 'Aktionen', 'required' => false, 'modal' => false, 'table' => ['filter' => false, 'sortable' => false, 'class' => 'text-center']],]; 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 = ['create' => 'Bestellung wurde erfolgreich erstellt, sie erhalten in Kürze eine Bestätigungsmail', 'update' => 'Bestellung wurde aktualisiert', 'delete' => 'Bestellung wurde gelöscht', 'noChanges' => 'Keine Änderungen',]; public function permissionCheck(): bool { return $this->user->can(["WarehouseEShop"]); } protected function prepareCrudConfig() { $users = array_map(function ($user) { return ['value' => intval($user->id), 'text' => $user->name]; }, UserModel::search()); $this->columns[9]['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 { foreach (["ftth-versand@triotronik.com", "einkauf@xinon.at"] as $emailAddr) { $email = new Emailnotification(); $email->setSubject("Bestellbestätigung Bestellung #$paddedId"); $email->setBody($body); $email->setFrom(TT_OUTGOING_EMAIL_2FA, TT_OUTGOING_EMAIL_2FA); $email->setTo($emailAddr); $csvContent = $this->CSVExportNewOrdersMarkAcceptedAction(true, [$id]); $csvContent = utf8_decode($csvContent); $email->addAttachment(null, $csvContent, "Bestellung_$paddedId.csv", "text/csv", "attachment", "base64", "utf-8"); $email->send(); } self::returnJson(['success' => true, 'message' => 'E-Mail wurde versendet']); } } 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)) { $msg = ''; switch (count($orderIds)) { case 0: $msg = 'Keine neuen Bestellungen'; break; case 1: $msg = 'Keine neue Bestellung mit dieser ID gefunden'; break; default: $msg = 'Keine neuen Bestellungen mit diesen IDs gefunden'; break; } self::returnJson(['success' => false, 'message' => $msg]); die(); } $ordersItems = $this->getAllOrderItemsPerOrder(); $rows = []; foreach ($orders as $order) { $orderItems = $ordersItems[$order['id']]; $orderItemsStr = join('; ', array_map(function ($item) { $articleTitle = $item['articleTitle'] ?? $item['articlePacketTitle']; $quantity = $item['quantity']; return "$quantity x $articleTitle"; }, $orderItems)); $rows[] = ['AddressNumber' => '23000539', 'Name' => $order['deliveryAddressName'], 'Straße' => $order['deliveryAddressLine'], 'Postleitzahl' => $order['deliveryAddressPLZ'], 'Ort' => $order['deliveryAddressCity'], 'Land' => 'AT', 'Anschriftenzusatz 1' => '', 'Produkte' => $orderItemsStr]; WarehouseHistoryModel::create(['table' => 'WarehouseEShopOrder', 'row_id' => $order['id'], 'key' => 'status', 'old_value' => 'new', 'new_value' => 'accepted', 'note' => 'CSV Export', 'user_id' => $this->user->id, 'create' => time()]); $order['status'] = 'accepted'; WarehouseEShopOrderModel::update($order); } if ($returnCSV) { return Helper::arrayToCsv($rows); } self::returnJson($rows); } protected function getAllOrderItemsPerOrder(): array { $items = WarehouseEShopOrderItemModel::getAll(); $articles = WarehouseArticleModel::getAll(); $articlePackets = WarehouseArticlePacketModel::getAll(); $orderItems = []; foreach ($items as $item) { $item = (array) $item; if (!isset($orderItems[$item['orderId']])) { $orderItems[$item['orderId']] = []; } $article = $item['articleId'] ? array_search($item['articleId'], array_column($articles, 'id')) : null; $articlePacket = $item['articlePacketId'] ? array_search($item['articlePacketId'], array_column($articlePackets, 'id')) : null; $orderItems[$item['orderId']][] = ['id' => $item['id'], 'articleId' => $item['articleId'], 'articleTitle' => isset($articles[$article]) ? $articles[$article]->title : null, 'articlePacketId' => $item['articlePacketId'], 'articlePacketTitle' => isset($articlePackets[$articlePacket]) ? $articlePackets[$articlePacket]->title : null, 'quantity' => $item['quantity']]; } return $orderItems; } protected function getAllItemsPerOrderAction() { $orderItems = $this->getAllOrderItemsPerOrder(); self::returnJson($orderItems); } protected function createOrderAction() { //TODO: change this to beforeCreate and afterCreate $json = json_decode(file_get_contents('php://input'), true); $shoppingCart = $json['shoppingCart']; unset($json['shoppingCart']); $json['status'] = 'new'; $json['create'] = time(); $json['createBy'] = $this->user->id; Helper::validateArray($json, $this->getCheckArray()); $id = WarehouseEShopOrderModel::create(['status' => 'new', 'extRef' => $json['extRef'], 'deliveryMode' => $json['deliveryMode'], 'deliveryAddressName' => $json['deliveryAddressName'], 'deliveryAddressLine' => $json['deliveryAddressLine'], 'deliveryAddressPLZ' => $json['deliveryAddressPLZ'], 'deliveryAddressCity' => $json['deliveryAddressCity'], 'create' => $json['create'], 'createBy' => $json['createBy'],]); // now create WarehouseEShopOrderItems for each item in the shopping cart foreach ($shoppingCart as $item) { // itemId can either be P-[PACKETID] or I-[ARTICLEID] // parse this and either fill articleId or articlePacketId for warehouseEShopOrderItem if (strpos($item['itemId'], 'P-') === 0) { WarehouseEShopOrderItemModel::create(['orderId' => $id, 'articlePacketId' => intval(substr($item['itemId'], 2)), 'quantity' => intval($item['amount']),]); } else if (strpos($item['itemId'], 'I-') === 0) { WarehouseEShopOrderItemModel::create(['orderId' => $id, 'articleId' => intval(substr($item['itemId'], 2)), 'quantity' => intval($item['amount']),]); } else { self::returnJson(['success' => false, 'message' => 'Invalid item id']); die(); } } // send confirmation email $subjectId = str_pad($id, 3, '0', STR_PAD_LEFT); // create email body with all items (use $shoppingCart) $body = "Bestellung #$subjectId\n\nIhre Referenz: " . $json['extRef'] . "\n\n"; $body .= "Lieferadresse:\n"; $body .= $json['deliveryAddressName'] . "\n"; $body .= $json['deliveryAddressLine'] . "\n"; $body .= $json['deliveryAddressPLZ'] . ' ' . $json['deliveryAddressCity'] . "\n\n"; $body .= "Bestellte Artikel:\n"; foreach ($shoppingCart as $item) { $body .= $item['amount'] . ' x ' . $item['title'] . "\n"; } $body .= "\n\n"; $body .= "Bestellung wurde nun zur weitere Bearbeitung angenommen.\n"; $body .= "XINON GmbH"; $user = UserModel::getOne($json['createBy']); foreach (["office@xinon.at", $user->email] as $emailAddr) { $email = new Emailnotification(); $email->setSubject("Bestellbestätigung Bestellung #$subjectId - Referenz: " . $json['extRef']); $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'], 'id' => $id]); $json['id'] = $id; die(json_encode($json)); } protected function beforeUpdate($postData): bool { (new WarehouseHistoryController)->create($postData, $this->mod); return true; } protected function getHistoryAction() { self::returnJson((new WarehouseHistoryController)->getHistory($this->request->id, $this->mod, $this->columns)); } }