# Project State ## Project Reference See: .paul/PROJECT.md (updated 2026-03-12) **Core value:** Właściciel sklepu ma pełną kontrolę nad sprzedażą online w jednym systemie pisanym od podstaw, bez narzutów zewnętrznych platform. **Current focus:** Phase 14 complete — custom fields delete bug fix ## Current Position Milestone: Hotfix Phase: 14 — custom fields delete bug — Complete Plan: 14-01 complete Status: UNIFY complete, phase 14 finished Last activity: 2026-04-16 — 14-01 UNIFY complete Progress: - Phase 14: [██████████] 100% (COMPLETE) ## Loop Position Current loop state (phase 14, plan 01): ``` PLAN ──▶ APPLY ──▶ UNIFY ✓ ✓ ✓ [Phase 14 complete] ``` Previous phases: ``` Phase 4: PLAN ──▶ APPLY ──▶ UNIFY ✓ ✓ ✓ [COMPLETE — 2026-03-12] Phase 5: PLAN ──▶ APPLY ──▶ UNIFY ✓ ✓ ✓ [COMPLETE — 2026-03-12] Phase 6: PLAN ──▶ APPLY ──▶ UNIFY ✓ ✓ ✓ [COMPLETE — 2026-03-12] Phase 7: PLAN ──▶ APPLY ──▶ UNIFY ✓ ✓ ✓ [COMPLETE — 2026-03-15] Phase 8: PLAN ──▶ APPLY ──▶ UNIFY ✓ ✓ ✓ [COMPLETE — 2026-03-16] Phase 9: PLAN ──▶ APPLY ──▶ UNIFY ✓ ✓ ✓ [COMPLETE — 2026-03-19] Phase 10: PLAN ──▶ APPLY ──▶ UNIFY ✓ ✓ ✓ [COMPLETE — 2026-03-19] Phase 11: PLAN ──▶ APPLY ──▶ UNIFY ✓ ✓ ✓ [COMPLETE — 2026-03-25] Phase 12: PLAN ──▶ APPLY ──▶ UNIFY ✓ ✓ ✓ [COMPLETE — 2026-03-25] Phase 13: PLAN ──▶ APPLY ──▶ UNIFY ✓ ✓ ✓ [COMPLETE — 2026-03-25] Phase 14: PLAN ──▶ APPLY ──▶ UNIFY ✓ ✓ ✓ [COMPLETE — 2026-04-16] ``` ## Accumulated Context ### Decisions - Use existing `CouponRepository::markAsUsed()` instead of adding methods to stdClass - 2026-03-16: Przyczyna braku wysyłki = brakujące $apiloRepository w use() closures cron.php (regresja z fazy 6) - 2026-03-16: Retry -1 orders co 1h zamiast permanent failure - 2026-03-16: Email notification o trwale failed Apilo jobach - 2026-03-19: Order-related Apilo joby — infinite retry co 30 min (nigdy permanent failure) - 2026-03-19: Email z danymi zamówienia + rozróżnienie PONAWIANY vs TRWAŁY BŁĄD - 2026-03-19: Cleanup stuck sync_payment/sync_status jobów po udanym wysłaniu - 2026-03-19: Edycja custom fields w koszyku — product_code przeliczany po zmianie, merge duplikatów przy identycznym hashu - 2026-03-19: JS handlery koszyka w basket.php (nie basket-details.php) bo basket-details jest AJAX-replaceable - 2026-03-25: view_cart event w basket.php (nie basket-details.php) — ten sam powód - 2026-03-25: GA4 item format standard: item_id (string), item_name, price (number), quantity (int), google_business_vertical: "retail" - 2026-03-25: Brak user_data w purchase — wymaga analizy RODO - 2026-03-25: summaryView() redirect guard usunięty — blokował kolejne zamówienia po pierwszym (z change.md instancji klienta) - 2026-03-25: Token zamówienia z jednorazowego na TTL 30 min — backward compat z plain string - 2026-03-25: logOrder() — logowanie błędów zamówień do logs/logs-order-YYYY-MM-DD.log - 2026-03-25: Redirect przy złym tokenie: /koszyk-podsumowanie zamiast /koszyk - 2026-04-16: Custom fields delete fix — hidden marker `custom_field_name_present` zamiast `array_key_exists('custom_field_name')` ### Deferred Issues None. ### Blockers/Concerns None. ## Session Continuity Last session: 2026-04-16 Stopped at: Phase 14 UNIFY complete Next action: /koniec-pracy or next feature Resume file: .paul/phases/14-custom-fields-delete-bug/14-01-SUMMARY.md --- *STATE.md — Updated after every significant action*