---
phase: 13-basket-logging-ttl-token
plan: 01
subsystem: frontend
tags: [basket, checkout, logging, token, session, TTL]

requires:
  - phase: 12-summaryview-redirect-fix
    provides: summaryView() redirect guard removed
provides:
  - Order error logging to logs/logs-order-YYYY-MM-DD.log
  - TTL-based order submit token (30 min, multi-tab safe)
  - Double-submit guard with logging
affects: []

tech-stack:
  added: []
  patterns: [TTL-based session tokens with backward compatibility]

key-files:
  created: []
  modified: [autoload/front/Controllers/ShopBasketController.php]

key-decisions:
  - "Token format: array ['token' => ..., 'created_at' => ...] with backward compat for plain string"
  - "Token failure redirect: /koszyk-podsumowanie instead of /koszyk (user keeps context)"
  - "Double-submit guard moved BEFORE token validation (empty basket + existing order)"

patterns-established:
  - "Order logging via logOrder() to logs/logs-order-YYYY-MM-DD.log"

duration: 5min
completed: 2026-03-25
---

# Phase 13 Plan 01: Basket logging + TTL token fix Summary

**Dodano logowanie błędów zamówień do pliku + przerobiono token z jednorazowego na TTL 30 min, umożliwiając składanie zamówień z wielu kart/po odświeżeniu.**

## Performance

| Metric | Value |
|--------|-------|
| Duration | ~5 min |
| Completed | 2026-03-25 |
| Tasks | 2 completed |
| Files modified | 1 |

## Acceptance Criteria Results

| Criterion | Status | Notes |
|-----------|--------|-------|
| AC-1: Logowanie błędów w basketSave() | Pass | 4 punkty logowania via logOrder() |
| AC-2: Token TTL 30 min — wiele kart działa | Pass | createOrderSubmitToken() reuses valid token |
| AC-3: Token wygasa po 30 min | Pass | isValidOrderSubmitToken() checks TTL, redirect → /koszyk-podsumowanie |
| AC-4: Double-submit guard dla pustego koszyka | Pass | Nowy guard przed sprawdzeniem tokena |

## Accomplishments

- Dodano metodę `logOrder()` zapisującą do `logs/logs-order-YYYY-MM-DD.log` + 4 punkty logowania w `basketSave()`
- Token zamówienia przerobiony z jednorazowego na TTL 30 min — wiele kart, odświeżenie, "wstecz" nie unieważniają tokena
- Backward compatibility ze starymi stringowymi tokenami w sesji
- Double-submit guard przeniesiony PRZED sprawdzenie tokena (pusty koszyk + istniejące zamówienie → redirect)
- Redirect przy błędzie tokena zmieniony z `/koszyk` na `/koszyk-podsumowanie`

## Files Created/Modified

| File | Change | Purpose |
|------|--------|---------|
| `autoload/front/Controllers/ShopBasketController.php` | Modified | Stała TTL, logOrder(), TTL token, logowanie, double-submit guard |

## Decisions Made

| Decision | Rationale | Impact |
|----------|-----------|--------|
| Token jako array z created_at | Umożliwia TTL check bez dodatkowej sesji | Backward compat z plain string |
| Redirect na /koszyk-podsumowanie | Użytkownik nie traci kontekstu, dostaje nowy token | Lepsza UX |
| Double-submit guard przed token check | Pusty koszyk = pewny double-submit, nie trzeba sprawdzać tokena | Szybsze wykrycie |

## Deviations from Plan

None — plan executed exactly as written

## Issues Encountered

None

## Next Phase Readiness

**Ready:**
- Poprawka gotowa do wdrożenia w update package
- Fazy 12 + 13 razem stanowią kompletny fix checkout flow

**Concerns:**
- None

**Blockers:**
- None

---
*Phase: 13-basket-logging-ttl-token, Plan: 01*
*Completed: 2026-03-25*
