Skip to content
Code-Schnipsel Gruppen Projekte

Revisionen vergleichen

Änderungen werden so angezeigt, als ob die Quellrevision mit der Zielrevision zusammengeführt würde. Erfahre mehr über den Vergleich von Revisionen.

Quelle

Zielprojekt auswählen
No results found

Ziel

Zielprojekt auswählen
  • quiqqer/order
1 Ergebnis
Änderungen anzeigen
Commits auf Quelle (56)
werden angezeigt mit 474 Ergänzungen und 211 Löschungen
......@@ -138,7 +138,7 @@ function ($orderId, $data) {
if (isset($data['shippingStatus']) && $data['shippingStatus'] !== false) {
try {
$Order->setShippingStatus($data['shippingStatus']);
$Order->setShippingStatus((int)$data['shippingStatus']);
// Send status notification
if (!empty($data['notificationShipping']) && class_exists('QUI\ERP\Shipping\Shipping')) {
......@@ -157,6 +157,10 @@ function ($orderId, $data) {
$Order->setData('shippingTracking', $data['shippingTracking']);
}
if (!empty($data['project_name'])) {
$Order->setAttribute('project_name', $data['project_name']);
}
if (!empty($data['shipping'])) {
try {
if (
......
......@@ -48,6 +48,144 @@
</table>
</form>
<form>
<table class="data-table data-table-flexbox order-data">
<thead>
<tr>
<th>{{textOrderData}}</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<label class="field-container">
<span class="field-container-item" title="{{textOrderDate}}">
{{textOrderDate}}
</span>
<span class="field-container-field field-container-field-no-padding">
<input class=""
type="text"
name="date"
value="{{date}}"
disabled
style="width: calc(100% - 50px); float: left"
/>
<button type="button" name="edit-date" class="qui-button" style="width: 50px">
<span class="fa fa-edit"></span>
</button>
</span>
</label>
</td>
</tr>
<tr>
<td>
<label class="field-container">
<span class="field-container-item" title="{{textProjectName}}">
{{textProjectName}}
</span>
<input class="field-container-field"
type="text"
name="project_name"
value="{{project_name}}"
/>
</label>
</td>
</tr>
<tr>
<td>
<label class="field-container">
<span class="field-container-item" title="{{textOrderedBy}}">
{{textOrderedBy}}
</span>
<input class="field-container-field"
type="text"
name="orderedBy"
value="{{ordered_by}}"
disabled
/>
</label>
</td>
</tr>
<tr>
<td>
<label class="field-container">
<span class="field-container-item" title="{{textStatus}}">
{{textStatus}}
</span>
<span class="field-container-field field-container-field-no-padding order-data-status-field">
<span class="order-data-status-field-colorPreview"></span>
<select name="status" class="order-data-status-field-select" disabled></select>
</span>
</label>
</td>
</tr>
</tbody>
</table>
<table class="data-table data-table-flexbox order-shipping" style="display: none">
<thead>
<tr>
<th>{{textShippingStatusTitle}}</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<label class="field-container">
<span class="field-container-item" title="{{textShippingStatus}}">
{{textShippingStatus}}
</span>
<span class="field-container-field field-container-field-no-padding order-data-shipping-status-field">
<span class="order-data-shipping-status-field-colorPreview"></span>
<select type="text" class="field-container-field" name="shippingStatus" disabled></select>
</span>
</label>
</td>
</tr>
<tr>
<td>
<label class="field-container">
<span class="field-container-item" title="{{textShipping}}">
{{textShipping}}
</span>
<select type="text" class="field-container-field" name="shipping"></select>
</label>
</td>
</tr>
<tr>
<td>
<label class="field-container">
<span class="field-container-item" title="{{textShippingTracking}}">
{{textShippingTracking}}
</span>
<input type="text"
class="field-container-field"
name="shippingTracking"
{{#isShippingInstalled}}
data-qui="package/quiqqer/shipping/bin/backend/controls/TrackingInput"
{{/isShippingInstalled}}
/>
</label>
</td>
</tr>
<tr>
<td>
<button name="shippingConfirmationButton"
class="qui-button"
style="float: right"
disabled
>
<span class="fa fa-truck"></span>
<span>{{textShippingConfirmationButton}}</span>
</button>
</td>
</tr>
</tbody>
</table>
</form>
<form name="invoice">
<table class="data-table data-table-flexbox order-invoice"
data-qui="package/quiqqer/order/bin/backend/controls/panels/order/Address"
......@@ -245,130 +383,6 @@
</table>
</form>
<form>
<table class="data-table data-table-flexbox order-data">
<thead>
<tr>
<th>{{textOrderData}}</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<label class="field-container">
<span class="field-container-item" title="{{textOrderDate}}">
{{textOrderDate}}
</span>
<span class="field-container-field field-container-field-no-padding">
<input class=""
type="text"
name="date"
value="{{date}}"
disabled
style="width: calc(100% - 50px); float: left"
/>
<button type="button" name="edit-date" class="qui-button" style="width: 50px">
<span class="fa fa-edit"></span>
</button>
</span>
</label>
</td>
</tr>
<tr>
<td>
<label class="field-container">
<span class="field-container-item" title="{{textOrderedBy}}">
{{textOrderedBy}}
</span>
<input class="field-container-field"
type="text"
name="orderedBy"
value="{{ordered_by}}"
disabled
/>
</label>
</td>
</tr>
<tr>
<td>
<label class="field-container">
<span class="field-container-item" title="{{textStatus}}">
{{textStatus}}
</span>
<span class="field-container-field field-container-field-no-padding order-data-status-field">
<span class="order-data-status-field-colorPreview"></span>
<select name="status" class="order-data-status-field-select" disabled></select>
</span>
</label>
</td>
</tr>
</tbody>
</table>
<table class="data-table data-table-flexbox order-shipping" style="display: none">
<thead>
<tr>
<th>{{textShippingStatusTitle}}</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<label class="field-container">
<span class="field-container-item" title="{{textShippingStatus}}">
{{textShippingStatus}}
</span>
<span class="field-container-field field-container-field-no-padding order-data-shipping-status-field">
<span class="order-data-shipping-status-field-colorPreview"></span>
<select type="text" class="field-container-field" name="shippingStatus" disabled></select>
</span>
</label>
</td>
</tr>
<tr>
<td>
<label class="field-container">
<span class="field-container-item" title="{{textShipping}}">
{{textShipping}}
</span>
<select type="text" class="field-container-field" name="shipping"></select>
</label>
</td>
</tr>
<tr>
<td>
<label class="field-container">
<span class="field-container-item" title="{{textShippingTracking}}">
{{textShippingTracking}}
</span>
<input type="text"
class="field-container-field"
name="shippingTracking"
{{#isShippingInstalled}}
data-qui="package/quiqqer/shipping/bin/backend/controls/TrackingInput"
{{/isShippingInstalled}}
/>
</label>
</td>
</tr>
<tr>
<td>
<button name="shippingConfirmationButton"
class="qui-button"
style="float: right"
disabled
>
<span class="fa fa-truck"></span>
<span>{{textShippingConfirmationButton}}</span>
</button>
</td>
</tr>
</tbody>
</table>
</form>
<form name="payment">
<table class="data-table data-table-flexbox order-payment">
<thead>
......
......@@ -52,6 +52,7 @@ define('package/quiqqer/order/bin/backend/controls/panels/Order', [
'openInfo',
'openHistory',
'openPreview',
'openOrderFiles',
'openCommunication',
'openArticles',
'openDeleteDialog',
......@@ -231,6 +232,7 @@ define('package/quiqqer/order/bin/backend/controls/panels/Order', [
this.setAttribute('status', orderData.status);
this.setAttribute('shippingStatus', orderData.shippingStatus);
this.setAttribute('shippingConfirmation', orderData.shippingConfirmation);
this.setAttribute('project_name', orderData.project_name);
this.$initialStatus = parseInt(orderData.status);
this.$initialShippingStatus = parseInt(orderData.shippingStatus);
......@@ -282,6 +284,7 @@ define('package/quiqqer/order/bin/backend/controls/panels/Order', [
shipping: this.getAttribute('shipping'),
shippingTracking: this.getAttribute('shippingTracking'),
cDate: this.getAttribute('cDate'),
project_name: this.getAttribute('project_name'),
priceFactors: this.$serializedList.priceFactors
};
......@@ -304,7 +307,7 @@ define('package/quiqqer/order/bin/backend/controls/panels/Order', [
}
resolve();
this.refresh();
this.showSavedIconAnimation();
}).catch((err) => {
console.error(err);
......@@ -335,6 +338,14 @@ define('package/quiqqer/order/bin/backend/controls/panels/Order', [
self.Loader.show();
require([
'package/quiqqer/erp/bin/backend/controls/process/ProcessWindowButton'
], (ProcessWindowButton) => {
new ProcessWindowButton({
hash: this.getAttribute('orderId')
}).inject(this.getHeader());
});
this.$AddProduct = new QUIButtonMultiple({
textimage: 'fa fa-plus',
text: QUILocale.get(lg, 'panel.order.button.buttonAdd'),
......@@ -525,6 +536,15 @@ define('package/quiqqer/order/bin/backend/controls/panels/Order', [
}
});
this.addCategory({
name: 'orderFiles',
icon: 'fa fa-file-text-o',
text: QUILocale.get(lg, 'erp.panel.order.orderFiles'),
events: {
onClick: this.openOrderFiles
}
});
this.addCategory({
icon: 'fa fa fa-eye',
name: 'preview',
......@@ -784,6 +804,7 @@ define('package/quiqqer/order/bin/backend/controls/panels/Order', [
textOrderData: QUILocale.get(lg, 'panel.order.data.title'),
textOrderDate: QUILocale.get(lg, 'panel.order.data.date'),
textOrderedBy: QUILocale.get(lg, 'panel.order.data.orderedBy'),
textProjectName: QUILocale.get(lg, 'panel.order.data.textProjectName'),
textStatus: QUILocale.get(lg, 'panel.order.data.status'),
textPaymentTitle: QUILocale.get(lg, 'order.payment.panel.paymentTitle'),
textPayment: QUILocale.get(lg, 'order.payment.panel.payment'),
......@@ -813,11 +834,16 @@ define('package/quiqqer/order/bin/backend/controls/panels/Order', [
const DateField = Content.getElement('[name="date"]');
const DateEdit = Content.getElement('[name="edit-date"]');
const OrderedByField = Content.getElement('[name="orderedBy"]');
const ProjectName = Content.getElement('[name="project_name"]');
const customer = self.getAttribute('customer');
const Currency = Content.getElement('[name="currency"]');
Currency.value = self.getAttribute('currency');
if (self.getAttribute('project_name')) {
ProjectName.value = self.getAttribute('project_name');
}
if (customer) {
TaxId.value = '';
EUVAT.value = '';
......@@ -1265,6 +1291,50 @@ define('package/quiqqer/order/bin/backend/controls/panels/Order', [
});
},
/**
* Open order files category.
*/
openOrderFiles: function() {
this.Loader.show();
this.getCategory('orderFiles').setActive();
return this.$closeCategory().then((Container) => {
Container.setStyle('overflow', 'hidden');
Container.setStyle('padding', 20);
Container.setStyle('height', '100%');
const customerId = this.$Customer.getValue();
if (!customerId || customerId == 0) {
new Element('p', {
html: QUILocale.get(lg, 'erp.panel.order.files_no_customer')
}).inject(Container);
return;
}
return new Promise((resolve) => {
require(['package/quiqqer/erp/bin/backend/controls/customerFiles/Grid'], (FileGrid) => {
new FileGrid({
hash: this.getAttribute('hash')
}).inject(Container);
resolve();
});
});
}).then(() => {
this.Loader.hide();
return this.$openCategory();
}).catch((err) => {
console.error('ERROR');
console.error(err);
return this.$openCategory();
});
},
/**
* Open the post / invoice creation dialog
*/
......@@ -1590,6 +1660,7 @@ define('package/quiqqer/order/bin/backend/controls/panels/Order', [
const Content = this.getContent(),
deliverAddress = Content.getElement('[name="differentDeliveryAddress"]'),
PaymentForm = Content.getElement('form[name="payment"]'),
ProjectName = Content.getElement('[name="project_name"]'),
StatusNode = Content.getElement('[name="status"]'),
ShippingStatus = Content.getElement('[name="shippingStatus"]'),
Shipping = Content.getElement('[name="shipping"]'),
......@@ -1640,6 +1711,10 @@ define('package/quiqqer/order/bin/backend/controls/panels/Order', [
this.setAttribute('currency', Currency.value);
}
if (ProjectName) {
this.setAttribute('project_name', ProjectName.value);
}
// customer
if (this.$Customer) {
let customer = this.getAttribute('customer'),
......@@ -2195,5 +2270,4 @@ define('package/quiqqer/order/bin/backend/controls/panels/Order', [
//endregion
});
})
;
});
......@@ -68,8 +68,14 @@
width: 100%;
}
.td.clickable:hover .order-status {
border-color: #fff !important;
color: #fff !important;
}
/** product details
================================================= */
.orders-order-details {
border: 1px solid #DDDDDD;
float: left;
......
......@@ -598,44 +598,14 @@ define('package/quiqqer/order/bin/backend/controls/panels/Orders', [
const orderId = selected[0].hash;
new QUIConfirm({
title: QUILocale.get(lg, 'dialog.order.copy.title'),
text: QUILocale.get(lg, 'dialog.order.copy.text'),
information: QUILocale.get(lg, 'dialog.order.copy.information', {
id: orderId
}),
icon: 'fa fa-copy',
texticon: 'fa fa-copy',
maxHeight: 400,
maxWidth: 600,
autoclose: false,
ok_button: {
text: QUILocale.get('quiqqer/system', 'copy'),
textimage: 'fa fa-copy'
},
events: {
onSubmit: function(Win) {
Win.Loader.show();
Orders.copyOrder(orderId).then(function(newOrderId) {
require([
'package/quiqqer/order/bin/backend/controls/panels/Order',
'utils/Panels'
], function(Order, PanelUtils) {
const Panel = new Order({
orderId: newOrderId,
'#id': newOrderId
});
PanelUtils.openPanelInTasks(Panel);
Win.close();
});
}).then(function() {
Win.Loader.hide();
});
}
}
}).open();
require([
'package/quiqqer/erp/bin/backend/controls/dialogs/CopyErpEntityDialog'
], (CopyErpEntityDialog) => {
new CopyErpEntityDialog({
hash: orderId,
entityPlugin: 'quiqqer/order'
}).open();
});
},
/**
......@@ -1208,16 +1178,23 @@ define('package/quiqqer/order/bin/backend/controls/panels/Orders', [
},
{
header: QUILocale.get(lg, 'grid.hash'),
dataIndex: 'hash',
dataIndex: 'uuid',
dataType: 'string',
width: 280,
className: 'monospace'
},
{
header: QUILocale.get(lg, 'grid.globalProcessId'),
dataIndex: 'globalProcessId',
dataType: 'string',
width: 280,
className: 'monospace clickable'
},
{
header: QUILocale.get('quiqqer/system', 'id'),
dataIndex: 'id',
dataType: 'integer',
width: 80
hidden: true
},
{
dataIndex: 'paymentId',
......@@ -1415,6 +1392,23 @@ define('package/quiqqer/order/bin/backend/controls/panels/Orders', [
return;
}
if (typeof data !== 'undefined' && data.cell.get('data-index') === 'globalProcessId') {
const rowData = self.$Grid.getDataByRow(data.row);
if (rowData.globalProcessId && rowData.globalProcessId !== '') {
require([
'package/quiqqer/erp/bin/backend/controls/process/ProcessWindow'
], function(ProcessWindow) {
new ProcessWindow({
globalProcessId: rowData.globalProcessId
}).open();
});
return;
}
}
const selected = self.$Grid.getSelectedData();
if (selected.length) {
......
......@@ -58,6 +58,12 @@ define('package/quiqqer/order/bin/backend/controls/panels/order/Address', [
const self = this,
Elm = this.getElm();
function ignoreAutoFill(node)
{
node.role = 'presentation';
node.autocomplete = 'off';
}
this.$Firstname = Elm.getElement('[name="firstname"]');
this.$Lastname = Elm.getElement('[name="lastname"]');
this.$Company = Elm.getElement('[name="company"]');
......@@ -84,6 +90,13 @@ define('package/quiqqer/order/bin/backend/controls/panels/order/Address', [
this.$ZIP.disabled = false;
this.$City.disabled = false;
ignoreAutoFill(this.$Firstname);
ignoreAutoFill(this.$Lastname);
ignoreAutoFill(this.$Company);
ignoreAutoFill(this.$Street);
ignoreAutoFill(this.$ZIP);
ignoreAutoFill(this.$City);
Countries.getCountries().then(function(result) {
new Element('option', {
value: '',
......
......@@ -7,11 +7,12 @@ define('package/quiqqer/order/bin/backend/controls/panels/order/StatusWindow', [
'qui/QUI',
'qui/controls/windows/Confirm',
'package/quiqqer/order/bin/backend/ProcessingStatus',
'package/quiqqer/erp/bin/backend/utils/ERPEntities',
'package/quiqqer/order/bin/backend/Orders',
'Locale',
'Ajax'
], function(QUI, QUIConfirm, ProcessingStatus, Orders, QUILocale, QUIAjax) {
], function(QUI, QUIConfirm, ProcessingStatus, ERPEntities, Orders, QUILocale, QUIAjax) {
'use strict';
const lg = 'quiqqer/order';
......@@ -56,21 +57,35 @@ define('package/quiqqer/order/bin/backend/controls/panels/order/StatusWindow', [
this.Loader.show();
this.getContent().set('html', '');
new Element('p', {
html: QUILocale.get(lg, 'window.status.text', {
orderId: this.getAttribute('orderId')
})
}).inject(this.getContent());
let Select;
const Select = new Element('select', {
styles: {
display: 'block',
margin: '20px auto 0',
width: '80%'
}
}).inject(this.getContent());
return ERPEntities.getEntity(this.getAttribute('orderId'), 'quiqqer/order').then((data) => {
this.setAttributes({
icon: 'fa fa-check',
title: QUILocale.get(lg, 'window.status.title', {
orderId: data.prefixedNumber
})
});
this.refresh();
return ProcessingStatus.getList().then((statusList) => {
new Element('p', {
html: QUILocale.get(lg, 'window.status.text', {
orderId: data.prefixedNumber
})
}).inject(this.getContent());
Select = new Element('select', {
styles: {
display: 'block',
margin: '20px auto 0',
width: '80%'
}
}).inject(this.getContent());
}).then(() => {
return ProcessingStatus.getList();
}).then((statusList) => {
statusList = statusList.data;
new Element('option', {
......
......@@ -642,6 +642,8 @@ define('package/quiqqer/order/bin/frontend/controls/OrderProcess', [
* @return {Promise}
*/
next: function() {
this.setAttribute('direction', 'next');
if (this.$enabled === false) {
return Promise.resolve();
}
......@@ -690,6 +692,8 @@ define('package/quiqqer/order/bin/frontend/controls/OrderProcess', [
* @return {Promise}
*/
previous: function() {
this.setAttribute('direction', 'previous');
if (this.$enabled === false) {
return Promise.resolve();
}
......
......@@ -168,7 +168,9 @@ window.whenQuiLoaded().then(function() {
require(['package/quiqqer/order/bin/frontend/Basket'], function(Basket) {
Basket.addEvent('onAdd', function() {
getBasketData(Basket).then(function(data) {
window.qTrack('event', 'add_to_cart', data);
if (Basket.isLoaded()) {
window.qTrack('event', 'add_to_cart', data);
}
});
});
......@@ -219,7 +221,9 @@ window.whenQuiLoaded().then(function() {
QUI.addEvent('onQuiqqerOrderProductAdd', function(OrderProcess) {
getOrderData(OrderProcess).then((order) => {
window.qTrack('event', 'add_to_cart', order);
if (OrderProcess.isLoaded()) {
window.qTrack('event', 'add_to_cart', order);
}
});
});
......
......@@ -23,7 +23,8 @@
"php81_bc/strftime": "^0.7",
"ramsey/uuid": "^3|^4",
"quiqqer/core": "^2",
"quiqqer/erp": "^3.2",
"quiqqer/qui": "^1.6.7",
"quiqqer/erp": "^3.7.1",
"quiqqer/countries": "^2",
"quiqqer/areas": "^2",
"quiqqer/products": "^2",
......
......@@ -6,7 +6,7 @@
<field type="BIGINT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY">id</field>
<field type="VARCHAR(100) DEFAULT NULL">id_prefix</field>
<field type="VARCHAR(110) DEFAULT NULL">id_str</field>
<field type="BIGINT(10) NULL DEFAULT NULL">order_process_id</field>
<field type="VARCHAR(50) NULL DEFAULT NULL">order_process_id</field>
<field type="VARCHAR(50) NULL DEFAULT NULL">global_process_id</field>
<!-- Für aufgesplittete Bestellungen -->
......@@ -24,6 +24,7 @@
<field type="TEXT NULL">articles</field>
<field type="TEXT NULL">data</field>
<field type="VARCHAR(250) NULL">project_name</field>
<field type="INT(11) NULL DEFAULT NULL">payment_id</field>
<field type="VARCHAR(255) NULL DEFAULT NULL">payment_method</field>
......@@ -41,6 +42,7 @@
<field type="TEXT NULL">history</field>
<field type="TEXT NULL">comments</field>
<field type="TEXT NULL">custom_data</field>
<field type="TEXT NULL DEFAULT NULL">frontendMessages</field>
<field type="TEXT NULL">status_mails</field>
<field type="TEXT NULL">currency_data</field>
......
......@@ -40,6 +40,10 @@
fire="\QUI\ERP\Order\EventHandling::onQuiqqerErpGetCommentsByUser"
/>
<event on="onQuiqqerSalesOrdersSaveEnd"
fire="\QUI\ERP\Order\EventHandling::onQuiqqerSalesOrdersSaveEnd"
/>
<event on="onQuiqqer::products::product::detail::equipment::buttons"
fire="\QUI\ERP\Order\EventHandling::onDetailEquipmentButtons"
/>
......
<?xml version="1.0" encoding="UTF-8"?>
<locales xmlns="https://doc.quiqqer.com/xml/quiqqer-quiqqer-locale.xsd">
<groups name="quiqqer/order" datatype="php,js">
<locale name="package.title">
<de><![CDATA[QUIQQER - Shop - Bestellungen]]></de>
......@@ -32,6 +31,15 @@
<de><![CDATA[Bestellungen]]></de>
<en><![CDATA[Orders]]></en>
</locale>
<locale name="erp.panel.order.orderFiles">
<de><![CDATA[Dateien]]></de>
<en><![CDATA[Files]]></en>
</locale>
<locale name="erp.panel.order.files_no_customer">
<de>
<![CDATA[Bitte wähle zuerst einen Kunden für diese Bestellung aus, um Dateien verknüpfen zu können.]]></de>
<en><![CDATA[Please select a customer for this order first to be able to attach files.]]></en>
</locale>
<locale name="panel.order.currency.title">
<de><![CDATA[Währung]]></de>
<en><![CDATA[Currency]]></en>
......@@ -430,6 +438,32 @@
<en><![CDATA[Order copy [orderHash] created from order]]></en>
</locale>
<locale name="permission.quiqqer.order._header">
<de><![CDATA[Shop - Bestellungen]]></de>
<en><![CDATA[Shop - Order]]></en>
</locale>
<locale name="permission.quiqqer.order.addPayment">
<de><![CDATA[Darf Zahlungsweisen hinzufügen]]></de>
<en><![CDATA[]]></en>
</locale>
<locale name="permission.quiqqer.order.update">
<de><![CDATA[Darf Bestellungen editieren]]></de>
<en><![CDATA[May add payment methods]]></en>
</locale>
<locale name="permission.quiqqer.order.delete">
<de><![CDATA[Darf Bestellungen löschen]]></de>
<en><![CDATA[May delete orders]]></en>
</locale>
<locale name="permission.quiqqer.order.copy">
<de><![CDATA[Darf Bestellungen kopieren]]></de>
<en><![CDATA[May copy orders]]></en>
</locale>
<locale name="permission.quiqqer.order.create">
<de><![CDATA[Darf Bestellungen erstellen]]></de>
<en><![CDATA[May create orders]]></en>
</locale>
</groups>
<groups name="quiqqer/order" datatype="php">
......@@ -1272,8 +1306,8 @@
</locale>
<locale name="order.confirmation.admin.subject">
<de><![CDATA[Es wurde eine Bestellung aufgegeben: [orderId]]]></de>
<en><![CDATA[An order was placed: [orderId]]]></en>
<de><![CDATA[Es wurde eine Bestellung aufgegeben: [orderPrefixedId]]]></de>
<en><![CDATA[An order was placed: [orderPrefixedId]]]></en>
</locale>
<locale name="order.confirmation.admin.body" html="true">
<de><![CDATA[
......@@ -1444,7 +1478,7 @@
<locale name="shipping.order.mail.body.shippingInformation" html="true">
<de><![CDATA[
<p>Du kannst den Versandstatus deiner Bestellunter unter [trackingLink] verfolgen.</p>
<p>Du kannst den Versandstatus deiner Bestellung unter [trackingLink] verfolgen.</p>
]]></de>
<en><![CDATA[
<p>You can track the shipping status of your order under [trackingLink]</p>.
......@@ -1575,6 +1609,10 @@
<de><![CDATA[Bestellstatus]]></de>
<en><![CDATA[Order status]]></en>
</locale>
<locale name="panel.order.data.textProjectName">
<de><![CDATA[Projektname]]></de>
<en><![CDATA[Project name]]></en>
</locale>
<locale name="panel.order.shipping">
<de><![CDATA[Versandart]]></de>
<en><![CDATA[Shipping type]]></en>
......@@ -1720,6 +1758,10 @@
<en><![CDATA[Payment data]]></en>
</locale>
<locale name="grid.hash">
<de><![CDATA[Hash]]></de>
<en><![CDATA[Hash]]></en>
</locale>
<locale name="grid.globalProcessId">
<de><![CDATA[Vorgangsnummer]]></de>
<en><![CDATA[Procedure number]]></en>
</locale>
......@@ -2367,20 +2409,19 @@
</locale>
<locale name="window.status.title">
<de><![CDATA[Status Änderung für Bestellung #[orderId]]]></de>
<en><![CDATA[Status change for order #[orderId]]]></en>
<de><![CDATA[Status Änderung für Bestellung: [orderId]]]></de>
<en><![CDATA[Status change for order: [orderId]]]></en>
</locale>
<locale name="window.status.text">
<locale name="window.status.text" html="true">
<de><![CDATA[
Wechsel den Status der Bestellung #[orderId].
Wechsel den Status der Bestellung <strong>[orderId]</strong>.
Beachte, Statusänderungen können verschiedene Aktionen auslösen.
]]></de>
<en><![CDATA[
Change the status of the order #[orderId].
Change the status of the order <strong>[orderId]</strong>.
Note, status changes can trigger different actions.
]]></en>
</locale>
</groups>
</locales>
......@@ -282,6 +282,14 @@ protected function setDataBaseData(array $data): void
$this->status = $data['status'];
}
if (isset($data['project_name'])) {
$this->setAttribute('project_name', $data['project_name']);
}
if (!empty($data['order_process_id'])) {
$this->setAttribute('order_process_id', $data['order_process_id']);
}
// user
$this->customerId = $data['customerId'];
......@@ -695,6 +703,7 @@ public function toArray(): array
'comments' => $this->getComments()->toArray(),
'statusMails' => $this->getStatusMails()->toArray(),
'currency' => $this->getCurrency()->toArray(),
'project_name' => $this->getAttribute('project_name'),
'articles' => $articles,
'hasDeliveryAddress' => $this->hasDeliveryAddress(),
......@@ -965,9 +974,9 @@ public function getUUID(): string
/**
* Return the customer of the order
*
* @return QUI\ERP\User
* @return null|QUI\ERP\User
*/
public function getCustomer(): QUI\ERP\User
public function getCustomer(): ?QUI\ERP\User
{
$Nobody = QUI\ERP\User::convertUserToErpUser(QUI::getUsers()->getNobody());
......@@ -1177,7 +1186,12 @@ public function setCustomer(QUI\Interfaces\Users\User|array|User $User): void
// if something is missing
if (!empty($missing)) {
try {
$Customer = QUI::getUsers()->get($User['id']);
if (!empty($User['uuid'])) {
$Customer = QUI::getUsers()->get($User['uuid']);
} else {
$Customer = QUI::getUsers()->get($User['id']);
}
if (isset($User['address'])) {
$address = $User['address'];
......
......@@ -68,17 +68,16 @@ public function __construct(bool|int $basketId, QUI\Interfaces\Users\User $User
$User = QUI::getUserBySession();
}
$this->List = new ProductList();
$this->List->duplicate = true;
if (!QUI::getUsers()->isUser($User) || $User->getType() == QUI\Users\Nobody::class) {
return;
}
$this->List = new ProductList();
$this->List->duplicate = true;
$this->List->setUser($User);
$this->FrontendMessages = new QUI\ERP\Comments();
try {
$data = Handler::getInstance()->getBasketData($basketId, $User);
} catch (QUI\Exception $Exception) {
......@@ -138,9 +137,9 @@ public function count(): int
/**
* Return the product list
*
* @return ProductList|null
* @return ProductList
*/
public function getProducts(): ?ProductList
public function getProducts(): ProductList
{
return $this->List;
}
......
......@@ -9,6 +9,11 @@
>
{locale group="quiqqer/erp" var="article.list.articles.header.pos"}
</th>
<th class="quiqqer-order-basket-articles-header-image"
title="{locale group='quiqqer/erp' var='article.list.articles.header.image'}"
>
{locale group="quiqqer/erp" var="article.list.articles.header.image"}
</th>
<th class="quiqqer-order-basket-articles-header-information"
title="{locale group='quiqqer/erp' var='article.list.articles.header.description'}"
>
......@@ -43,6 +48,11 @@
>
{$pos}
</td>
<td class="quiqqer-order-basket-articles-article-image"
data-label="{locale group='quiqqer/erp' var='article.list.articles.header.image'}"
>
{image src=$product.imageSrc width=200 height=200 class="quiqqer-order-basket-articles-article-image__img"}
</td>
<td class="quiqqer-order-basket-articles-article-data"
data-label="{locale group='quiqqer/erp' var='article.list.articles.header.description'}"
>
......
......@@ -6,6 +6,7 @@
namespace QUI\ERP\Order\Controls\Basket;
use Exception;
use QUI;
use QUI\ERP\Order\Basket\Basket;
use QUI\ERP\Order\Basket\BasketGuest;
......@@ -43,8 +44,9 @@ public function setBasket(Basket|BasketGuest|BasketOrder $Basket): void
/**
* @return string
* @throws QUI\Exception
* @throws Exception
*/
protected function onCreate(): string
public function getBody(): string
{
$Engine = QUI::getTemplateManager()->getEngine();
......@@ -98,11 +100,15 @@ public function setProject(QUI\Projects\Project $Project): void
/**
* @return QUI\Projects\Project
*
* @throws Exception
*/
protected function getProject(): QUI\Projects\Project
{
return $this->Project;
if ($this->Project) {
return $this->Project;
}
return parent::getProject();
}
//endregion
......
......@@ -20,7 +20,10 @@
use function count;
use function defined;
use function explode;
use function is_array;
use function is_numeric;
use function is_string;
use function json_decode;
use function ltrim;
use function mb_strpos;
use function parse_url;
......@@ -508,6 +511,60 @@ public static function onQuiqqerErpGetCommentsByUser(
}
}
public static function onQuiqqerSalesOrdersSaveEnd(QUI\ERP\SalesOrders\SalesOrder $SalesOrder): void
{
$orderId = $SalesOrder->getData('orderId');
if (empty($orderId)) {
return;
}
try {
$Order = QUI\ERP\Order\Handler::getInstance()->get($orderId);
} catch (QUI\Exception) {
return;
}
// sales order shipping
$shippingTracking = $Order->getDataEntry('shippingTracking');
$soShippingTracking = $SalesOrder->getData('shippingTracking');
if (is_string($soShippingTracking)) {
$soShippingTracking = json_decode($soShippingTracking, true);
}
if (is_string($shippingTracking)) {
$shippingTracking = json_decode($shippingTracking, true);
}
try {
// set shipping tracking
if (
is_array($soShippingTracking)
&& is_array($shippingTracking)
&& isset($soShippingTracking['number'])
&& isset($shippingTracking['number'])
&& isset($soShippingTracking['type'])
&& isset($shippingTracking['type'])
&& ($soShippingTracking['number'] !== $shippingTracking['number']
|| $soShippingTracking['type'] !== $shippingTracking['type'])
) {
$Order->setData('shippingTracking', $soShippingTracking);
}
// set shipping
if ($SalesOrder->getShipping()) {
$Order->setShipping($SalesOrder->getShipping());
}
$Order->update(QUI::getUsers()->getSystemUser());
if ($SalesOrder->getShippingStatus()) {
$Order->setShippingStatus($SalesOrder->getShippingStatus()); // triggers update :-/
}
} catch (QUI\Exception) {
}
}
/**
* @throws QUI\Database\Exception
......
......@@ -79,7 +79,7 @@ public function create(
$Config = QUI::getPackage('quiqqer/order')->getConfig();
$orderId = $Config->getValue('order', 'orderCurrentIdIndex');
if (empty($orderId)) {
if (empty($orderId) && $orderId != 0) {
$orderId = 0;
} else {
$orderId = (int)$orderId + 1;
......
......@@ -764,8 +764,9 @@ public function getOrderProcessData(int|string $orderId): array
{
$result = QUI::getDataBase()->fetch([
'from' => $this->tableOrderProcess(),
'where' => [
'id' => $orderId
'where_or' => [
'id' => $orderId,
'hash' => $orderId
],
'limit' => 1
]);
......