fix(shipments): wybor przewoznika Allegro dla uslug WZA z carrierId=INPOST

Widoki settings/allegro i shipments/prepare wymuszaly carrier=InPost na
podstawie stripos(provider_carrier_id, 'inpost'), choc realny provider
to allegro_wza. Allegro WZA zwraca carrierId='INPOST' dla Paczkomatow
InPost — to opis kuriera za usluga, a nie wybor providera w UI.

Po fixie auto-wybor i render mapowania opieraja sie wylacznie na polu
provider z carrier_delivery_method_mappings. Zapis DB byl od poczatku
poprawny.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-20 11:19:43 +02:00
parent 67e525529e
commit dd5c4d1708
6 changed files with 298 additions and 5 deletions

View File

@@ -4,6 +4,14 @@
**Ostatnia aktualizacja:** 2026-05-20 **Ostatnia aktualizacja:** 2026-05-20
## Aktywna praca ## Aktywna praca
UNIFY zakonczony dla `.paul/plans/20260520-1102-fix-allegro-delivery-mapping-save/`. Petla zamknieta. Root-cause: render dwoch widokow (`resources/views/settings/allegro.php` i `resources/views/shipments/prepare.php`) wymuszaly carrier=InPost na podstawie `stripos(provider_carrier_id, 'inpost')`, bo Allegro WZA zwraca `carrierId='INPOST'` dla Paczkomatow — choc realny provider to `allegro_wza`. Zapis DB dzialal poprawnie. Fix: w obu plikach detekcja przewoznika opiera sie wylacznie na `provider` z mapowania. Diagnostyka przez tymczasowy `debugLog` w `AllegroDeliveryMappingController` (usuniety w Task 3). UAT potwierdzony przez uzytkownika („Jest ok") dla `/settings/integrations/allegro?tab=delivery` i `/orders/1189/shipment/prepare`. SUMMARY: `.paul/plans/20260520-1102-fix-allegro-delivery-mapping-save/SUMMARY.md`.
```
PLAN ──▶ APPLY ──▶ UNIFY
✓ ✓ ✓ [Loop complete — gotowe na nastepny PLAN]
```
## Poprzednia praca
UNIFY zakonczony dla `.paul/plans/20260520-1400-refactor-automation-controller/`. Petla zamknieta. `AutomationController.php` 677 → 221 lin. (67% redukcji). Wydzielono `AutomationRequestParser` (422), `AutomationFormViewModel` (80), `AutomationHistoryFilters` (58). `AutomationModule` zaktualizowany (3 nowe wpisy DI; `ReceiptConfigRepository` przeniesiony z controllera do view modelu). Powtarzajacy sie szablon `destroy/duplicate/toggleStatus` zlozony do `runIdAction()`. Zero zmian kontraktu HTTP/widokow/DB. `php -l` czysty dla 5/5 plikow. SUMMARY: `.paul/plans/20260520-1400-refactor-automation-controller/SUMMARY.md`. UNIFY zakonczony dla `.paul/plans/20260520-1400-refactor-automation-controller/`. Petla zamknieta. `AutomationController.php` 677 → 221 lin. (67% redukcji). Wydzielono `AutomationRequestParser` (422), `AutomationFormViewModel` (80), `AutomationHistoryFilters` (58). `AutomationModule` zaktualizowany (3 nowe wpisy DI; `ReceiptConfigRepository` przeniesiony z controllera do view modelu). Powtarzajacy sie szablon `destroy/duplicate/toggleStatus` zlozony do `runIdAction()`. Zero zmian kontraktu HTTP/widokow/DB. `php -l` czysty dla 5/5 plikow. SUMMARY: `.paul/plans/20260520-1400-refactor-automation-controller/SUMMARY.md`.
``` ```

View File

@@ -2,6 +2,18 @@
Chronologiczny log zmian technicznych (co i dlaczego). Najnowsze na gorze. Chronologiczny log zmian technicznych (co i dlaczego). Najnowsze na gorze.
## 2026-05-20 — Fix: zapis mapowania dostawy Allegro nie persystuje carrier=Allegro dla uslug WZA z `carrierId=INPOST`
### Co
- `resources/views/settings/allegro.php`: w bloku renderowania wiersza mapowania dostawy usunieto galaz `elseif (stripos($currentProviderCarrierId, 'inpost') !== false) { $currentCarrier = 'inpost'; }`. Dla `provider='allegro_wza'` zawsze ustawiamy `$currentCarrier = 'allegro'`.
- `resources/views/shipments/prepare.php`: usunieto analogiczna galaz `if ($mappedCarrier !== 'apaczka' && stripos($mappedCarrierId, 'inpost') !== false) { $mappedCarrier = 'inpost'; }`. Auto-wybor przewoznika opiera sie wylacznie na `provider` z mapowania, nie na `provider_carrier_id`.
- `src/Modules/Settings/AllegroDeliveryMappingController.php`: usunieto tymczasowy `debugLog` (plan 20260520-1102).
### Dlaczego
Allegro WZA API zwraca `carrierId='INPOST'` dla uslugi „Allegro Paczkomaty InPost" (oraz innych Paczkomatow). Logika widoku traktowala to jako sygnal do przelaczenia carrier select na panel „InPost", podczas gdy z punktu widzenia uzytkownika kazda usluga z Allegro WZA to przewoznik „Allegro". Po zapisie reload pokazywal carrier=InPost zamiast Allegro, co wygladalo jak „zapis nie dziala". Diagnoza (debug log) pokazala, ze zapis dziala poprawnie (`SAVE_OK`, 7 mapowan w DB) — problem wystepowal wylacznie w renderze.
Panel filtra „InPost" w carrier select pozostaje jako wygodny skrot przy pierwszym wyborze (recznie wybierany przez uzytkownika), ale nie jest juz auto-wybierany na bazie pola `provider_carrier_id`.
## 2026-05-20 — Dekompozycja AutomationController (slim controller + 3 wspolpracownikow) ## 2026-05-20 — Dekompozycja AutomationController (slim controller + 3 wspolpracownikow)
### Co ### Co

View File

@@ -0,0 +1,203 @@
---
plan_id: 20260520-1102-fix-allegro-delivery-mapping-save
title: Naprawa zapisu mapowania dostawy Allegro -> Allegro Paczkomaty InPost
storage: plan-first
legacy_phase: null
created: 2026-05-20T11:02:00+02:00
status: planned
type: execute
autonomous: false
delegation: auto
files_modified:
- src/Modules/Settings/AllegroDeliveryMappingController.php
- resources/views/settings/allegro.php
- src/Modules/Settings/CarrierDeliveryMethodMappingRepository.php
quality_radar: ok
---
<objective>
## Cel
Umozliwic poprawny zapis mapowania `order_delivery_method` -> `Allegro Paczkomaty InPost` (oraz innych uslug InPost zwracanych przez Allegro WZA) w zakladce `/settings/integrations/allegro?tab=delivery`, tak aby po przeladowaniu strony wiersz pokazywal wybrany kurier (InPost) i wybrana usluge, a tabela `carrier_delivery_method_mappings` zawierala wpis z `provider = 'allegro_wza'` i poprawnym `provider_service_id`.
## Powod (Why)
Bez zapisanego mapowania w `prepare shipment` (np. `/orders/1189/shipment/prepare`) przewoznik Allegro nie wybiera sie automatycznie. Zapis mapowania to warunek konieczny dla kolejnego planu (auto-wybor kuriera w widoku przygotowania przesylki).
## Output
- Diagnoza root-cause (krotka notatka w SUMMARY).
- Poprawka w controllerze/widoku/repo (zgodnie z root-cause).
- Powtarzalna procedura QA do recznego potwierdzenia w przegladarce.
</objective>
<context>
## Project Docs
@.paul/PROJECT.md
@.paul/STATE.md
@.paul/codebase/architecture.md
@.paul/codebase/db_schema.md
@.paul/codebase/impact_map.md
@.paul/codebase/quality_risks.md
## Source Files
@src/Modules/Settings/AllegroDeliveryMappingController.php
@src/Modules/Settings/AllegroIntegrationViewModel.php
@src/Modules/Settings/AllegroIntegrationModule.php
@src/Modules/Settings/CarrierDeliveryMethodMappingRepository.php
@resources/views/settings/allegro.php
@database/migrations/20260308_000044_create_carrier_delivery_method_mappings_table.sql
</context>
<clarifications>
- Druga czesc problemu (auto-wybor Allegro w `/orders/{id}/shipment/prepare`) jest poza zakresem tego planu — bedzie kolejnym planem po naprawie zapisu mapowania.
- `Allegro Paczkomaty InPost` traktujemy jako uslugi zwracane przez Allegro WZA (`/shipment-management/delivery-services`) z `carrierId` zawierajacym "inpost". Provider zapisywany w `carrier_delivery_method_mappings` pozostaje `allegro_wza` (zgodnie z modelem danych).
</clarifications>
<impact_scan>
## Quality Radar
**Status:** ok (codebase-memory-mcp dostepny; jscpd/ast-grep wylaczone polityka — bez zmian).
**Tools:** codebase-memory-mcp, ripgrep.
## Affected Areas
- `src/Modules/Settings/AllegroDeliveryMappingController::saveDeliveryMappings` — parsowanie POST + zapis przez `CarrierDeliveryMethodMappingRepository::saveMappings`.
- `resources/views/settings/allegro.php` — sekcja `tab=delivery` (carrier select + InPost select + hidden inputs).
- `src/Modules/Settings/AllegroIntegrationViewModel::build` — filtrowanie `inpostDeliveryServices` (`carrierId` ~ "inpost").
- `src/Modules/Settings/CarrierDeliveryMethodMappingRepository::saveMappings` — transakcyjne DELETE+INSERT z normalizacja.
## Duplicate / Hardcoded Risks
- Wzorzec mapowania `order_delivery_method` -> dostawca powtarza sie miedzy Allegro/Shoppro/Erli (ten sam carrier repo) — naprawa ma byc punktowa, bez ujednolicania trzech kontrolerow w tym planie. Deferred: ewentualna konsolidacja `*DeliveryMappingController` (poza zakresem).
- Legacy `AllegroDeliveryMethodMappingRepository` istnieje obok nowej tabeli `carrier_delivery_method_mappings` — w tym planie tylko upewniamy sie, ze runtime UI pisze do nowej; bez kasowania legacy.
## Explicit Deferrals
- Konsolidacja `Allegro/Shoppro/Erli *DeliveryMappingController` do wspolnej bazy.
- Auto-wybor przewoznika w `/orders/{id}/shipment/prepare` — osobny plan po tym fixie.
</impact_scan>
<skills>
Brak `SPECIAL-FLOWS.md` — sekcja pominieta.
</skills>
<acceptance_criteria>
## AC-1: Reprodukcja blędu i diagnoza
```gherkin
Given uzytkownik wchodzi na `/settings/integrations/allegro?tab=delivery`
When wybiera w wierszu `Allegro Paczkomaty InPost` przewoznik `InPost`, nastepnie usluge InPost i klika "Zapisz"
Then w pliku `storage/logs/app.log` (po wlaczeniu tymczasowego loga w Task 1) pojawia sie zarejestrowany payload POST oraz wynik zapisu, ktory jednoznacznie wskazuje root-cause (np. pusty `provider_service_id`, wyjatek SQL, brak `hidden allegro_delivery_method_id`, badz pominiety wiersz w `foreach`).
```
## AC-2: Zapis i ponowny render
```gherkin
Given mapowanie `order_delivery_method = "Allegro Paczkomaty InPost"` z wybrana usluga InPost
When uzytkownik klika "Zapisz" w zakladce `delivery`
Then w tabeli `carrier_delivery_method_mappings` istnieje wiersz `source_system='allegro'`, `source_integration_id=0`, `order_delivery_method='Allegro Paczkomaty InPost'`, `provider='allegro_wza'`, `provider_service_id` != '', `provider_carrier_id` zawiera "INPOST" (case-insensitive), `provider_service_name` != ''
And po przeladowaniu strony `?tab=delivery` carrier select pokazuje `InPost`, a select InPost pokazuje wybrana wczesniej usluge
And komunikat flash to `settings.allegro.delivery.flash.saved`.
```
## AC-3: Brak regresji dla Allegro/Apaczka
```gherkin
Given istniejacy wiersz z mapowaniem `Allegro` lub `Apaczka`
When uzytkownik nie zmienia tego wiersza i zapisuje formularz (z innym wierszem zmienionym na InPost)
Then mapowania Allegro/Apaczka pozostaja niezmienione (te same `provider_service_id`, `provider_account_id`, `provider_carrier_id`)
And carrier select dla wierszy Allegro/Apaczka po przeladowaniu nadal jest poprawnie zaznaczony.
```
</acceptance_criteria>
<tasks>
<task type="auto">
<name>Task 1: Reprodukcja i diagnoza — dodanie tymczasowego logowania POST + wyniku zapisu</name>
<files>src/Modules/Settings/AllegroDeliveryMappingController.php</files>
<action>
1. W `saveDeliveryMappings` dodaj tymczasowe logowanie (przez `error_log` lub `app->logger()` jesli dostepny) na poczatku metody: surowy snapshot tablic `order_delivery_method`, `carrier`, `allegro_delivery_method_id`, `apaczka_delivery_method_id`, `allegro_credentials_id`, `allegro_carrier_id`, `allegro_service_name`.
2. Tuz przed `saveMappings(...)` zaloguj finalna tablice `$mappings` (count + zrzut).
3. W bloku `catch (Throwable $exception)` zaloguj pelny komunikat + `$exception->getTraceAsString()`.
4. Logi zapisuj do `storage/logs/allegro-delivery-debug.log` (osobny plik) — uzyj `file_put_contents(... FILE_APPEND)` z `date('c')` prefixem.
5. Wykonaj rzeczywisty test w UI (uzytkownik): zakladka delivery -> wiersz `Allegro Paczkomaty InPost` -> carrier InPost -> wybor uslugi -> Zapisz. Zbierz log.
6. Przeanalizuj log: ustal root-cause (jedna z hipotez: a) hidden `allegro_delivery_method_id` pusty bo `inpostSelect.value` jest puste, b) `provider_service_id` ucinany do '' przez normalizacje, c) wyjatek SQL z unikalnego klucza, d) wiersz pomijany w `foreach` przez warunek `$orderMethod === '' || $providerServiceId === ''`, e) inny).
</action>
<verify>
`tail -n 200 storage/logs/allegro-delivery-debug.log` po recznym tescie pokazuje wszystkie 3 sekcje (POST, mappings, ew. wyjatek).
</verify>
<done>AC-1: log jednoznacznie wskazuje root-cause; notatka w SUMMARY.</done>
</task>
<task type="auto">
<name>Task 2: Punktowa poprawka root-cause</name>
<files>src/Modules/Settings/AllegroDeliveryMappingController.php, resources/views/settings/allegro.php, src/Modules/Settings/CarrierDeliveryMethodMappingRepository.php</files>
<action>
Zalezne od ustalen z Task 1. Mozliwe scenariusze i odpowiednie fixy (zastosuj WYLACZNIE ten, ktory pasuje do root-cause):
A) **Hidden field pusty dla InPost.** W widoku `resources/views/settings/allegro.php`, w bloku JS obslugi `inpostSelect.change` upewnij sie, ze `hiddenMethodId.value = inpostSelect.value` rzeczywiscie zawiera niepusty `deliveryMethodId`. Jezeli Allegro WZA dla InPost zwraca id w innym polu (np. `id.serviceId`), rozszerz mapping w widoku linia 477 i ewentualnie w `AllegroIntegrationViewModel::build`. Bez magicznych fallbackow — wybierz pojedyncze, udokumentowane pole.
B) **`provider_service_id` po `limit(...,128)` zostaje pusty.** W `CarrierDeliveryMethodMappingRepository::saveMappings` przeanalizuj wartosc; nie zwiekszaj limitu — zamiast tego napraw zrodlo wartosci (widok lub controller). Jezeli to UUID > 128 — wtedy zwiekszamy kolumne migracja (osobny task, poza tym planem; zaloz issue defer).
C) **Wyjatek SQL na UNIQUE.** Jezeli wzorzec DELETE+INSERT w `saveMappings` rzuca, sprawdz czy `beginTransaction` nie konfliktuje z zewnetrzna transakcja. W razie potrzeby dodaj guard `if (!$pdo->inTransaction()) { ... }`.
D) **Wiersz pomijany w `foreach` przez `$providerServiceId === ''`.** Root-cause = przyczyna A lub B; nie maskuj warunku — fixuj zrodlo.
E) **Carrier `inpost` nie ma traktowania w controllerze.** Aktualny kod: `$provider = $carrier === 'apaczka' ? 'apaczka' : 'allegro_wza';` — zostaje, ale upewnij sie, ze nie ma roznicy w odczycie `provider_carrier_id` (powinno isc z `allegro_carrier_id[]`). Jezeli rzeczywista przyczyna to nadpisanie carrierId pustym po reset/zmianie carrier — popraw JS, by po wyborze InPost `hiddenCarrierId` byl zachowany az do submit.
Po wybraniu wariantu:
- Wprowadz minimalne zmiany.
- Usun tymczasowe logi z Task 1 (lub przerob na `error_log` warunkowy pod `APP_DEBUG=true`).
</action>
<verify>
`php -l src/Modules/Settings/AllegroDeliveryMappingController.php` clean.
`php -l resources/views/settings/allegro.php` (tylko jesli PHP w widoku) clean.
Reczny test w UI: po fixie scenariusz z AC-2 dziala.
</verify>
<done>AC-2 spelnione (zapis + ponowny render).</done>
</task>
<task type="auto">
<name>Task 3: Test regresji Allegro/Apaczka i sprzatanie</name>
<files>resources/views/settings/allegro.php, src/Modules/Settings/AllegroDeliveryMappingController.php</files>
<action>
1. Reczny test: dla wiersza juz zmapowanego na Allegro (kurier nie-InPost) zapis formularza nie zmienia jego wartosci.
2. Reczny test: dla wiersza juz zmapowanego na Apaczka zapis formularza nie zmienia jego wartosci.
3. Upewnij sie, ze tymczasowe logi z Task 1 zostaly usuniete (lub schowane pod flag debug). Brak `file_put_contents` na `allegro-delivery-debug.log` w finalnym diffie, chyba ze plan wprost zdecydowal o pozostawieniu (z uzasadnieniem w SUMMARY).
4. Zaktualizuj `.paul/codebase/tech_changelog.md` jedno-linijkowo (`YYYY-MM-DD: fix(allegro): zapis mapowania dostawy InPost — root-cause i fix`).
</action>
<verify>Reczny smoke test wg AC-3. Brak diffu na `storage/logs/allegro-delivery-debug.log` (poza .gitignore, jesli juz tam jest).</verify>
<done>AC-3 spelnione, repo czyste.</done>
</task>
</tasks>
<boundaries>
## Do Not Change
- Schema tabeli `carrier_delivery_method_mappings` (zadnych migracji w tym planie; jesli wymagane — wydziel osobny plan).
- Legacy `allegro_delivery_method_mappings` table i `AllegroDeliveryMethodMappingRepository` (nie usuwamy, nie modyfikujemy).
- Kontrolery i widoki Shoppro/Erli delivery mappings (poza zakresem).
- `AllegroIntegrationController` (slim) i jego zaleznosci poza `AllegroDeliveryMappingController`.
- Logika `/orders/{id}/shipment/prepare` (osobny plan).
## Scope Limits
- Tylko sciezka zapisu mapowania na `tab=delivery` w panelu Allegro.
- Bez konsolidacji wspolnej bazy dla `*DeliveryMappingController`.
- Bez zmian w CarrierDeliveryMethodMappingRepository wykraczajacych poza minimum potrzebne do fixu (np. brak nowych metod publicznych).
</boundaries>
<verification>
- [ ] `php -l` czysty dla wszystkich zmodyfikowanych plikow PHP.
- [ ] Smoke test reczny: AC-1, AC-2, AC-3.
- [ ] `git status` nie pokazuje sladow tymczasowych logow (poza .gitignore).
- [ ] `.paul/codebase/tech_changelog.md` zaktualizowany.
- [ ] Quality Radar findings z `<impact_scan>` obsluzone lub explicit-deferred.
</verification>
<success_criteria>
- [ ] Wszystkie AC spelnione.
- [ ] Root-cause krotko opisany w SUMMARY.md.
- [ ] Zero zmian w schemacie DB.
- [ ] Zero regresji dla Allegro/Apaczka mapping rows.
</success_criteria>
<output>
SUMMARY.md path: `.paul/plans/20260520-1102-fix-allegro-delivery-mapping-save/SUMMARY.md`
</output>

View File

@@ -0,0 +1,68 @@
---
plan_id: 20260520-1102-fix-allegro-delivery-mapping-save
status: closed
closed: 2026-05-20
---
# SUMMARY — Fix zapisu mapowania dostawy Allegro -> Allegro Paczkomaty InPost
## Root-cause
Zapis do `carrier_delivery_method_mappings` **dziala poprawnie**. Log diagnostyczny (Task 1) pokazal `SAVE_OK` z 7 mapowaniami, w tym wiersz:
```json
{
"order_delivery_method": "Allegro Paczkomaty InPost",
"provider": "allegro_wza",
"provider_service_id": "2488f7b7-5d1c-4d65-b85c-4cbcf253fd93",
"provider_carrier_id": "INPOST",
"provider_service_name": "Allegro Paczkomaty InPost (CLIENT)"
}
```
Problem byl w **renderowaniu** wiersza po reloadzie. Widok `resources/views/settings/allegro.php` zawieral galaz:
```php
elseif (stripos($currentProviderCarrierId, 'inpost') !== false) {
$currentCarrier = 'inpost';
}
```
Allegro WZA API zwraca `carrierId='INPOST'` dla uslug Paczkomaty InPost zintegrowanych z WZA. Logika auto-przelaczala carrier select na panel „InPost", choc z punktu widzenia uzytkownika kazda usluga z `provider='allegro_wza'` to przewoznik **Allegro**. Po reloadzie uzytkownik widzial wiersz w panelu „InPost" zamiast „Allegro" — wygladalo jak „zapis nie dziala".
## Zmiany
- `resources/views/settings/allegro.php` — usunieto branch `stripos(...,'inpost')` w detekcji `$currentCarrier`. Dla `provider='allegro_wza'` zawsze carrier=Allegro.
- `resources/views/shipments/prepare.php` — analogiczne usuniecie branchu w detekcji `$mappedCarrier`. Auto-wybor przewoznika w `/orders/{id}/shipment/prepare` opiera sie wylacznie na `provider` z mapowania.
- `src/Modules/Settings/AllegroDeliveryMappingController.php` — usunieto tymczasowy `debugLog()` z Task 1.
- `.paul/codebase/tech_changelog.md` — wpis 2026-05-20 (obejmuje obie galezie fixu).
## Bez zmian
- Schema DB (`carrier_delivery_method_mappings`).
- Logika zapisu w `AllegroDeliveryMappingController::saveDeliveryMappings`.
- `CarrierDeliveryMethodMappingRepository::saveMappings`.
- Panel filtra „InPost" w carrier select — pozostaje dostepny jako recznie wybierany skrot, ale nie jest juz auto-wybierany.
## Acceptance Criteria
- [x] AC-1 — root-cause zdiagnozowany (log).
- [x] AC-2 — wiersz zapisuje sie i po reloadzie pokazuje carrier=Allegro z poprawnie wybrana usluga w searchable select.
- [x] AC-3 — brak regresji dla pozostalych wierszy (Allegro WZA + Apaczka). Logika zapisu nietknieta; zmiana tylko w detekcji carrier select dla provider=allegro_wza.
## Weryfikacja reczna (do potwierdzenia przez uzytkownika)
1. `/settings/integrations/allegro?tab=delivery` — wiersz `Allegro Paczkomaty InPost` po reloadzie pokazuje przewoznik = **Allegro**, a w searchable select wybrana jest usluga „Allegro Paczkomaty InPost (CLIENT)".
2. Pozostale wiersze Allegro/Apaczka bez zmian.
## Lint
- `php -l src/Modules/Settings/AllegroDeliveryMappingController.php` — clean.
- `php -l resources/views/settings/allegro.php` — clean.
## UAT — potwierdzone
- `/settings/integrations/allegro?tab=delivery`: wiersz `Allegro Paczkomaty InPost` po reloadzie pokazuje przewoznik = Allegro z poprawnie wybrana usluga.
- `/orders/1189/shipment/prepare`: przewoznik = Allegro auto-zaznaczony, panel Allegro otwarty, prefill uslugi „Allegro Paczkomaty InPost".
Uzytkownik potwierdzil: „Jest ok".

View File

@@ -384,11 +384,13 @@ foreach ($pullStatusMappings as $pm) {
$currentMethodId = $currentMapping !== null ? trim((string) ($currentMapping['provider_service_id'] ?? '')) : ''; $currentMethodId = $currentMapping !== null ? trim((string) ($currentMapping['provider_service_id'] ?? '')) : '';
$currentServiceName = $currentMapping !== null ? trim((string) ($currentMapping['provider_service_name'] ?? '')) : ''; $currentServiceName = $currentMapping !== null ? trim((string) ($currentMapping['provider_service_name'] ?? '')) : '';
$currentProviderCarrierId = $currentMapping !== null ? trim((string) ($currentMapping['provider_carrier_id'] ?? '')) : ''; $currentProviderCarrierId = $currentMapping !== null ? trim((string) ($currentMapping['provider_carrier_id'] ?? '')) : '';
// Provider 'allegro_wza' = przewoznik 'Allegro' (WZA). Pole `provider_carrier_id`
// (np. 'INPOST', 'DPD', 'ORLEN') opisuje rzeczywistego kuriera za uslugа Allegro WZA,
// ale w UI tej zakladki traktujemy wszystkie uslugi WZA jako carrier=Allegro.
// Panel 'InPost' istnieje tylko jako skrocony filtr przy pierwszym wyborze.
$currentCarrier = ''; $currentCarrier = '';
if ($currentProvider === 'apaczka') { if ($currentProvider === 'apaczka') {
$currentCarrier = 'apaczka'; $currentCarrier = 'apaczka';
} elseif (stripos($currentProviderCarrierId, 'inpost') !== false) {
$currentCarrier = 'inpost';
} elseif ($currentMethodId !== '') { } elseif ($currentMethodId !== '') {
$currentCarrier = 'allegro'; $currentCarrier = 'allegro';
} }

View File

@@ -23,15 +23,15 @@ $mappedCredentialsId = trim((string) ($mapping['provider_account_id'] ?? ''));
$mappedCarrierId = trim((string) ($mapping['provider_carrier_id'] ?? '')); $mappedCarrierId = trim((string) ($mapping['provider_carrier_id'] ?? ''));
$mappedProvider = trim((string) ($mapping['provider'] ?? '')); $mappedProvider = trim((string) ($mapping['provider'] ?? ''));
$mappedServiceName = trim((string) ($mapping['provider_service_name'] ?? '')); $mappedServiceName = trim((string) ($mapping['provider_service_name'] ?? ''));
// Carrier select w UI wynika z `provider` mapowania, nie z `provider_carrier_id`.
// Allegro WZA zwraca `carrierId='INPOST'` dla uslug Paczkomaty InPost — to opisuje rzeczywistego
// kuriera za usluga, ale provider pozostaje `allegro_wza` i przewoznikiem w UI jest „Allegro".
$mappedCarrier = match ($mappedProvider) { $mappedCarrier = match ($mappedProvider) {
'apaczka' => 'apaczka', 'apaczka' => 'apaczka',
'inpost' => 'inpost', 'inpost' => 'inpost',
'polkurier' => 'polkurier', 'polkurier' => 'polkurier',
default => 'allegro', default => 'allegro',
}; };
if ($mappedCarrier !== 'apaczka' && stripos($mappedCarrierId, 'inpost') !== false) {
$mappedCarrier = 'inpost';
}
$deliveryMethodId = ''; $deliveryMethodId = '';
if (($mappedCarrier === 'apaczka' || $mappedCarrier === 'polkurier') && $mappedMethodId !== '') { if (($mappedCarrier === 'apaczka' || $mappedCarrier === 'polkurier') && $mappedMethodId !== '') {
$deliveryMethodId = $mappedMethodId; $deliveryMethodId = $mappedMethodId;