diff --git a/application/WarehouseOrder/WarehouseOrderController.php b/application/WarehouseOrder/WarehouseOrderController.php index 61801ca9a..e19e3c124 100644 --- a/application/WarehouseOrder/WarehouseOrderController.php +++ b/application/WarehouseOrder/WarehouseOrderController.php @@ -16,7 +16,7 @@ class WarehouseOrderController extends TTCrud { ['key' => 'delAddrName', 'text' => 'Name', 'required' => true, 'modal' => false, 'table' => false], ['key' => 'delAddrPLZ', 'text' => 'PLZ', 'required' => true, 'modal' => false, 'table' => false], ['key' => 'editor', 'text' => 'Bearbeiter', 'required' => true, 'modal' => ['type' => 'select'], 'table' => ['filter' => 'select']], - ['key' => 'note', 'text' => 'Notiz', 'required' => false, 'modal' => false, 'table' => false], + ['key' => 'note', 'text' => 'Interne Notiz', 'required' => false, 'modal' => false, 'table' => false], ['key' => 'sum', 'text' => 'Summe', 'required' => false, 'modal' => false, 'table' => ['class' => 'text-right']], ['key' => 'status', 'text' => 'Status', 'required' => false, 'modal' => ['type' => 'select', 'items' => [ ['value' => 'new', 'text' => 'Neu'], @@ -174,6 +174,37 @@ class WarehouseOrderController extends TTCrud { $order['positions'] = json_decode($order['positions'], true); $distributorName = WarehouseDistributorModel::get($order['distributorId'])->name; + $texts = [ + 'EN' => [ + 'taxFree' => 'Please provide tax-free delivery according to § 6a UStG (Austrian Sales tax law).
Our VAT ID number: ATU68711968. Delivery to Austria.', + 'orderConfirmation' => 'Please send the order confirmation to einkauf@xinon.at', + 'sendShippingNote' => 'Please send the delivery note with our shipping note and neutral packaging.', + ], + 'DE' => [ + 'taxFree' => 'Bitte um steuerfreie Lieferung gemäß § 6a UStG.
Unsere UID-Nr.: ATU68711968. Lieferung nach Österreich.', + 'orderConfirmation' => 'Wir bitten um Zusendung der Auftragsbestätigung für die Bestellung an einkauf@xinon.at.', + 'sendShippingNote' => 'Bitte senden Sie den Lieferschein mit unserem Versandschein und neutraler Verpackung.', + ]]; + + $countryText = (new Country(WarehouseDistributorModel::get($order['distributorId'])->countryId))->name; + $isGermanSpeaking = in_array($countryText, ['Österreich', 'Deutschland', 'Schweiz']); + + $appendToBody = ''; + if ($isGermanSpeaking && $countryText !== "Österreich") { + $appendToBody .= $texts['DE']['taxFree'] . '

'; + } else { + $appendToBody .= $texts['EN']['taxFree'] . '

'; + } + + $appendToBody .= $texts[$isGermanSpeaking ? 'DE' : 'EN']['orderConfirmation']; + + if ($order['sendShippingNote'] > 0) { + $appendToBody .= '

' . $texts[$isGermanSpeaking ? 'DE' : 'EN']['sendShippingNote']; + } + + $appendToBody .= $isGermanSpeaking ? '

Die Bestellung liegt als PDF-Anhang bei.' : '

The order is attached as a PDF file.'; + + // Instantiate PHPMailer $mail = new PHPMailer\PHPMailer\PHPMailer(true); @@ -208,7 +239,8 @@ class WarehouseOrderController extends TTCrud { Datum: " . date('d.m.Y H:i', $order['create']) . "
Lieferant: $distributorName

-

Die Bestellung liegt als PDF-Anhang bei.

+ +$appendToBody "; diff --git a/application/WarehouseOrderRequest/WarehouseOrderRequestController.php b/application/WarehouseOrderRequest/WarehouseOrderRequestController.php index feb051528..39c4eddf7 100644 --- a/application/WarehouseOrderRequest/WarehouseOrderRequestController.php +++ b/application/WarehouseOrderRequest/WarehouseOrderRequestController.php @@ -8,7 +8,7 @@ class WarehouseOrderRequestController extends TTCrud { //@formatter:off protected array $columns = [ ['key' => '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', 'items' => '/Address/Api?do=findAddress', 'type' => 'autocomplete']], + ['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' => 'positions', 'text' => 'Positionen', 'required' => true, 'modal' => ['type' => 'positions-manager', 'config' => [ 'header' => 'Positionen', @@ -26,7 +26,6 @@ class WarehouseOrderRequestController extends TTCrud { 'validateFormOptions' => [ ['key' => 'articleId', 'message' => 'Bitte füllen Sie den Artikel aus'], ['key' => 'amount', 'message' => 'Bitte füllen Sie die Menge aus'], - ['key' => 'purpose', 'message' => 'Bitte füllen Sie den Zweck aus'], ], ]], 'table' => false], ['key' => 'linkedOrderIds', 'text' => 'Verlinkte Bestellung', 'modal' => false], @@ -37,8 +36,8 @@ class WarehouseOrderRequestController extends TTCrud { ['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-check text-success'], - ['value' => 1, 'text' => 'Bestellwunsch erledigt', 'icon' => 'fa-regular fa-circle-xmark text-danger']]], 'table' => ['filter' => 'iconSelect'] + ['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']], ]; @@ -72,10 +71,16 @@ class WarehouseOrderRequestController extends TTCrud { if (!$id || $cancel === false) self::returnJson(['error' => 'Ungültige Anfrage']); if (!(WarehouseOrderRequestModel::get($id))) self::returnJson(['error' => 'Bestellwunsch nicht gefunden']); - WarehouseOrderRequestModel::update(['id' => $id, 'canceled' => $cancel]); + $currentData = (array) WarehouseOrderRequestModel::get($id); + WarehouseOrderRequestModel::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]]); @@ -83,7 +88,8 @@ class WarehouseOrderRequestController extends TTCrud { if (!$id || $done === false) self::returnJson(['error' => 'Ungültige Anfrage']); if (!(WarehouseOrderRequestModel::get($id))) self::returnJson(['error' => 'Bestellwunsch nicht gefunden']); - WarehouseOrderRequestModel::update(['id' => $id, 'done' => $done]); + $currentData = (array) WarehouseOrderRequestModel::get($id); + WarehouseOrderRequestModel::update(array_merge($currentData, ['id' => $id, 'done' => $done])); self::returnJson(['success' => true]); } @@ -95,6 +101,35 @@ class WarehouseOrderRequestController extends TTCrud { 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']), diff --git a/public/js/pages/WarehouseOrder/WarehouseOrder.css b/public/js/pages/WarehouseOrder/WarehouseOrder.css index 01feb970c..64dc99559 100644 --- a/public/js/pages/WarehouseOrder/WarehouseOrder.css +++ b/public/js/pages/WarehouseOrder/WarehouseOrder.css @@ -78,11 +78,11 @@ } .file-item i { - margin-right: 10px; - color: #6c757d; + color: #000000; } .file-name { + margin-left: 10px; flex-grow: 1; font-size: 14px; } diff --git a/public/js/pages/WarehouseOrder/WarehouseOrder.js b/public/js/pages/WarehouseOrder/WarehouseOrder.js index cb3152675..1b1d59a3f 100644 --- a/public/js/pages/WarehouseOrder/WarehouseOrder.js +++ b/public/js/pages/WarehouseOrder/WarehouseOrder.js @@ -46,6 +46,8 @@ Vue.component('change-status-modal', { return [ {value: 'noChanges', text: 'Keine Änderungen'}, {value: 'sent', text: 'Versendet'}, + {value: 'fullyDelivered', text: 'Geliefert'}, + {value: 'cancelled', text: 'Storniert'}, {value: 'cancelled', text: 'Storniert'}, ]; case 'sent': @@ -305,7 +307,7 @@ Vue.component('warehouse-order-modal', {
- + `, @@ -313,7 +315,7 @@ Vue.component('warehouse-order-modal', { data() { return { window: window, - showSendShippingNote: false, + showSendShippingNote: null, positionsConfig: { customOrdering: 'distributorId', fields: { @@ -356,7 +358,7 @@ Vue.component('warehouse-order-modal', { delAddrEMail: 'einkauf@xinon.at', note: '', editor: window.TT_CONFIG['USER_ID'], - sendShippingNote: false, + sendShippingNote: null, positions: [], } } @@ -381,7 +383,7 @@ Vue.component('warehouse-order-modal', { buyPrice: distributor.purchasePrice, distributorId: distributor.id, distributorArticleNumber: distributor.externalArticleNumber, - verwendung: `${p.purpose} [Bestellwunsch: #${orderRequest.id}]`, + verwendung: `${p.hasOwnProperty('purpose') ? p.purpose : ''} [Bestellwunsch: #${orderRequest.id}]`, linkedOrderRequestId: orderRequest.id }; })); diff --git a/public/js/pages/WarehouseOrderRequest/WarehouseOrderRequest.js b/public/js/pages/WarehouseOrderRequest/WarehouseOrderRequest.js index c973762fc..ce50dd91b 100644 --- a/public/js/pages/WarehouseOrderRequest/WarehouseOrderRequest.js +++ b/public/js/pages/WarehouseOrderRequest/WarehouseOrderRequest.js @@ -208,10 +208,6 @@ Vue.component('warehouse-order-request', { - - + `, data: () => ({