Erweitere Lager-Drawer um Warnungs- und Chargen-Cards
This commit is contained in:
1 parent
c3afd9e2bf
commit
7c998b8906
2 files changed
+47
-6
No files matched your search
@@ -73,9 +73,19 @@ function get_lager_product_overview(PDO $pdo): array
|
|||||||
p.sku,
|
p.sku,
|
||||||
p.uom,
|
p.uom,
|
||||||
COALESCE(SUM(v.qty_net), 0) AS available_qty,
|
COALESCE(SUM(v.qty_net), 0) AS available_qty,
|
||||||
|
sl.lot_number,
|
||||||
|
sl.supplier_lot_number,
|
||||||
sl.expiry_date,
|
sl.expiry_date,
|
||||||
sl.sellout_date,
|
sl.sellout_date,
|
||||||
sl.sellout_forecast_status
|
sl.sellout_forecast_status,
|
||||||
|
(
|
||||||
|
SELECT virtual_lot.lot_number
|
||||||
|
FROM stock_lot virtual_lot
|
||||||
|
WHERE virtual_lot.product_id = p.id
|
||||||
|
AND virtual_lot.status = 'virtual_shortage'
|
||||||
|
ORDER BY virtual_lot.id
|
||||||
|
LIMIT 1
|
||||||
|
) AS virtual_lot_number
|
||||||
FROM product p
|
FROM product p
|
||||||
LEFT JOIN stock_lot sl
|
LEFT JOIN stock_lot sl
|
||||||
ON sl.product_id = p.id
|
ON sl.product_id = p.id
|
||||||
@@ -83,7 +93,8 @@ function get_lager_product_overview(PDO $pdo): array
|
|||||||
LEFT JOIN v_stock_lot_balance v
|
LEFT JOIN v_stock_lot_balance v
|
||||||
ON v.stock_lot_id = sl.id
|
ON v.stock_lot_id = sl.id
|
||||||
WHERE p.status = 'active'
|
WHERE p.status = 'active'
|
||||||
GROUP BY p.id, p.name, p.sku, p.uom, sl.expiry_date, sl.sellout_date, sl.sellout_forecast_status
|
GROUP BY p.id, p.name, p.sku, p.uom, sl.lot_number, sl.supplier_lot_number,
|
||||||
|
sl.expiry_date, sl.sellout_date, sl.sellout_forecast_status
|
||||||
ORDER BY p.name ASC, p.id ASC"
|
ORDER BY p.name ASC, p.id ASC"
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -94,9 +105,12 @@ function get_lager_product_overview(PDO $pdo): array
|
|||||||
'sku' => (string) $row['sku'],
|
'sku' => (string) $row['sku'],
|
||||||
'uom' => (string) $row['uom'],
|
'uom' => (string) $row['uom'],
|
||||||
'available_qty' => (float) $row['available_qty'],
|
'available_qty' => (float) $row['available_qty'],
|
||||||
|
'lot_number' => $row['lot_number'],
|
||||||
|
'supplier_lot_number' => $row['supplier_lot_number'],
|
||||||
'expiry_date' => $row['expiry_date'],
|
'expiry_date' => $row['expiry_date'],
|
||||||
'sellout_date' => $row['sellout_date'],
|
'sellout_date' => $row['sellout_date'],
|
||||||
'sellout_forecast_status' => (string) ($row['sellout_forecast_status'] ?? 'no_demand'),
|
'sellout_forecast_status' => (string) ($row['sellout_forecast_status'] ?? 'no_demand'),
|
||||||
|
'virtual_lot_number' => $row['virtual_lot_number'],
|
||||||
],
|
],
|
||||||
$stmt->fetchAll()
|
$stmt->fetchAll()
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -251,10 +251,20 @@ function auth_render_lager_table(string $title, array $rows, array $columns, str
|
|||||||
$nameData = ' data-lager-drawer-name="' . auth_escape_html($name) . '"';
|
$nameData = ' data-lager-drawer-name="' . auth_escape_html($name) . '"';
|
||||||
$valueData = ' data-lager-drawer-value="' . auth_escape_html($value) . '"';
|
$valueData = ' data-lager-drawer-value="' . auth_escape_html($value) . '"';
|
||||||
$typeData = ' data-lager-drawer-type="' . auth_escape_html($tableKey === 'products' ? 'Produkt' : 'Artikel') . '"';
|
$typeData = ' data-lager-drawer-type="' . auth_escape_html($tableKey === 'products' ? 'Produkt' : 'Artikel') . '"';
|
||||||
|
$detailData = '';
|
||||||
|
if ($tableKey === 'products') {
|
||||||
|
$detailData = ' data-lager-drawer-forecast="' . auth_escape_html($forecastText) . '"'
|
||||||
|
. ' data-lager-drawer-forecast-warning="' . ($forecastWarning ? 'true' : 'false') . '"'
|
||||||
|
. ' data-lager-drawer-forecast-mhd-warning="' . ($forecastMhdWarning ? 'true' : 'false') . '"'
|
||||||
|
. ' data-lager-drawer-lot-number="' . auth_escape_html((string) ($row['lot_number'] ?? '')) . '"'
|
||||||
|
. ' data-lager-drawer-supplier-lot-number="' . auth_escape_html((string) ($row['supplier_lot_number'] ?? '')) . '"'
|
||||||
|
. ' data-lager-drawer-expiry-date="' . auth_escape_html((string) ($row['expiry_date'] ?? '')) . '"'
|
||||||
|
. ' data-lager-drawer-virtual-lot-number="' . auth_escape_html((string) ($row['virtual_lot_number'] ?? '')) . '"';
|
||||||
|
}
|
||||||
|
|
||||||
$html[] = '<div class="' . $rowClass . '" role="row" data-component-part="large-table-row" data-lager-row="true" data-lager-id="' . $id . '">';
|
$html[] = '<div class="' . $rowClass . '" role="row" data-component-part="large-table-row" data-lager-row="true" data-lager-id="' . $id . '">';
|
||||||
$html[] = '<div class="sg-large-table__cell" role="cell"><a class="sg-hyperlink" href="#" aria-haspopup="dialog" aria-expanded="false" data-lager-drawer-open="true"' . $nameData . $valueData . $typeData . '>' . auth_escape_html($name) . '</a></div>';
|
$html[] = '<div class="sg-large-table__cell" role="cell"><a class="sg-hyperlink" href="#" aria-haspopup="dialog" aria-expanded="false" data-lager-drawer-open="true"' . $nameData . $valueData . $typeData . $detailData . '>' . auth_escape_html($name) . '</a></div>';
|
||||||
$html[] = '<div class="sg-large-table__cell" role="cell"><a class="sg-hyperlink" href="#" aria-haspopup="dialog" aria-expanded="false" data-lager-drawer-open="true"' . $nameData . $valueData . $typeData . '>' . auth_escape_html($value) . '</a></div>';
|
$html[] = '<div class="sg-large-table__cell" role="cell"><a class="sg-hyperlink" href="#" aria-haspopup="dialog" aria-expanded="false" data-lager-drawer-open="true"' . $nameData . $valueData . $typeData . $detailData . '>' . auth_escape_html($value) . '</a></div>';
|
||||||
if ($tableKey === 'products') {
|
if ($tableKey === 'products') {
|
||||||
$forecastClass = $forecastWarning
|
$forecastClass = $forecastWarning
|
||||||
? ' sg-strong lager-forecast-warning'
|
? ' sg-strong lager-forecast-warning'
|
||||||
@@ -278,7 +288,24 @@ function auth_render_lager_content(array $lagerProducts, array $lagerArtikel): s
|
|||||||
. '<div class="sg-card-list-page-drawer-backdrop" aria-hidden="true" data-lager-drawer-backdrop="true" data-open="false"></div>'
|
. '<div class="sg-card-list-page-drawer-backdrop" aria-hidden="true" data-lager-drawer-backdrop="true" data-open="false"></div>'
|
||||||
. '<aside class="sg-card-list-page-drawer" aria-label="Lager-Details" aria-hidden="true" data-lager-drawer="true" data-open="false">'
|
. '<aside class="sg-card-list-page-drawer" aria-label="Lager-Details" aria-hidden="true" data-lager-drawer="true" data-open="false">'
|
||||||
. '<div class="sg-card-list-page-drawer__header"><h2 class="sg-heading-h2 sg-card-list-page-drawer__title" data-lager-drawer-title>Lager-Details</h2><button class="sg-interaction-element sg-hyperlink" type="button" data-lager-drawer-close>schliessen</button></div>'
|
. '<div class="sg-card-list-page-drawer__header"><h2 class="sg-heading-h2 sg-card-list-page-drawer__title" data-lager-drawer-title>Lager-Details</h2><button class="sg-interaction-element sg-hyperlink" type="button" data-lager-drawer-close>schliessen</button></div>'
|
||||||
. '<div class="sg-card-list-page-drawer__content"><article class="sg-card sg-vsf-drawer-card" data-component="card" data-pattern="card" aria-label="Lager-Details"><header class="sg-card-segment sg-card-segment--header sg-card-segment--darkblue sg-vsf-drawer-card__header"><div class="sg-strong">Lager-Details</div></header><div class="sg-card-segment sg-card-segment--body sg-vsf-drawer-card__content"><p class="sg-body"><strong>Name:</strong> <span data-lager-drawer-name-value></span></p><p class="sg-body" data-lager-drawer-value-row><strong data-lager-drawer-value-label>Wert:</strong> <span data-lager-drawer-value-value></span></p></div></article></div>'
|
. '<div class="sg-card-list-page-drawer__content">'
|
||||||
|
. '<article class="sg-card sg-vsf-drawer-card" data-component="card" data-pattern="card" aria-label="Lager-Details">'
|
||||||
|
. '<header class="sg-card-segment sg-card-segment--header sg-card-segment--darkblue sg-vsf-drawer-card__header"><div class="sg-strong">Lager-Details</div></header>'
|
||||||
|
. '<div class="sg-card-segment sg-card-segment--body sg-vsf-drawer-card__content"><p class="sg-body"><strong>Name:</strong> <span data-lager-drawer-name-value></span></p><p class="sg-body" data-lager-drawer-value-row><strong data-lager-drawer-value-label>Wert:</strong> <span data-lager-drawer-value-value></span></p></div>'
|
||||||
|
. '</article>'
|
||||||
|
. '<article class="sg-card sg-card--content-card" data-component="content-card" data-lager-drawer-topic="warning" aria-label="Warnungen">'
|
||||||
|
. '<div class="sg-card-segment sg-card-segment--header sg-card-segment--darkgreen" data-component-part="card-header"><div class="sg-strong">Warnungen</div></div>'
|
||||||
|
. '<div class="sg-card-segment sg-card-segment--body" data-component-part="card-body"><p class="sg-body" data-lager-drawer-warning-value></p></div>'
|
||||||
|
. '</article>'
|
||||||
|
. '<article class="sg-card sg-card--content-card" data-component="content-card" data-lager-drawer-topic="lot" aria-label="Lagercharge">'
|
||||||
|
. '<div class="sg-card-segment sg-card-segment--header sg-card-segment--darkgreen" data-component-part="card-header"><div class="sg-strong">Lagercharge</div></div>'
|
||||||
|
. '<div class="sg-card-segment sg-card-segment--body" data-component-part="card-body"><p class="sg-body"><strong>Naurua-Chargennummer:</strong> <span data-lager-drawer-lot-number></span><br><strong>Hersteller-Chargennummer:</strong> <span data-lager-drawer-supplier-lot-number></span><br><strong>MHD:</strong> <span data-lager-drawer-expiry-date></span></p></div>'
|
||||||
|
. '</article>'
|
||||||
|
. '<article class="sg-card sg-card--content-card" data-component="content-card" data-lager-drawer-topic="virtual-lot" aria-label="Virtuelle Charge">'
|
||||||
|
. '<div class="sg-card-segment sg-card-segment--header sg-card-segment--darkgreen" data-component-part="card-header"><div class="sg-strong">Virtuelle Charge</div></div>'
|
||||||
|
. '<div class="sg-card-segment sg-card-segment--body" data-component-part="card-body"><p class="sg-body" data-lager-drawer-virtual-lot-value></p></div>'
|
||||||
|
. '</article>'
|
||||||
|
. '</div>'
|
||||||
. '</aside>'
|
. '</aside>'
|
||||||
. '</div>';
|
. '</div>';
|
||||||
}
|
}
|
||||||
@@ -625,7 +652,7 @@ function render_auth_home_page(array $user, array $otcProducts = [], array $best
|
|||||||
echo " const closeDrawer = () => { setDrawerState(false); contentRoot.querySelectorAll('[data-lager-drawer-open]').forEach((trigger) => trigger.setAttribute('aria-expanded', 'false')); };";
|
echo " const closeDrawer = () => { setDrawerState(false); contentRoot.querySelectorAll('[data-lager-drawer-open]').forEach((trigger) => trigger.setAttribute('aria-expanded', 'false')); };";
|
||||||
echo " contentRoot.addEventListener('click', (event) => {";
|
echo " contentRoot.addEventListener('click', (event) => {";
|
||||||
echo " const trigger = event.target.closest('[data-lager-drawer-open]');";
|
echo " const trigger = event.target.closest('[data-lager-drawer-open]');";
|
||||||
echo " if (trigger) { event.preventDefault(); const drawer = getDrawer(); if (!drawer) { return; } const type = trigger.dataset.lagerDrawerType || 'Lager'; const name = trigger.dataset.lagerDrawerName || ''; const value = trigger.dataset.lagerDrawerValue || ''; drawer.querySelector('[data-lager-drawer-title]').textContent = type + ': ' + name; drawer.querySelector('[data-lager-drawer-name-value]').textContent = name; const valueRow = drawer.querySelector('[data-lager-drawer-value-row]'); if (valueRow) { valueRow.hidden = false; } drawer.querySelector('[data-lager-drawer-value-label]').textContent = type === 'Produkt' ? 'Anzahl im Lager:' : 'Artikelnummer:'; drawer.querySelector('[data-lager-drawer-value-value]').textContent = value; setDrawerState(true); contentRoot.querySelectorAll('[data-lager-drawer-open]').forEach((button) => button.setAttribute('aria-expanded', String(button === trigger))); return; }";
|
echo " if (trigger) { event.preventDefault(); const drawer = getDrawer(); if (!drawer) { return; } const type = trigger.dataset.lagerDrawerType || 'Lager'; const name = trigger.dataset.lagerDrawerName || ''; const value = trigger.dataset.lagerDrawerValue || ''; drawer.querySelector('[data-lager-drawer-title]').textContent = type + ': ' + name; drawer.querySelector('[data-lager-drawer-name-value]').textContent = name; const valueRow = drawer.querySelector('[data-lager-drawer-value-row]'); if (valueRow) { valueRow.hidden = false; } drawer.querySelector('[data-lager-drawer-value-label]').textContent = type === 'Produkt' ? 'Anzahl im Lager:' : 'Artikelnummer:'; drawer.querySelector('[data-lager-drawer-value-value]').textContent = value; drawer.querySelectorAll('[data-lager-drawer-topic]').forEach((card) => { card.hidden = type !== 'Produkt'; }); if (type === 'Produkt') { const forecast = trigger.dataset.lagerDrawerForecast || 'Keine Prognose'; const warning = trigger.dataset.lagerDrawerForecastWarning === 'true' || trigger.dataset.lagerDrawerForecastMhdWarning === 'true'; const warningValue = drawer.querySelector('[data-lager-drawer-warning-value]'); if (warningValue) { warningValue.textContent = warning ? forecast : 'Keine akute Warnung.'; } drawer.querySelector('[data-lager-drawer-lot-number]').textContent = trigger.dataset.lagerDrawerLotNumber || 'Nicht hinterlegt'; drawer.querySelector('[data-lager-drawer-supplier-lot-number]').textContent = trigger.dataset.lagerDrawerSupplierLotNumber || 'Nicht hinterlegt'; drawer.querySelector('[data-lager-drawer-expiry-date]').textContent = trigger.dataset.lagerDrawerExpiryDate || 'Nicht hinterlegt'; const virtualLot = trigger.dataset.lagerDrawerVirtualLotNumber || ''; drawer.querySelector('[data-lager-drawer-virtual-lot-value]').textContent = virtualLot ? 'Virtuelle Charge: ' + virtualLot : 'Keine virtuelle Fehlbestandscharge vorhanden.'; } setDrawerState(true); contentRoot.querySelectorAll('[data-lager-drawer-open]').forEach((button) => button.setAttribute('aria-expanded', String(button === trigger))); return; }";
|
||||||
echo " if (event.target.closest('[data-lager-drawer-close]') || event.target.closest('[data-lager-drawer-backdrop]')) { closeDrawer(); }";
|
echo " if (event.target.closest('[data-lager-drawer-close]') || event.target.closest('[data-lager-drawer-backdrop]')) { closeDrawer(); }";
|
||||||
echo " });";
|
echo " });";
|
||||||
echo " document.addEventListener('keydown', (event) => { if (event.key === 'Escape') { closeDrawer(); } });";
|
echo " document.addEventListener('keydown', (event) => { if (event.key === 'Escape') { closeDrawer(); } });";
|
||||||
|
|||||||
Reference in new issue
Block a user