---
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*
