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:
@@ -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`.
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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>
|
||||||
@@ -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".
|
||||||
@@ -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';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
|
|||||||
Reference in New Issue
Block a user