feat(28-shipment-tracking-ui): badge'e statusow dostawy, linki sledzenia, ustawienia interwalu trackingu

- Kolorowe badge'e statusow dostawy w tabelach paczek (show.php + prepare.php)
- Link sledzenia z carrier detection (InPost, Apaczka, Orlen, Allegro, Google fallback)
- Sekcja Status dostawy w boksie Platnosc i wysylka
- Ustawienie interwalu trackingu crona (5-120 min) w zakladce Ustawienia
- Tekstowe mapowania statusow Apaczka API (NEW, CONFIRMED, etc.)
- Fix: use-statements ApaczkaShipmentService (pre-existing bug)
- Fix: pickup date normalization (next day po 16:00)
- Fix: przycisk Pobierz etykiete (POST zamiast link do prepare)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-23 23:04:05 +01:00
parent 228c0e96cf
commit 98a0077204
17 changed files with 1108 additions and 174 deletions

View File

@@ -131,6 +131,18 @@ final class DeliveryStatus
'8' => self::PROBLEM,
'9' => self::READY_FOR_PICKUP,
'10' => self::IN_TRANSIT,
'NEW' => self::CREATED,
'PENDING' => self::CREATED,
'CONFIRMED' => self::CONFIRMED,
'PICKED_UP' => self::IN_TRANSIT,
'IN_TRANSIT' => self::IN_TRANSIT,
'OUT_FOR_DELIVERY' => self::OUT_FOR_DELIVERY,
'DELIVERED' => self::DELIVERED,
'RETURNED' => self::RETURNED,
'CANCELLED' => self::CANCELLED,
'ERROR' => self::PROBLEM,
'WAITING_FOR_PICKUP' => self::READY_FOR_PICKUP,
'REDIRECT' => self::IN_TRANSIT,
];
private const APACZKA_DESCRIPTIONS = [
@@ -145,6 +157,18 @@ final class DeliveryStatus
'8' => 'Błąd zamówienia',
'9' => 'Oczekuje na odbiór w punkcie',
'10' => 'Przekierowana',
'NEW' => 'Zamówienie utworzone',
'PENDING' => 'Oczekuje na przetworzenie',
'CONFIRMED' => 'Zamówienie potwierdzone',
'PICKED_UP' => 'Odebrana przez kuriera',
'IN_TRANSIT' => 'W transporcie',
'OUT_FOR_DELIVERY' => 'W doręczeniu',
'DELIVERED' => 'Doręczona',
'RETURNED' => 'Zwrócona do nadawcy',
'CANCELLED' => 'Anulowana',
'ERROR' => 'Błąd zamówienia',
'WAITING_FOR_PICKUP' => 'Oczekuje na odbiór w punkcie',
'REDIRECT' => 'Przekierowana',
];
private const ALLEGRO_MAP = [
@@ -200,4 +224,61 @@ final class DeliveryStatus
{
return in_array($status, self::TERMINAL_STATUSES, true);
}
public static function trackingUrl(string $provider, string $trackingNumber, string $carrierId = ''): ?string
{
$number = trim($trackingNumber);
if ($number === '') {
return null;
}
$encoded = rawurlencode($number);
if ($provider === 'inpost') {
return 'https://inpost.pl/sledzenie-przesylek?number=' . $encoded;
}
if ($provider === 'allegro_wza') {
return 'https://allegro.pl/przesylka/' . $encoded;
}
if ($carrierId !== '') {
$url = self::matchCarrierByName($encoded, strtolower(trim($carrierId)));
if ($url !== null) {
return $url;
}
}
return 'https://www.google.com/search?q=' . $encoded . '+sledzenie+przesylki';
}
private static function matchCarrierByName(string $encoded, string $carrier): ?string
{
if (str_contains($carrier, 'dpd')) {
return 'https://tracktrace.dpd.com.pl/parcelDetails?p1=' . $encoded;
}
if (str_contains($carrier, 'dhl')) {
return 'https://www.dhl.com/pl-pl/home/sledzenie-przesylki.html?tracking-id=' . $encoded;
}
if (str_contains($carrier, 'inpost') || str_contains($carrier, 'paczkomat')) {
return 'https://inpost.pl/sledzenie-przesylek?number=' . $encoded;
}
if (str_contains($carrier, 'orlen') || str_contains($carrier, 'ruch')) {
return 'https://www.orlenpaczka.pl/sledz-paczke/?numer=' . $encoded;
}
if (str_contains($carrier, 'poczta') || str_contains($carrier, 'pocztex')) {
return 'https://emonitoring.poczta-polska.pl/?numer=' . $encoded;
}
if (str_contains($carrier, 'ups')) {
return 'https://www.ups.com/track?tracknum=' . $encoded;
}
if (str_contains($carrier, 'fedex')) {
return 'https://www.fedex.com/fedextrack/?trknbr=' . $encoded;
}
if (str_contains($carrier, 'gls')) {
return 'https://gls-group.com/PL/pl/sledzenie-paczek?match=' . $encoded;
}
return null;
}
}