'id', 'text' => 'Bestellnummer', 'table' => ['filter' => false], 'modal' => false], ['key' => 'addressId', 'text' => 'Kunde', 'required' => false, 'type' => 'autocomplete', 'table' => ['class' => 'text-nowrap', 'filter' => 'autocomplete'], 'modal' => ['apiUrl' => 'Address/api?do=findAddress&fibu_primary_account=1', 'items' => '/Address/Api?do=findAddress&fibu_primary_account=1', 'type' => 'autocomplete']], ['key' => 'purpose', 'text' => 'Verwendungszweck', 'required' => true], ['key' => 'note', 'text' => 'Notiz', 'required' => false], ['key' => 'positions', 'text' => 'Positionen', 'required' => true, 'modal' => ['type' => 'positions-manager', 'config' => [ 'header' => 'Positionen', 'fields' => [ 'articleId' => [ 'apiUrl' => '/WarehouseArticle/autoComplete', 'type' => 'autocomplete', 'emitDisplayValue' => true, 'customFieldReference' => 'WarehouseArticle', 'label' => 'Artikel', ], 'amount' => ['type' => 'input', 'label' => 'Menge', 'inputType' => 'number'], 'purpose' => ['type' => 'input', 'label' => 'Zweck'], ], 'validateFormOptions' => [ ['key' => 'articleId', 'message' => 'Bitte füllen Sie den Artikel aus'], ['key' => 'amount', 'message' => 'Bitte füllen Sie die Menge aus'], ], ]], 'table' => false], ['key' => 'linkedOrderIds', 'text' => 'Verlinkte Bestellung', 'modal' => false], ['key' => 'createBy', 'text' => 'Erstellt von', 'required' => true, 'modal' => ['visible' => false, 'type' => 'select'], 'table' => ['filter' => 'select']], ['key' => 'create', 'text' => 'Erstellt am', 'required' => true, 'modal' => false], ['key' => 'cancelled', 'text' => 'Storniert', 'modal' => ['visible' => false, 'type' => 'icon-select', 'items' => [ ['value' => 0, 'text' => 'Bestellwunsch nicht storniert', 'icon' => 'fa-regular fa-circle-check text-success'], ['value' => 1, 'text' => 'Bestellwunsch storniert', 'icon' => 'fa-regular fa-circle-xmark text-danger']]], 'table' => ['filter' => 'iconSelect'] ], ['key' => 'done', 'text' => 'Erledigt', 'modal' => ['visible' => false, 'type' => 'icon-select', 'items' => [ ['value' => 0, 'text' => 'Bestellwunsch nicht erledigt', 'icon' => 'fa-regular fa-circle-xmark text-danger'], ['value' => 1, 'text' => 'Bestellwunsch erledigt', 'icon' => 'fa-regular fa-circle-check text-success']]], 'table' => ['filter' => 'iconSelect'] ], ['key' => 'actions', 'text' => 'Aktionen', 'required' => false, 'modal' => false, 'table' => ['filter' => false, 'sortable' => false, 'class' => 'text-center']], ]; //@formatter:on protected array $permissionCheck = ['WarehouseUser']; protected array $defaultOrder = ['key' => 'create', 'order' => 'DESC']; protected array $additionalActions = [ ['key' => 'openHistory', 'title' => 'Historie', 'class' => 'fas fa-history text-primary'], ['key' => 'createLog', 'title' => 'Log-Eintrag erstellen', 'class' => 'fas fa-plus text-primary'], ]; protected function prepareCrudConfig() { $this->additionalJSVariables = [ 'user_id' => $this->user->id, 'BASE_URL' => '/WarehouseOrderRequest', 'WAREHOUSE_ADMIN' => $this->user->can('WarehouseAdmin') ]; } protected function beforeUpdate($postData): bool { (new WarehouseHistoryController)->create($postData, $this->mod); return true; } protected function cancelAction() { $id = filter_var($this->request->id, FILTER_VALIDATE_INT); $cancel = filter_var($this->request->cancel, FILTER_VALIDATE_INT, ['options' => ['min_range' => 0, 'max_range' => 1]]); if (!$id || $cancel === false) self::returnJson(['error' => 'Ungültige Anfrage']); if (!(WarehouseOrderRequest::get($id))) self::returnJson(['error' => 'Bestellwunsch nicht gefunden']); $currentData = (array) WarehouseOrderRequest::get($id); WarehouseOrderRequest::update(array_merge($currentData, ['id' => $id, 'cancelled' => $cancel])); self::returnJson(['success' => true]); } public function customAutoCompleteAddressId($id): array { $address = new Address($id); return ['title' => $address->getCompanyOrName(), 'value' => $address->id]; } protected function doneAction() { $id = filter_var($this->request->id, FILTER_VALIDATE_INT); $done = filter_var($this->request->done, FILTER_VALIDATE_INT, ['options' => ['min_range' => 0, 'max_range' => 1]]); if (!$id || $done === false) self::returnJson(['error' => 'Ungültige Anfrage']); if (!(WarehouseOrderRequest::get($id))) self::returnJson(['error' => 'Bestellwunsch nicht gefunden']); $currentData = (array) WarehouseOrderRequest::get($id); WarehouseOrderRequest::update(array_merge($currentData, ['id' => $id, 'done' => $done])); self::returnJson(['success' => true]); } private function getPHPMailer() { $mail = new PHPMailer\PHPMailer\PHPMailer(true); try { // Server settings $mail->isSMTP(); $mail->Host = TT_WAREHOUSE_ORDER_SMTP_HOST; $mail->SMTPAuth = true; $mail->Username = TT_WAREHOUSE_ORDER_SMTP_USER; $mail->Password = TT_WAREHOUSE_ORDER_SMTP_PASS; $mail->SMTPSecure = PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_STARTTLS; $mail->Port = 587; return $mail; } catch (Exception $e) { self::returnJson(['error' => 'Mailer Error: ' . $mail->ErrorInfo]); exit; } } protected function afterCreate($orderRequest) { try { $mail = $this->getPHPMailer(); $mail->setFrom('einkauf@xinon.at', 'XINON Einkauf'); $mail->addAddress('einkauf@xinon.at', 'XINON Einkauf'); $mail->isHTML(true); $mail->Subject = "Neuer Bestellwunsch #" . $orderRequest['id'] . " von " . $this->user->name . ' eingelangt'; // build html table and fetch articleId if set else use articleId_text if its a text article $html = ''; $html .= ''; foreach ($orderRequest['positions'] as $position) { $articleId = isset($position['articleId']) ? WarehouseArticleModel::get($position['articleId'])->title : $position['articleId_text']; $html .= ''; $html .= ''; $html .= ''; $html .= ''; $html .= ''; } $html .= '
ArtikelMengeZweck
' . htmlspecialchars($articleId) . '' . htmlspecialchars($position['amount']) . '' . htmlspecialchars($position['purpose']) . '
'; // Set the HTML content $mail->Body = "Neuer Bestellwunsch #" . $orderRequest['id'] . " von " . $this->user->name . ' eingelangt

' . 'Notiz: ' . htmlspecialchars($orderRequest['note']) . '

' . $html; // Send the email if (!$mail->send()) { self::returnJson(['error' => 'Message could not be sent. Mailer Error: ' . $mail->ErrorInfo]); exit; } } catch (Exception $e) { self::returnJson(['error' => 'Message could not be sent. Mailer Error: ' . $mail->ErrorInfo]); exit; } } protected function createNewLogAction() { $postData = json_decode(file_get_contents('php://input'), true); if (empty($postData['orderRequestId']) || empty($postData['note'])) { self::returnJson(['error' => 'Order Request ID is required']); return; } // send email to einkauf@xinon.at // Instantiate PHPMailer $mail = new PHPMailer\PHPMailer\PHPMailer(true); try { // Server settings $mail->isSMTP(); $mail->Host = TT_WAREHOUSE_ORDER_SMTP_HOST; $mail->SMTPAuth = true; $mail->Username = TT_WAREHOUSE_ORDER_SMTP_USER; $mail->Password = TT_WAREHOUSE_ORDER_SMTP_PASS; $mail->SMTPSecure = PHPMailer\PHPMailer\PHPMailer::ENCRYPTION_STARTTLS; $mail->Port = 587; // Recipients $mail->setFrom('einkauf@xinon.at', 'XINON Einkauf'); $mail->addAddress('einkauf@xinon.at', 'XINON Einkauf'); // Content $mail->isHTML(true); $mail->Subject = "Neue Nachricht zu Besteallwunsch #" . $postData['orderRequestId']; $mail->Body = $postData['note']; $mail->send(); } catch (Exception $e) { self::returnJson(['error' => 'Message could not be sent. Mailer Error: ' . $mail->ErrorInfo]); exit; } WarehouseLogModel::create([ "table" => "WarehouseOrderRequest", "rowId" => intval($postData['orderRequestId']), "type" => 'noChanges', "message" => $postData['note'], "createBy" => intval($this->user->id), "create" => time() ]); self::returnJson(['success' => 'Log entry created']); } protected function getLogByIdAction() { $orderRequestId = $this->request->orderRequestId; if (empty($orderRequestId)) { self::returnJson(['error' => 'Order ID is required']); return; } $log = WarehouseLogModel::getAll(['table' => 'WarehouseOrderRequest', 'rowId' => $orderRequestId]); self::returnJson($log); } protected function getHistoryAction() { $this->prepareCrudConfig(); self::returnJson((new WarehouseHistoryController)->getHistory($this->request->id, $this->mod, $this->columns)); } }