--- phase: 77-cod-amount-fix plan: 01 type: execute wave: 1 depends_on: [] files_modified: - src/Core/Support/StringHelper.php - src/Modules/Settings/ShopproOrderMapper.php - resources/views/shipments/prepare.php - resources/views/orders/show.php - src/Modules/Orders/OrdersController.php autonomous: true --- ## Goal Naprawić automatyczne uzupełnianie kwoty pobrania (COD) przy generowaniu przesyłki dla zamówień spoza Allegro (shopPRO). ## Purpose Zamówienia shopPRO z płatnością za pobraniem nie mają auto-wypełnionej kwoty COD w formularzu przesyłki, ponieważ pole `external_payment_type_id` zawiera wartość z shopPRO API (np. `"cod"`, `"pobranie"`), a nie Allegro-specyficzne `"CASH_ON_DELIVERY"`. ## Output - Centralna metoda `StringHelper::isCodPayment()` zastępuje wszystkie hardcoded sprawdzenia - ShopproOrderMapper normalizuje typ płatności do `CASH_ON_DELIVERY` przy imporcie - Kwota pobrania auto-wypełnia się poprawnie dla zamówień z każdego źródła ## Project Context @.paul/PROJECT.md @.paul/ROADMAP.md @.paul/STATE.md ## Source Files @src/Core/Support/StringHelper.php @src/Modules/Settings/ShopproOrderMapper.php @resources/views/shipments/prepare.php @resources/views/orders/show.php @src/Modules/Orders/OrdersController.php No specialized flows configured — optional skills only. ## AC-1: COD auto-fill dla zamówień shopPRO ```gherkin Given zamówienie shopPRO z payment_method "cod" lub "pobranie" lub "za pobraniem" When użytkownik wchodzi na /orders/{id}/shipment/prepare Then pole "Pobranie" zawiera kwotę total_with_tax zamówienia And widoczny jest badge "ZA POBRANIEM" ``` ## AC-2: COD auto-fill dla zamówień Allegro (regresja) ```gherkin Given zamówienie Allegro z external_payment_type_id "CASH_ON_DELIVERY" When użytkownik wchodzi na /orders/{id}/shipment/prepare Then pole "Pobranie" zawiera kwotę total_with_tax zamówienia (bez zmian w zachowaniu) ``` ## AC-3: Detekcja COD w widoku szczegółów zamówienia ```gherkin Given zamówienie z dowolnym wariantem nazwy COD When użytkownik przegląda szczegóły zamówienia Then badge "Za pobraniem" wyświetla się poprawnie ``` Task 1: Centralna metoda isCodPayment w StringHelper + normalizacja w ShopproOrderMapper src/Core/Support/StringHelper.php, src/Modules/Settings/ShopproOrderMapper.php 1. W `StringHelper` dodaj statyczną metodę `isCodPayment(string $value): bool`: - Normalizuj wartość: `strtoupper(trim($value))` - Sprawdź czy pasuje do znanego zbioru: `CASH_ON_DELIVERY`, `COD`, `POBRANIE`, `ZA POBRANIEM` - Zwróć true/false 2. W `ShopproOrderMapper::mapOrderAggregate()` (linia 139): - Po odczytaniu `payment_method` ze ścieżek `['payment_method', 'payment.method', 'payments.method']` - Jeśli odczytana wartość jest rozpoznawana jako COD (przez `StringHelper::isCodPayment()`), znormalizuj na `'CASH_ON_DELIVERY'` - Dzięki temu nowe importy będą miały ujednolicony format Nie zmieniaj kontraktu ShopproOrderMapper dla pozostałych pól. Przegląd kodu: metoda isCodPayment obsługuje min. 4 warianty; ShopproOrderMapper normalizuje COD. AC-1 i AC-2 spełnione od strony danych — nowe importy mają ujednolicony format Task 2: Zamiana hardcoded sprawdzeń na StringHelper::isCodPayment resources/views/shipments/prepare.php, resources/views/orders/show.php, src/Modules/Orders/OrdersController.php 1. `resources/views/shipments/prepare.php` linia 41: - Zamień: `strtoupper(trim(...)) === 'CASH_ON_DELIVERY'` - Na: `\App\Core\Support\StringHelper::isCodPayment((string) ($orderRow['external_payment_type_id'] ?? ''))` 2. `src/Modules/Orders/OrdersController.php` linia 343: - Zamień: `$isCod = $paymentType === 'CASH_ON_DELIVERY'` - Na: `$isCod = StringHelper::isCodPayment($paymentType)` - Upewnij się że `use App\Core\Support\StringHelper;` jest w importach 3. `resources/views/orders/show.php`: - Znajdź wszystkie porównania z `'CASH_ON_DELIVERY'` (linie ~222, 228, 578, 678) - Zamień na `\App\Core\Support\StringHelper::isCodPayment(...)` - Zachowaj mapę wyświetlania nazw (array z 'CASH_ON_DELIVERY' => 'Za pobraniem' itp.) — dodaj warianty COD do mapy Nie zmieniaj logiki wyświetlania ani formatowania — tylko warunek detekcji COD. Grep po codebase: brak hardcoded `=== 'CASH_ON_DELIVERY'` w plikach PHP poza testami i DOCS. Widok shipment prepare: zamówienie shopPRO z pobraniem ma auto-wypełnioną kwotę. AC-1, AC-2, AC-3 spełnione — detekcja COD działa dla wszystkich źródeł zamówień ## DO NOT CHANGE - src/Modules/Settings/AllegroOrderImportService.php (Allegro import działa poprawnie) - database/migrations/* (brak zmian schematu) - src/Modules/Shipments/ShipmentController.php (logika tworzenia przesyłki nie wymaga zmian) ## SCOPE LIMITS - Nie aktualizujemy istniejących danych w bazie (istniejące zamówienia shopPRO z "cod" zachowają starą wartość — helper obsłuży je w runtime) - Nie dodajemy migracji - Nie zmieniamy API ani endpointów Before declaring plan complete: - [ ] `StringHelper::isCodPayment()` rozpoznaje: CASH_ON_DELIVERY, COD, POBRANIE, ZA POBRANIEM - [ ] ShopproOrderMapper normalizuje COD na 'CASH_ON_DELIVERY' przy nowych importach - [ ] Brak hardcoded `=== 'CASH_ON_DELIVERY'` w prepare.php, show.php, OrdersController.php - [ ] Formularz przesyłki auto-wypełnia kwotę COD dla zamówień shopPRO - [ ] Brak regresji: zamówienia Allegro nadal działają poprawnie - Wszystkie 2 taski ukończone - Weryfikacja przeszła pomyślnie - Brak błędów PHP na stronach przygotowania przesyłki i szczegółów zamówienia After completion, create `.paul/phases/77-cod-amount-fix/77-01-SUMMARY.md`