Files
shopPRO/.paul/phases/17-cart-summary-transport-cost-fix/17-01-SUMMARY.md
Jacek eee22ef1c4 fix: poprawny koszt transportu na /koszyk-podsumowanie
Na podstronie /koszyk-podsumowanie transport z flaga delivery_free=1
byl pokazywany zawsze za 0,00 zl, niezaleznie od wartosci koszyka.
Teraz kontroler wylicza transport_cost_effective i free_delivery_applies
uwzgledniajac prog settings.free_delivery, a szablon uzywa tych kluczy.

- Nowa chroniona metoda ShopBasketController::calculateTransportCostForSummary
- Dodane 6 testow jednostkowych (ShopBasketControllerSummaryViewTest)
- Suita: 834 testy / 2318 assertions OK

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-20 20:50:15 +02:00

151 lines
6.7 KiB
Markdown

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