--- phase: 76-shipment-receiver-fallback plan: 01 type: execute wave: 1 depends_on: [] files_modified: - src/Modules/Shipments/ShipmentController.php - src/Modules/Settings/ShopproOrderMapper.php autonomous: true --- ## Goal Naprawic puste dane odbiorcy na stronie przygotowania przesylki (`/orders/{id}/shipment/prepare`) dla zamowien shopPRO, gdzie adres dostawy zawiera tylko nazwe metody dostawy bez danych adresowych. ## Purpose Sprzedawca nie musi reczne przepisywac danych klienta do formularza przesylki — formularz automatycznie wypelnia sie danymi z adresu klienta gdy adres dostawy nie ma pelnych danych. ## Output - Poprawiona metoda `buildReceiverAddress` w ShipmentController z fallbackami na dane klienta - Poprawiona metoda `buildDeliveryAddress` w ShopproOrderMapper — rozroznienie label metody dostawy od nazwy odbiorcy ## Project Context @.paul/PROJECT.md @.paul/ROADMAP.md @.paul/STATE.md ## Source Files @src/Modules/Shipments/ShipmentController.php @src/Modules/Settings/ShopproOrderMapper.php ## Diagnostyka Zamowienie 183 (shopPRO) — dane w `order_addresses`: - customer: name="Paulina Smolinska", phone="505799865", email="paulinasmolinska2@wp.pl", street="Zamojskiego 80/46", city="Zuromin", zip="09-300" - delivery: name="Kurier - przedplata: 0 zl", phone="505799865", email="...", street=NULL, city=NULL, zip=NULL Problem: `buildReceiverAddress` uzywa delivery jako bazy, ale fallbacki dzialaja TYLKO dla name/phone/email — brak fallbacku na street/city/zip/country z customer address. Dodatkowy problem: mapper zapisuje label metody dostawy jako `name` w delivery address. No specialized flows configured ## AC-1: Fallback danych adresowych na klienta ```gherkin Given zamowienie shopPRO z adresem delivery bez street/city/zip And adres customer ma pelne dane (name, street, city, zip) When uzytkownik otwiera /orders/{id}/shipment/prepare Then formularz "Adres odbiorcy" jest wypelniony danymi z adresu customer (imie, ulica, miasto, kod) ``` ## AC-2: Delivery z pelnymi danymi — bez zmian ```gherkin Given zamowienie z adresem delivery zawierajacym pelne dane (street, city, zip) When uzytkownik otwiera /orders/{id}/shipment/prepare Then formularz uzywa danych z adresu delivery (bez zmian wzgledem obecnego zachowania) ``` ## AC-3: Nazwa odbiorcy — fallback na klienta gdy delivery name to label metody ```gherkin Given zamowienie shopPRO z delivery name = "Kurier - przedplata: 0 zl" And customer name = "Paulina Smolinska" When uzytkownik otwiera /orders/{id}/shipment/prepare Then pole "Imie i nazwisko" zawiera "Paulina Smolinska" ``` Task 1: Rozszerzyc fallbacki w buildReceiverAddress src/Modules/Shipments/ShipmentController.php W metodzie `buildReceiverAddress` (linia 423) dodac fallbacki z customer na delivery dla pol adresowych: - `street_name`: jezeli w delivery jest puste/null, uzyj z customer - `street_number`: jezeli w delivery jest puste/null, uzyj z customer - `city`: jezeli w delivery jest puste/null, uzyj z customer - `zip_code`: jezeli w delivery jest puste/null, uzyj z customer - `country`: jezeli w delivery jest puste/null, uzyj z customer Dodatkowo zmienic warunek fallbacku `name`: Obecny: fallback na customer name tylko gdy pickup point LUB delivery name jest puste. Nowy: fallback na customer name rowniez gdy delivery name wyglada jak label metody dostawy (nie ma adresu ulicy — tzn. jezeli delivery nie ma street_name, to name tez powinno byc z customer). Logika: jezeli delivery nie ma street_name (jest null/pusty) i customer ma name, uzyj customer name. To pokrywa zarowno przypadek pickup point, jak i "Kurier - przedplata" bez danych adresowych. Wzorzec fallbacku (analogicznie do istniejacych phone/email): ```php if (trim((string) ($result['street_name'] ?? '')) === '' && trim((string) ($customer['street_name'] ?? '')) !== '') { $result['street_name'] = $customer['street_name']; } ``` I tak samo dla street_number, city, zip_code, country. Dla name — zmienic warunek z: ```php if (($this->isPickupPointDelivery($delivery) || $deliveryName === '') && $customerName !== '') { ``` na: ```php $deliveryHasAddress = trim((string) ($delivery['street_name'] ?? '')) !== ''; if ((!$deliveryHasAddress || $this->isPickupPointDelivery($delivery) || $deliveryName === '') && $customerName !== '') { ``` Sprawdzic ze zamowienie 183 na /orders/183/shipment/prepare wyswietla dane klienta w formularzu odbiorcy. Sprawdzic ze zamowienia z pelnym adresem delivery nadal dzialaja poprawnie. AC-1, AC-2, AC-3 satisfied: formularz wypelnia sie danymi klienta gdy delivery nie ma danych adresowych ## DO NOT CHANGE - src/Modules/Orders/OrderImportRepository.php (logika importu) - src/Modules/Orders/OrdersRepository.php (logika zapytan) - resources/views/shipments/prepare.php (widok — formularz juz prawidlowo czyta z $receiver) - database/migrations/* (schemat bazy) ## SCOPE LIMITS - Nie zmieniamy sposobu importu adresow z shopPRO (ShopproOrderMapper::buildDeliveryAddress) — problem jest w prezentacji, nie w imporcie - Nie zmieniamy struktury tabeli order_addresses - Fix dotyczy tylko buildReceiverAddress w ShipmentController Before declaring plan complete: - [ ] Zamowienie 183: formularz na /orders/183/shipment/prepare wypelnia sie danymi klienta - [ ] Zamowienie z pelnym adresem delivery: formularz uzywa danych delivery - [ ] Zamowienie z pickup point (paczkomat): formularz uzywa name klienta i adres punktu - [ ] Brak bledow PHP - [ ] Docs zaktualizowane (ARCHITECTURE.md, TECH_CHANGELOG.md) - Formularz odbiorcy na stronie przygotowania przesylki jest wypelniony danymi klienta gdy delivery nie ma adresu - Istniejace zamowienia z pelnym adresem delivery dzialaja bez zmian - Brak regresji w tworzeniu przesylek After completion, create `.paul/phases/76-shipment-receiver-fallback/76-01-SUMMARY.md`