update
This commit is contained in:
@@ -191,6 +191,65 @@ final class DeliveryStatus
|
||||
'RETURNED' => 'Zwrócona do nadawcy',
|
||||
];
|
||||
|
||||
private const ALLEGRO_EDGE_MAP = [
|
||||
// Realne slugi z edge API (po slugify opisów)
|
||||
'przygotowana_przez_nadawce' => self::CREATED,
|
||||
'nadana' => self::CONFIRMED,
|
||||
'podjeta_z_maszyny_przez_kuriera' => self::IN_TRANSIT,
|
||||
'podjeta_z_punktu_przez_kuriera' => self::IN_TRANSIT,
|
||||
'podjeta_z_punktu' => self::IN_TRANSIT,
|
||||
'odebrana_przez_kuriera' => self::IN_TRANSIT,
|
||||
'przekazal_przesylke_do_magazynu' => self::IN_TRANSIT,
|
||||
'przekazana_do_magazynu' => self::IN_TRANSIT,
|
||||
'przesylka_wyjechala_w_droge_do_punktu_docelowego' => self::IN_TRANSIT,
|
||||
'w_sortowni' => self::IN_TRANSIT,
|
||||
'wyjechala_w_droge_do_punktu_docelowego' => self::IN_TRANSIT,
|
||||
'wyslana_z_sortowni' => self::IN_TRANSIT,
|
||||
'w_doreczeniu' => self::OUT_FOR_DELIVERY,
|
||||
'wydana_do_doreczenia' => self::OUT_FOR_DELIVERY,
|
||||
'dostarczana' => self::OUT_FOR_DELIVERY,
|
||||
'gotowa_do_odbioru' => self::READY_FOR_PICKUP,
|
||||
'oczekuje_na_odbior' => self::READY_FOR_PICKUP,
|
||||
'przesylka_oczekuje_na_odbior' => self::READY_FOR_PICKUP,
|
||||
'dostarczona' => self::DELIVERED,
|
||||
'doreczona' => self::DELIVERED,
|
||||
'odebrana' => self::DELIVERED,
|
||||
'zwrocona' => self::RETURNED,
|
||||
'zwrocona_do_nadawcy' => self::RETURNED,
|
||||
'anulowana' => self::CANCELLED,
|
||||
'odmowa_przyjecia' => self::PROBLEM,
|
||||
'uszkodzona' => self::PROBLEM,
|
||||
'zagubiona' => self::PROBLEM,
|
||||
];
|
||||
|
||||
private const ALLEGRO_EDGE_DESCRIPTIONS = [
|
||||
'przygotowana_przez_nadawce' => 'Przesyłka przygotowana przez nadawcę',
|
||||
'nadana' => 'Przesyłka nadana',
|
||||
'podjeta_z_maszyny_przez_kuriera' => 'Podjęta z maszyny przez kuriera',
|
||||
'podjeta_z_punktu_przez_kuriera' => 'Podjęta z punktu przez kuriera',
|
||||
'odebrana_przez_kuriera' => 'Odebrana przez kuriera',
|
||||
'przekazana_do_magazynu' => 'Przekazana do magazynu',
|
||||
'przesylka_wyjechala_w_droge_do_punktu_docelowego' => 'Wyjechała w drogę do punktu docelowego',
|
||||
'w_sortowni' => 'W sortowni',
|
||||
'wyjechala_w_droge_do_punktu_docelowego' => 'Wyjechała w drogę do punktu docelowego',
|
||||
'wyslana_z_sortowni' => 'Wysłana z sortowni',
|
||||
'w_doreczeniu' => 'W doręczeniu',
|
||||
'wydana_do_doreczenia' => 'Wydana do doręczenia',
|
||||
'dostarczana' => 'Dostarczana',
|
||||
'gotowa_do_odbioru' => 'Gotowa do odbioru',
|
||||
'oczekuje_na_odbior' => 'Oczekuje na odbiór',
|
||||
'przesylka_oczekuje_na_odbior' => 'Oczekuje na odbiór',
|
||||
'dostarczona' => 'Dostarczona',
|
||||
'doreczona' => 'Doręczona',
|
||||
'odebrana' => 'Odebrana',
|
||||
'zwrocona' => 'Zwrócona',
|
||||
'zwrocona_do_nadawcy' => 'Zwrócona do nadawcy',
|
||||
'anulowana' => 'Anulowana',
|
||||
'odmowa_przyjecia' => 'Odmowa przyjęcia',
|
||||
'uszkodzona' => 'Uszkodzona',
|
||||
'zagubiona' => 'Zagubiona',
|
||||
];
|
||||
|
||||
public const ALL_STATUSES = [
|
||||
self::UNKNOWN,
|
||||
self::CREATED,
|
||||
@@ -208,12 +267,14 @@ final class DeliveryStatus
|
||||
'inpost' => self::INPOST_MAP,
|
||||
'apaczka' => self::APACZKA_MAP,
|
||||
'allegro_wza' => self::ALLEGRO_MAP,
|
||||
'allegro_edge' => self::ALLEGRO_EDGE_MAP,
|
||||
];
|
||||
|
||||
private const PROVIDER_DESCRIPTIONS = [
|
||||
'inpost' => self::INPOST_DESCRIPTIONS,
|
||||
'apaczka' => self::APACZKA_DESCRIPTIONS,
|
||||
'allegro_wza' => self::ALLEGRO_DESCRIPTIONS,
|
||||
'allegro_edge' => self::ALLEGRO_EDGE_DESCRIPTIONS,
|
||||
];
|
||||
|
||||
/**
|
||||
@@ -267,6 +328,7 @@ final class DeliveryStatus
|
||||
'inpost' => self::INPOST_MAP,
|
||||
'apaczka' => self::APACZKA_MAP,
|
||||
'allegro_wza' => self::ALLEGRO_MAP,
|
||||
'allegro_edge' => self::ALLEGRO_EDGE_MAP,
|
||||
default => [],
|
||||
};
|
||||
|
||||
@@ -279,6 +341,7 @@ final class DeliveryStatus
|
||||
'inpost' => self::INPOST_DESCRIPTIONS,
|
||||
'apaczka' => self::APACZKA_DESCRIPTIONS,
|
||||
'allegro_wza' => self::ALLEGRO_DESCRIPTIONS,
|
||||
'allegro_edge' => self::ALLEGRO_EDGE_DESCRIPTIONS,
|
||||
default => [],
|
||||
};
|
||||
|
||||
@@ -295,6 +358,70 @@ final class DeliveryStatus
|
||||
return in_array($status, self::TERMINAL_STATUSES, true);
|
||||
}
|
||||
|
||||
public static function slugifyAllegroDescription(string $description): string
|
||||
{
|
||||
$text = trim($description);
|
||||
if ($text === '') {
|
||||
return 'unknown';
|
||||
}
|
||||
|
||||
// Usuń typowe prefiksy
|
||||
$text = preg_replace('/^Przesy[łl]ka zosta[łl]a\s+/ui', '', $text);
|
||||
$text = preg_replace('/^Kurier\s+/ui', '', $text);
|
||||
$text = preg_replace('/^Paczka zosta[łl]a\s+/ui', '', $text);
|
||||
|
||||
// Polskie znaki na ASCII
|
||||
$polish = ['ą','ć','ę','ł','ń','ó','ś','ź','ż','Ą','Ć','Ę','Ł','Ń','Ó','Ś','Ź','Ż'];
|
||||
$ascii = ['a','c','e','l','n','o','s','z','z','A','C','E','L','N','O','S','Z','Z'];
|
||||
$text = str_replace($polish, $ascii, $text);
|
||||
|
||||
// Lowercase, zamień nie-alfanumeryczne na podkreślenia
|
||||
$text = strtolower($text);
|
||||
$text = preg_replace('/[^a-z0-9]+/', '_', $text);
|
||||
$text = trim($text, '_');
|
||||
|
||||
return $text !== '' ? $text : 'unknown';
|
||||
}
|
||||
|
||||
/**
|
||||
* Keyword-based fallback for unknown Allegro edge descriptions.
|
||||
* Used when slugified description is not in ALLEGRO_EDGE_MAP.
|
||||
*/
|
||||
public static function guessStatusFromDescription(string $description): string
|
||||
{
|
||||
$lower = mb_strtolower($description, 'UTF-8');
|
||||
|
||||
if (str_contains($lower, 'doręczon') || str_contains($lower, 'dostarczono') || str_contains($lower, 'odebrana przez odbiorc')) {
|
||||
return self::DELIVERED;
|
||||
}
|
||||
if (str_contains($lower, 'zwrócon') || str_contains($lower, 'zwrocona')) {
|
||||
return self::RETURNED;
|
||||
}
|
||||
if (str_contains($lower, 'anulowan')) {
|
||||
return self::CANCELLED;
|
||||
}
|
||||
if (str_contains($lower, 'doręczeni') || str_contains($lower, 'doreczenia') || str_contains($lower, 'wydana do')) {
|
||||
return self::OUT_FOR_DELIVERY;
|
||||
}
|
||||
if (str_contains($lower, 'sortowni') || str_contains($lower, 'magazyn') || str_contains($lower, 'w drodze') || str_contains($lower, 'tranzyt') || str_contains($lower, 'kurier') || str_contains($lower, 'podjęta') || str_contains($lower, 'podjeta') || str_contains($lower, 'wyjechał') || str_contains($lower, 'wyjechala')) {
|
||||
return self::IN_TRANSIT;
|
||||
}
|
||||
if (str_contains($lower, 'oczekuje na odb') || str_contains($lower, 'gotowa do odb') || (str_contains($lower, 'odbiór') && !str_contains($lower, 'w drodze'))) {
|
||||
return self::READY_FOR_PICKUP;
|
||||
}
|
||||
if (str_contains($lower, 'nadana') || str_contains($lower, 'nadano')) {
|
||||
return self::CONFIRMED;
|
||||
}
|
||||
if (str_contains($lower, 'przygotowan') || str_contains($lower, 'utworzon')) {
|
||||
return self::CREATED;
|
||||
}
|
||||
if (str_contains($lower, 'uszkodzon') || str_contains($lower, 'problem') || str_contains($lower, 'zagubion')) {
|
||||
return self::PROBLEM;
|
||||
}
|
||||
|
||||
return self::UNKNOWN;
|
||||
}
|
||||
|
||||
public static function trackingUrl(string $provider, string $trackingNumber, string $carrierId = ''): ?string
|
||||
{
|
||||
$number = trim($trackingNumber);
|
||||
|
||||
Reference in New Issue
Block a user