Files
shopPRO/.paul/ROADMAP.md
Jacek 5b66720f7c fix: scontainers edit saves existing record instead of creating new
Fixes static container admin edit flow by preserving id in hiddenFields and adding route-id fallback during save.
Adds regression tests for edit/create id behavior, updates release docs (changelog/testing/CLAUDE), and appends SonarQube open issues to docs/TODO.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-04-18 22:56:14 +02:00

6.2 KiB
Raw Blame History

Roadmap: shopPRO

Overview

shopPRO to autorski silnik sklepu internetowego rozwijany iteracyjnie. Projekt jest już na produkcji (v0.333) — roadmap obejmuje planowane funkcje i usprawnienia kolejnych wersji.

Current Milestone

Hotfix backlog Status: Complete Phases: 4 of 4 complete

Phases

Phase Name Plans Status Completed
1 Sensitive data logging fix 1 Done 2026-03
2 Path traversal + XSS escaping 1 Done 2026-03 (v0.335)
3 Error handling w krytycznych ĹcieĹĽkach 1 Done 2026-03 (v0.336)
4 CSRF protection — admin panel forms 1 Applied 2026-03 (v0.337)
5 Order bugs fix — duplicate + COD status 1 Applied 2026-03 (v0.338)

Next Milestone

Tech debt — Integrations refactoring Status: Planning

Phase Name Plans Status Completed
6 IntegrationsRepository split → ApiloRepository 2 Done 2026-03

Hotfix

Phase Name Plans Status Completed
7 Coupon Fatal Error — order placement crash 1 Done 2026-03-15
8 Apilo orders not sending — diagnoza i naprawa 1 Done 2026-03-16
9 Apilo email notification + infinite retry 1 Done 2026-03-19
15 Scontainers edit saves as new record 1 Done 2026-04-18

Feature

Phase Name Plans Status Completed
10 Edycja personalizacji produktu w koszyku 1 Done 2026-03-19
11 DataLayer GA4 analytics fix 1 Done 2026-03-25
12 summaryView redirect fix — double order block 1 Done 2026-03-25
13 Basket logging + TTL token fix 1 Done 2026-03-25
14 Custom fields delete bug — usunięcie wszystkich pól 1 Done 2026-04-16

Phase Details

Phase 4 — CSRF protection

Problem: Brak tokenĂłw CSRF na formularzach panelu admina. State-changing POST endpointy (create/update/delete) sÄ… potencjalnie podatne na ataki CSRF.

Scope: Dodanie CSRF tokenĂłw do formularzy i walidacji w panelu administracyjnym.

Reference: .paul/codebase/concerns.md — MEDIUM — Missing CSRF tokens

Phase 6 — IntegrationsRepository split

Problem: IntegrationsRepository ma 875 linii — miesza logikÄ™ generycznÄ… (settings, logi, product linking) z logikÄ… specyficznÄ… dla Apilo (~650 linii). Narusza zasadÄ™ jednej odpowiedzialnoĹci.

Scope:

  • Plan 06-01: UtwĂłrz ApiloRepository z metodami apilo* (non-breaking)
  • Plan 06-02: Zmigruj konsumentĂłw (IntegrationsController, ShopProductController, OrderAdminService, cron.php), usuĹ„ apilo* z IntegrationsRepository

Phase 5 — Order bugs fix

Problem 1: Zduplikowane zamĂłwienia — klient widzi bĹÄ…d i klika zĹóż zamĂłwienie ponownie. Pierwsze zamĂłwienie trafiĹo do bazy mimo bĹÄ™du. PowrĂłt do /podsumowanie regeneruje token i pozwala zĹoĹĽyć drugie zamĂłwienie.

Problem 2: ZamĂłwienia COD (pĹatnoĹć przy odbiorze) dostajÄ… status "ZamĂłwienie zĹoĹĽone" zamiast "PrzyjÄ™te do realizacji". Kod sprawdza hardkodowane payment_id == 3, ktĂłre jest inne w tej instancji sklepu.

Scope: Guard w summaryView(), try-catch w basketSave(), kolumna is_cod w pp_shop_payment_methods, uĹĽycie flagi zamiast hardkodowanego ID.


Roadmap created: 2026-03-12

Phase 11 — DataLayer GA4 analytics fix

Problem: Eventy dataLayer ecommerce (purchase, begin_checkout, view_item, add_to_cart) uĹĽywajÄ… starego formatu UA (id/name zamiast item_id/item_name), brak currency w view_item, price:0 w purchase, brak eventu view_cart. Remarketing dynamiczny i konwersje GA4 nie dziaĹajÄ… poprawnie.

Scope: Poprawka 4 istniejÄ…cych eventĂłw do formatu GA4 + dodanie nowego eventu view_cart na stronie koszyka.

Reference: poprawki_datalayer_projectpro.md — audyt analityki z pomysloweprezenty.pl

Phase 12 — summaryView redirect fix

Problem: Po zĹoĹĽeniu pierwszego zamĂłwienia, guard w summaryView() sprawdzaĹ sesyjny order-submit-last-order-id i redirectowaĹ na stronÄ™ starego zamĂłwienia. BlokowaĹ dostÄ™p do /koszyk-podsumowanie dla kolejnych zamĂłwieĹ„. Poprawka z instancji klienta (change.md) do wdroĹĽenia globalnie.

Scope: Usunięcie bloku redirect z summaryView() w ShopBasketController.php. Double-submit protection w basketSave() pozostaje bez zmian.

Phase 13 — Basket logging + TTL token fix

Problem: Brak logowania w basketSave() uniemoĹĽliwia diagnozÄ™ bĹÄ™dĂłw zamĂłwieĹ„. Token zamĂłwienia jednorazowy — nadpisywany przy kaĹĽdym wejĹciu na podsumowanie, co powoduje ĹĽe druga karta, "wstecz" lub odĹwieĹĽenie uniewaĹĽnia formularz.

Scope: Dodanie metody logOrder() z 4 punktami logowania, zmiana tokena z jednorazowego na TTL 30 min, redirect przy bĹÄ™dzie tokena na /koszyk-podsumowanie zamiast /koszyk, nowy double-submit guard.

Phase 14 — Custom fields delete bug

Problem: UsuniÄ™cie WSZYSTKICH dodatkowych pĂłl z produktu nie dziaĹa. jQuery .serialize() nie wysyĹa klucza custom_field_name[] gdy nie ma ĹĽadnych pĂłl → array_key_exists('custom_field_name', $d) w ProductRepository zwraca false → saveCustomFields() nigdy nie jest wywoĹywany → pola pozostajÄ… w bazie.

Scope: Dodanie hidden markera custom_field_name_present w szablonie JS + zmiana warunku w ProductRepository na sprawdzanie tego markera. Test jednostkowy.

Phase 15 - Scontainers edit saves as new record

Problem: Edycja kontenera statycznego (/admin/scontainers/edit/id={id}) zapisuje rekord jako nowy wpis zamiast aktualizacji. W praktyce podczas zapisu gubi sie id i repository wykonuje insert.

Scope: Poprawic przekazywanie id w nowym flow formularza ScontainersController + dodac test regresyjny dla edycji, bez zmian globalnych w innych kontrolerach.


Last updated: 2026-04-18