Split inventory forecast by current and next lot
This commit is contained in:
1 parent
77f6fee5ac
commit
959586ecc9
5 files changed
+164
-59
No files matched your search
@@ -189,6 +189,30 @@ function auth_render_bestellungen_content(array $bestellungenTable): string
|
||||
|
||||
function auth_render_lager_table(string $title, array $rows, array $columns, string $tableKey): string
|
||||
{
|
||||
$renderForecast = static function (?string $date, string $status, ?string $expiryDate, bool $available): array {
|
||||
if (!$available) {
|
||||
return ['text' => '-', 'warning' => false, 'mhdWarning' => false];
|
||||
}
|
||||
if ($date === null || $date === '') {
|
||||
return ['text' => 'Keine Prognose', 'warning' => false, 'mhdWarning' => false];
|
||||
}
|
||||
$dateObject = new DateTimeImmutable($date);
|
||||
$text = $dateObject->format('d.m.Y');
|
||||
if ($status === 'depleted') {
|
||||
return ['text' => $text . ' (BESTAND ENDE)', 'warning' => true, 'mhdWarning' => false];
|
||||
}
|
||||
$warning = false;
|
||||
$mhdWarning = false;
|
||||
if ($expiryDate !== null && $expiryDate !== '') {
|
||||
$expiryObject = new DateTimeImmutable($expiryDate);
|
||||
$warning = $dateObject >= $expiryObject->modify('-3 months') && $dateObject <= $expiryObject;
|
||||
$mhdWarning = $dateObject > $expiryObject;
|
||||
if ($warning || $mhdWarning) {
|
||||
$text .= ' (MHD: ' . $expiryObject->format('d.m.Y') . ')';
|
||||
}
|
||||
}
|
||||
return ['text' => $text, 'warning' => $warning, 'mhdWarning' => $mhdWarning];
|
||||
};
|
||||
$html = [];
|
||||
$html[] = '<article class="sg-card sg-large-table sg-large-table--lager" data-component="large-table" data-lager-table="true" data-lager-table-key="' . auth_escape_html($tableKey) . '" role="table" aria-label="' . auth_escape_html($title) . '">';
|
||||
$html[] = '<div class="sg-card-segment sg-card-segment--header sg-card-segment--darkblue sg-large-table__title-segment" data-component-part="large-table-header"><div class="sg-strong">' . auth_escape_html($title) . '</div></div>';
|
||||
@@ -209,40 +233,31 @@ function auth_render_lager_table(string $title, array $rows, array $columns, str
|
||||
$value = $tableKey === 'products'
|
||||
? (string) max(0, (int) round((float) ($row['available_qty'] ?? 0)))
|
||||
: (string) ($row['item_code'] ?? '');
|
||||
$forecastText = '';
|
||||
$forecastWarning = false;
|
||||
$forecastMhdWarning = false;
|
||||
$currentForecast = ['text' => '', 'warning' => false, 'mhdWarning' => false];
|
||||
$nextForecast = ['text' => '-', 'warning' => false, 'mhdWarning' => false];
|
||||
if ($tableKey === 'products') {
|
||||
$forecastStatus = (string) ($row['sellout_forecast_status'] ?? 'no_demand');
|
||||
$forecastDate = $row['sellout_date'] ?? null;
|
||||
if ($forecastDate !== null && $forecastDate !== '') {
|
||||
$forecastDateObject = new DateTimeImmutable((string) $forecastDate);
|
||||
$forecastText = $forecastDateObject->format('d.m.Y');
|
||||
if ($forecastStatus === 'depleted') {
|
||||
$forecastWarning = true;
|
||||
$forecastText .= ' (BESTAND ENDE)';
|
||||
} elseif (!empty($row['expiry_date'])) {
|
||||
$expiryDate = new DateTimeImmutable((string) $row['expiry_date']);
|
||||
$forecastWarning = $forecastDateObject >= $expiryDate->modify('-3 months')
|
||||
&& $forecastDateObject <= $expiryDate;
|
||||
$forecastMhdWarning = $forecastDateObject > $expiryDate;
|
||||
if ($forecastWarning || $forecastMhdWarning) {
|
||||
$forecastText .= ' (MHD: ' . $expiryDate->format('d.m.Y') . ')';
|
||||
}
|
||||
}
|
||||
} else {
|
||||
$forecastText = 'Keine Prognose';
|
||||
}
|
||||
$currentForecast = $renderForecast(
|
||||
$row['sellout_date'] ?? null,
|
||||
(string) ($row['sellout_forecast_status'] ?? 'no_demand'),
|
||||
$row['expiry_date'] ?? null,
|
||||
true
|
||||
);
|
||||
$nextForecast = $renderForecast(
|
||||
$row['next_sellout_date'] ?? null,
|
||||
(string) ($row['next_sellout_forecast_status'] ?? 'no_demand'),
|
||||
$row['next_expiry_date'] ?? null,
|
||||
$row['next_lot_id'] !== null
|
||||
);
|
||||
}
|
||||
$nameData = ' data-lager-drawer-name="' . auth_escape_html($name) . '"';
|
||||
$valueData = ' data-lager-drawer-value="' . auth_escape_html($value) . '"';
|
||||
$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-status="' . auth_escape_html($forecastStatus) . '"'
|
||||
. ' data-lager-drawer-forecast-warning="' . ($forecastWarning ? 'true' : 'false') . '"'
|
||||
. ' data-lager-drawer-forecast-mhd-warning="' . ($forecastMhdWarning ? 'true' : 'false') . '"'
|
||||
$detailData = ' data-lager-drawer-forecast="' . auth_escape_html($currentForecast['text']) . '"'
|
||||
. ' data-lager-drawer-forecast-status="' . auth_escape_html((string) ($row['sellout_forecast_status'] ?? 'no_demand')) . '"'
|
||||
. ' data-lager-drawer-forecast-warning="' . ($currentForecast['warning'] ? 'true' : 'false') . '"'
|
||||
. ' data-lager-drawer-forecast-mhd-warning="' . ($currentForecast['mhdWarning'] ? 'true' : 'false') . '"'
|
||||
. ' data-lager-drawer-current-qty="' . auth_escape_html(auth_format_lager_quantity((float) ($row['current_qty'] ?? 0))) . '"'
|
||||
. ' data-lager-drawer-qty-in="' . auth_escape_html(auth_format_lager_quantity((float) ($row['qty_in'] ?? 0))) . '"'
|
||||
. ' data-lager-drawer-virtual-shortage-qty="' . auth_escape_html(auth_format_lager_quantity((float) ($row['virtual_shortage_qty'] ?? 0))) . '"'
|
||||
@@ -269,10 +284,15 @@ function auth_render_lager_table(string $title, array $rows, array $columns, str
|
||||
$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 . $detailData . '>' . auth_escape_html($value) . '</a></div>';
|
||||
if ($tableKey === 'products') {
|
||||
$forecastClass = $forecastWarning
|
||||
$forecastClass = $currentForecast['warning']
|
||||
? ' sg-strong lager-forecast-warning'
|
||||
: ($forecastMhdWarning ? ' sg-strong lager-forecast-mhd-warning' : '');
|
||||
$html[] = '<div class="sg-large-table__cell' . $forecastClass . '" role="cell">' . auth_escape_html($forecastText) . '</div>';
|
||||
: ($currentForecast['mhdWarning'] ? ' sg-strong lager-forecast-mhd-warning' : '');
|
||||
$nextForecastClass = $nextForecast['warning']
|
||||
? ' sg-strong lager-forecast-warning'
|
||||
: ($nextForecast['mhdWarning'] ? ' sg-strong lager-forecast-mhd-warning' : '');
|
||||
$html[] = '<div class="sg-large-table__cell' . $forecastClass . '" role="cell">' . auth_escape_html($currentForecast['text']) . '</div>';
|
||||
$html[] = '<div class="sg-large-table__cell" role="cell">' . auth_escape_html((string) max(0, (int) round((float) ($row['next_qty'] ?? 0)))) . '</div>';
|
||||
$html[] = '<div class="sg-large-table__cell' . $nextForecastClass . '" role="cell">' . auth_escape_html($nextForecast['text']) . '</div>';
|
||||
}
|
||||
$html[] = '</div>';
|
||||
}
|
||||
@@ -382,7 +402,7 @@ function auth_render_lager_content(array $lagerProducts, array $lagerArtikel, ar
|
||||
}
|
||||
|
||||
$tables = $sectionTitle === 'Lager'
|
||||
? auth_render_lager_table('Produkte', $lagerProducts, ['Produktname', 'Anzahl im Lager', 'Verbraucht bis'], 'products')
|
||||
? auth_render_lager_table('Produkte', $lagerProducts, ['Produktname', 'Lager aktuell', 'Verkauf bis aktuell', 'Lager neu', 'Verkauf bis neu'], 'products')
|
||||
: auth_render_lager_table('Artikel', $lagerArtikel, ['Artikel-Name', 'Artikelnummer'], 'articles');
|
||||
$openLotCardTemplate = auth_render_lager_open_lots([[
|
||||
'id' => 0,
|
||||
|
||||
Reference in new issue
Block a user