This commit is contained in:
2026-04-22 22:54:26 +02:00
parent cd1ea4a9db
commit c73b2fe9f6
26 changed files with 1377 additions and 34 deletions

View File

@@ -127,8 +127,23 @@
<a class="sidebar__sublink<?= $currentMenu === 'settings' && $currentSettings === 'printing' ? ' is-active' : '' ?>" href="/settings/printing">
Drukowanie
</a>
<?php
$dsmUnmappedCount = 0;
try {
$appInstance = \App\Core\Application::instance();
if ($appInstance !== null) {
$dsmRepo = new \App\Modules\Shipments\DeliveryStatusMappingRepository($appInstance->db());
$dsmUnmappedCount = $dsmRepo->countAllUnmappedForBadge();
}
} catch (\Throwable) {
$dsmUnmappedCount = 0;
}
?>
<a class="sidebar__sublink<?= $currentMenu === 'settings' && $currentSettings === 'delivery-status-mappings' ? ' is-active' : '' ?>" href="/settings/delivery-status-mappings">
Mapowanie statusów dostawy
<?php if ($dsmUnmappedCount > 0): ?>
<span class="sidebar__badge" title="Niezmapowane statusy"><?= (int) $dsmUnmappedCount ?></span>
<?php endif; ?>
</a>
<a class="sidebar__sublink<?= $currentMenu === 'settings' && $currentSettings === 'project-mappings' ? ' is-active' : '' ?>" href="/settings/project-mappings">
<?= $e($t('navigation.project_mapping')) ?>

View File

@@ -79,6 +79,50 @@ foreach ($addressesList as $address) {
<button type="button" class="btn btn--secondary btn--disabled">Edytuj</button>
</div>
</div>
<?php $riskInfo = is_array($customerRiskInfo ?? null) ? $customerRiskInfo : ['count' => 0, 'orders' => [], 'text' => '']; ?>
<?php if ((int) ($riskInfo['count'] ?? 0) >= 1): ?>
<div class="customer-risk-banner mt-12" role="alert">
<span class="customer-risk-banner__icon" aria-hidden="true">&#9888;</span>
<div class="customer-risk-banner__body">
<p class="customer-risk-banner__text"><?= $e((string) ($riskInfo['text'] ?? '')) ?></p>
<?php $riskOrders = is_array($riskInfo['orders'] ?? null) ? $riskInfo['orders'] : []; ?>
<?php if ($riskOrders !== []): ?>
<details class="customer-risk-banner__list">
<summary>Pokaz liste zamowien ze zwrotem (<?= count($riskOrders) ?>)</summary>
<table class="customer-risk-banner__table">
<thead>
<tr>
<th>Nr zamowienia</th>
<th>Data</th>
<th>Nr przesylki</th>
<th>Przewoznik</th>
<th>Status</th>
</tr>
</thead>
<tbody>
<?php foreach ($riskOrders as $ro): ?>
<?php
$roId = (int) ($ro['order_id'] ?? 0);
$roNumber = trim((string) ($ro['internal_order_number'] ?? ''));
$roLabel = $roNumber !== '' ? $roNumber : ('#' . $roId);
$roDate = trim((string) ($ro['ordered_at'] ?? ''));
$roDateShort = $roDate !== '' ? substr($roDate, 0, 10) : '-';
?>
<tr>
<td><a href="/orders/<?= $roId ?>" target="_blank" rel="noopener"><?= $e($roLabel) ?></a></td>
<td><?= $e($roDateShort) ?></td>
<td><?= $e((string) ($ro['tracking_number'] ?? '')) ?: '-' ?></td>
<td><?= $e((string) ($ro['provider'] ?? '')) ?: '-' ?></td>
<td><?= $e((string) ($ro['delivery_status_raw'] ?? '')) ?: 'returned' ?></td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</details>
<?php endif; ?>
</div>
</div>
<?php endif; ?>
<?php if ($flashSuccessMsg !== ''): ?>
<div class="flash flash--success mt-12"><?= $e($flashSuccessMsg) ?></div>
<?php endif; ?>

View File

@@ -2,6 +2,7 @@
$providersList = is_array($providers ?? null) ? $providers : [];
$mappingsList = is_array($mappings ?? null) ? $mappings : [];
$normalizedOptionsList = is_array($normalizedOptions ?? null) ? $normalizedOptions : [];
$unmappedList = is_array($unmappedRawStatuses ?? null) ? $unmappedRawStatuses : [];
$currentProvider = (string) ($provider ?? 'inpost');
?>
@@ -18,6 +19,66 @@ $currentProvider = (string) ($provider ?? 'inpost');
<?php endif; ?>
</section>
<?php if ($unmappedList !== []): ?>
<section class="card mt-16 dsm-unmapped">
<h2 class="section-title">Niezmapowane statusy wykryte w systemie (<?= count($unmappedList) ?>)</h2>
<p class="muted mt-8">Statusy odebrane z API przewoźnika <strong><?= $e((string) ($providersList[$currentProvider] ?? $currentProvider)) ?></strong>, dla których nie ma jeszcze mapowania. Przypisz znormalizowany status, aby paczki przestały być oznaczane jako „Nieznany".</p>
<form action="/settings/delivery-status-mappings/save-bulk" method="post" class="mt-12">
<input type="hidden" name="_token" value="<?= $e($csrfToken ?? '') ?>">
<input type="hidden" name="provider" value="<?= $e($currentProvider) ?>">
<div class="table-wrapper">
<table class="table table--compact">
<thead>
<tr>
<th>Status surowy</th>
<th>Liczba paczek</th>
<th>Ostatnio widziany</th>
<th>Opis (własny)</th>
<th>Status znormalizowany</th>
</tr>
</thead>
<tbody>
<?php foreach ($unmappedList as $unmapped): ?>
<?php
$rawStatus = (string) ($unmapped['raw_status'] ?? '');
$count = (int) ($unmapped['count'] ?? 0);
$lastSeen = (string) ($unmapped['last_seen'] ?? '');
?>
<tr>
<td>
<code class="dsm-raw-status"><?= $e($rawStatus) ?></code>
<input type="hidden" name="raw_status[]" value="<?= $e($rawStatus) ?>">
</td>
<td><?= $count ?></td>
<td><?= $e($lastSeen) ?></td>
<td>
<input type="text" name="description[]" class="form-control form-control--sm"
value="<?= $e($rawStatus) ?>" maxlength="255">
</td>
<td>
<select name="normalized_status[]" class="form-control form-control--sm" required>
<?php foreach ($normalizedOptionsList as $optValue => $optLabel): ?>
<option value="<?= $e($optValue) ?>"<?= $optValue === 'unknown' ? ' selected' : '' ?>>
<?= $e($optLabel) ?>
</option>
<?php endforeach; ?>
</select>
</td>
</tr>
<?php endforeach; ?>
</tbody>
</table>
</div>
<div class="form-actions mt-12">
<button type="submit" class="btn btn--primary">Dodaj do mapowania</button>
</div>
</form>
</section>
<?php endif; ?>
<section class="card mt-16">
<nav class="content-tabs-nav" aria-label="Wybierz przewoźnika">
<?php foreach ($providersList as $provKey => $provLabel): ?>