--- phase: 17-cart-summary-transport-cost-fix plan: 01 subsystem: checkout tags: [basket, transport, free-delivery, summary-view, php74] requires: - phase: 13-basket-logging-ttl-token provides: createOrderSubmitToken + TTL i logging w basketSave provides: - Poprawna kalkulacja kosztu transportu na /koszyk-podsumowanie - Testowalna chroniona metoda ShopBasketController::calculateTransportCostForSummary affects: [przyszle zmiany checkoutu, kupony, promocje darmowej dostawy] tech-stack: added: [] patterns: - "Logika prezentacyjna kosztu transportu trzymana w kontrolerze, nie w szablonie" - "Chronione metody pomocnicze testowane przez ReflectionMethod" key-files: created: - tests/Unit/front/Controllers/ShopBasketControllerSummaryViewTest.php modified: - autoload/front/Controllers/ShopBasketController.php - templates/shop-basket/summary-view.php key-decisions: - "Kalkulacja kosztu transportu zostaje w warstwie kontrolera (summaryView), nie w TransportRepository — Repository dostarcza dane, kontroler interpretuje je dla konkretnego widoku" - "Metoda calculateTransportCostForSummary pozostaje protected i jest testowana przez Reflection (public API kontrolera bez zmian)" patterns-established: - "Szablon summary-view otrzymuje gotowe klucze prezentacyjne (transport_cost_effective, free_delivery_applies) zamiast liczyc progi w locie" duration: ~25min started: 2026-04-20T00:00:00Z completed: 2026-04-20T00:25:00Z --- # Phase 17 Plan 01: Cart summary transport cost fix — Summary **Na /koszyk-podsumowanie wybrany transport z flaga delivery_free=1 pokazuje teraz rzeczywisty koszt ponizej progu darmowej dostawy i 0,00 zl powyzej progu — zgodnie z logika listy transportow na /koszyk.** ## Performance | Metric | Value | |--------|-------| | Duration | ~25 min | | Started | 2026-04-20 | | Completed | 2026-04-20 | | Tasks | 4 completed (3 auto + 1 checkpoint) | | Files modified | 2 modified + 1 created | ## Acceptance Criteria Results | Criterion | Status | Notes | |-----------|--------|-------| | AC-1: Transport z delivery_free ponizej progu pokazuje rzeczywisty koszt | Pass | Test `testTransportWithDeliveryFreeBelowThresholdShowsRealCost` + manualna weryfikacja | | AC-2: Transport z delivery_free powyzej progu pokazuje 0,00 zl | Pass | Test `testTransportWithDeliveryFreeAboveThresholdShowsZero` + manualna weryfikacja | | AC-3: Transport bez flagi delivery_free zawsze pokazuje koszt | Pass | Test `testTransportWithoutDeliveryFreeAlwaysShowsCost` + manualna weryfikacja | | AC-4: Suita PHPUnit zielona, nowy test przechodzi | Pass | 834/834 OK, 2318 assertions (6 nowych testow) | ## Accomplishments - Chroniona metoda `ShopBasketController::calculateTransportCostForSummary()` enkapsuluje regule progowa darmowej dostawy i jest czysto testowalna. - Szablon `summary-view.php` pozbyty dwoch duplikatow logiki `delivery_free == 1` — uzywa teraz gotowych kluczy widokowych. - 6 testow jednostkowych pokrywa 3 AC i 3 edge case'y (transport null, prog 0, wartosc koszyka rowna progowi). - Pelna suita zgadza sie z docs/MEMORY.md (>800 testow, 821 -> 834 po fazie). ## Task Commits Commit transition-phase jeszcze nie wykonany w tym UNIFY (patrz Deviations). | Task | Commit | Type | Description | |------|--------|------|-------------| | Task 1: Calc effective cost w kontrolerze | (pending) | fix | ShopBasketController::summaryView + calculateTransportCostForSummary | | Task 2: summary-view.php uzywa nowych kluczy | (pending) | fix | Usuniety odwolanie do transport.delivery_free w bloku podsumowania | | Task 3: Nowy test jednostkowy | (pending) | test | ShopBasketControllerSummaryViewTest (6 testow) | ## Files Created/Modified | File | Change | Purpose | |------|--------|---------| | `autoload/front/Controllers/ShopBasketController.php` | Modified | Dodana protected method calculateTransportCostForSummary; summaryView przekazuje transport_cost_effective + free_delivery_applies | | `templates/shop-basket/summary-view.php` | Modified | Wiersz kosztu transportu i suma koncowa uzywaja nowych kluczy zamiast transport.delivery_free | | `tests/Unit/front/Controllers/ShopBasketControllerSummaryViewTest.php` | Created | 6 testow jednostkowych dla logiki kalkulacji kosztu | ## Decisions Made | Decision | Rationale | Impact | |----------|-----------|--------| | Kalkulacja w kontrolerze, nie w TransportRepository | Repository juz ma `transportMethodsFront` robiace to samo, ale dla listy metod — dla pojedynczego wybranego transportu to decyzja widokowa nalezaca do kontrolera | Brak zmiany publicznego API Repository | | protected + Reflection do testow | Zgodne z istniejacym wzorcem `ShopBasketControllerTest` (Reflection), nie rozszerza publicznego API | Test izolowany od sesji i globali | | Boundary na prog > 0 | Jesli `settings.free_delivery = 0`, darmowa dostawa jest wylaczona (brak progu = brak regul) | Ochrona przed niezamierzonym zerowaniem kosztu w sklepach bez tej funkcji | ## Deviations from Plan ### Summary | Type | Count | Impact | |------|-------|--------| | Auto-fixed | 0 | — | | Scope additions | 2 | 2 dodatkowe edge-case testy (boundary rowny prog + prog 0) | | Deferred | 1 | Git commit transition-phase do wykonania w transition-phase lub rece | **Total impact:** Bez scope creepu; dodatki to defensywne testy edge-case'ow. ### Auto-fixed Issues None. ### Scope Additions **1. Test dla wartosci koszyka rownej progowi** - **Found during:** Task 3 (test jednostkowy) - **Issue:** Plan AC-2 mowi "powyzej progu", granica rowna progowi nie byla pokryta - **Fix:** Dodany `testTransportWithDeliveryFreeAtExactThresholdShowsZero` - **Rationale:** Stare `transportMethodsFront` uzywa `>=` — utrzymana spojnosc **2. Test dla settings.free_delivery = 0** - **Found during:** Task 1 (implementacja) - **Issue:** Sklepy bez ustawionego progu darmowej dostawy nie mogly miec zerowanych transportow; guard na > 0 wart pokrycia testem - **Fix:** Dodany `testZeroFreeDeliveryThresholdDisablesFreeDelivery` ### Deferred Items - Transition-phase git commit do uruchomienia w ramach `/paul:transition` lub recznego commita (spojne z historycznym wzorcem faz 15 i 16). ## Issues Encountered | Issue | Resolution | |-------|------------| | `test.ps1` nie istnieje w repo (pomimo wzmianki w CLAUDE.md) | Uruchomiono phpunit.phar bezposrednio przez `C:/xampp/php/php.exe phpunit.phar -c phpunit.xml` | ## Next Phase Readiness **Ready:** - Logika kosztu transportu w checkoutu spojna miedzy /koszyk i /koszyk-podsumowanie. - Pelna suita zielona. **Concerns:** - Git commit nie wykonany automatycznie — nalezy domknac w transition-phase. - CLAUDE.md odwoluje sie do `./test.ps1` ktorego nie ma w repo — do rozwazenia porzadkowo. **Blockers:** - None. --- *Phase: 17-cart-summary-transport-cost-fix, Plan: 01* *Completed: 2026-04-20*