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>
151 lines
6.7 KiB
Markdown
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*
|