From 4a819f7295a38dbcf0e479586f09ec3ebde73bf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mathias=20Gla=CC=88ser?= Date: Wed, 30 Sep 2026 20:11:15 +0200 Subject: [PATCH] Marktbezug im Bestellungsdrawer anzeigen --- modules/erp/bestellungen/service.php | 10 ++++++++++ modules/shared/auth/ui/home.php | 4 +++- 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/modules/erp/bestellungen/service.php b/modules/erp/bestellungen/service.php index 091dfef..c586b55 100644 --- a/modules/erp/bestellungen/service.php +++ b/modules/erp/bestellungen/service.php @@ -394,6 +394,8 @@ function get_sales_order_detail(PDO $pdo, int $orderId): ?array so.amount_discount, so.total_amount, so.currency, + md.name AS market_name, + mday.date AS market_occurrence_day_date, COALESCE(ad.first_name, '') AS first_name, COALESCE(ad.last_name, '') AS last_name, COALESCE(ad.street, '') AS street, @@ -413,6 +415,10 @@ function get_sales_order_detail(PDO $pdo, int $orderId): ?array ) ad ON TRUE LEFT JOIN payment_method pm ON pm.id = so.payment_method_id LEFT JOIN shipping_method sm ON sm.id = so.shipping_method_id + LEFT JOIN market_occurrence mo ON mo.id = so.market_occurrence_id + LEFT JOIN market_definition md ON md.id = mo.market_definition_id + LEFT JOIN market_occurrence_day mday + ON mday.id = so.market_occurrence_day_id AND mday.occurrence_id = mo.id WHERE so.id = :order_id" ); $orderStmt->execute([':order_id' => $orderId]); @@ -499,6 +505,10 @@ function get_sales_order_detail(PDO $pdo, int $orderId): ?array 'payment_status' => (string) $order['payment_status'], 'payment_method' => (string) $order['payment_method'], 'shipping_method' => (string) $order['shipping_method'], + 'market' => [ + 'name' => $order['market_name'] !== null ? (string) $order['market_name'] : null, + 'occurrence_day_date' => $order['market_occurrence_day_date'] !== null ? (string) $order['market_occurrence_day_date'] : null, + ], 'customer' => [ 'first_name' => (string) $order['first_name'], 'last_name' => (string) $order['last_name'], diff --git a/modules/shared/auth/ui/home.php b/modules/shared/auth/ui/home.php index a36fc2a..268f21a 100644 --- a/modules/shared/auth/ui/home.php +++ b/modules/shared/auth/ui/home.php @@ -1457,12 +1457,14 @@ JS; echo " const orderId = trigger.dataset.orderId || '';"; echo " const formatAmount = (value, currency) => value === null || value === undefined ? 'Nicht vorhanden' : currency + ' ' + Number(value).toFixed(2);"; echo " const formatDate = (value) => value ? new Date(value).toLocaleString('de-CH', { dateStyle: 'short', timeStyle: 'short' }) : 'Nicht vorhanden';"; + echo " const formatMarketDay = (value) => value ? new Date(value + 'T00:00:00').toLocaleDateString('de-CH') : '';"; echo " const value = (label, content) => '
' + escapeHtml(label) + '
' + escapeHtml(content || 'Nicht vorhanden') + '
';"; echo " const renderCards = (order) => {"; echo " const c = order.customer || {}; const a = order.amounts || {}; const address = [[c.street, c.house_number].filter(Boolean).join(' '), [c.zip, c.city].filter(Boolean).join(' '), c.country_name].filter(Boolean).map(escapeHtml).join('
');"; echo " const lines = (order.lines || []).map((line) => '
' + value(line.item_name, [line.item_code, 'Menge: ' + String(line.qty)].filter(Boolean).join(' · ')) + value('Positionsstatus', line.line_status) + value('Einzelpreis', formatAmount(line.unit_price, a.currency || 'CHF')) + value('Positionssumme', formatAmount(line.line_total, a.currency || 'CHF')) + '
').join('');"; echo " const allocations = (order.lines || []).flatMap((line) => (line.product_allocations || []).map((item) => '
' + value(item.product_name, [item.lot_number || 'Nicht zugeordnet', item.allocated_qty === null ? 'Nicht zugeordnet' : String(item.allocated_qty), item.allocation_status || 'Nicht vorhanden', item.lot_status === 'virtual_shortage' ? 'Virtuelle Fehlbestandscharge' : ''].filter(Boolean).join(' · ')) + '
')).join('');"; - echo " return '
Bestellübersicht
' + value('Bestellnummer', order.external_ref) + value('Bestelldatum', formatDate(order.order_date)) + value('Verkaufskanal', order.order_source) + value('Bestellstatus', order.order_status) + value('Zahlungsstatus', order.payment_status) + value('Zahlungsart', order.payment_method) + value('Versandart', order.shipping_method) + value('Kunde', [c.first_name, c.last_name].filter(Boolean).join(' ')) + '
Lieferadresse
' + (address || 'Nicht vorhanden') + '
' + value('Netto', formatAmount(a.net, a.currency || 'CHF')) + value('Versand', formatAmount(a.shipping, a.currency || 'CHF')) + value('Rabatt', formatAmount(a.discount, a.currency || 'CHF')) + value('Steuer', formatAmount(a.tax, a.currency || 'CHF')) + value('Gesamtsumme', formatAmount(a.total, a.currency || 'CHF')) + '
Bestellte Artikel
' + (lines || '

Keine Artikel vorhanden.

') + '
Chargenzuordnung
' + (allocations || '

Keine Chargenzuordnung vorhanden.

') + '
';"; + echo " const market = order.market || {}; const marketReference = market.name && market.occurrence_day_date ? market.name + ', Marktdurchführung ' + formatMarketDay(market.occurrence_day_date) : 'kein Marktbezug';"; + echo " return '
Bestellübersicht
' + value('Bestellnummer', order.external_ref) + value('Bestelldatum', formatDate(order.order_date)) + value('Verkaufskanal', order.order_source) + value('Bestellstatus', order.order_status) + value('Zahlungsstatus', order.payment_status) + value('Zahlungsart', order.payment_method) + value('Versandart', order.shipping_method) + value('Kunde', [c.first_name, c.last_name].filter(Boolean).join(' ')) + '
Lieferadresse
' + (address || 'Nicht vorhanden') + '
' + value('Netto', formatAmount(a.net, a.currency || 'CHF')) + value('Versand', formatAmount(a.shipping, a.currency || 'CHF')) + value('Rabatt', formatAmount(a.discount, a.currency || 'CHF')) + value('Steuer', formatAmount(a.tax, a.currency || 'CHF')) + value('Gesamtsumme', formatAmount(a.total, a.currency || 'CHF')) + value('Markt:', marketReference) + '
Bestellte Artikel
' + (lines || '

Keine Artikel vorhanden.

') + '
Chargenzuordnung
' + (allocations || '

Keine Chargenzuordnung vorhanden.

') + '
';"; echo " };"; echo " setDrawerState(true);"; echo " if (drawerTitle) { drawerTitle.textContent = trigger.dataset.orderNumber ? 'Bestellung ' + trigger.dataset.orderNumber : 'Bestellung'; }";