Files
shopPRO/.paul/phases/15-scontainers-edit-save-fix/15-01-PLAN.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

5.2 KiB

phase, plan, type, wave, depends_on, files_modified, autonomous, delegation
phase plan type wave depends_on files_modified autonomous delegation
15-scontainers-edit-save-fix 01 execute 1
autoload/admin/Controllers/ScontainersController.php
tests/Unit/admin/Controllers/ScontainersControllerTest.php
true off
## Goal Naprawic regresje w edycji kontenerow statycznych: zapis edytowanego rekordu nie moze tworzyc nowego wpisu.

Purpose

Administrator musi miec pewnosc, ze edycja kontenera aktualizuje istniejace ID. Obecny blad powoduje duplikaty i ryzyko niespojnych tresci.

Output

  • Poprawiony flow zapisu w ScontainersController, ktory zawsze przekazuje poprawne id przy edycji
  • Testy jednostkowe zabezpieczajace przed powrotem regresji
## Project Context @.paul/PROJECT.md @.paul/ROADMAP.md @.paul/STATE.md

Source Files

@autoload/admin/Controllers/ScontainersController.php @admin/templates/components/form-edit.php @autoload/admin/ViewModels/Forms/FormEditViewModel.php @autoload/admin/Support/Forms/FormRequestHandler.php @tests/Unit/admin/Controllers/ScontainersControllerTest.php

## Required Skills (from SPECIAL-FLOWS.md)
Skill Priority When to Invoke Loaded?
/feature-dev required Before implementation in APPLY
/koniec-pracy required After implementation/release wrap-up

BLOCKING: Required skills MUST be loaded before APPLY proceeds. Run each skill command or confirm already loaded.

Skill Invocation Checklist

  • /feature-dev loaded (run command or confirm)
  • /koniec-pracy loaded (run command or confirm)

<acceptance_criteria>

AC-1: Edycja nie tworzy nowego kontenera

Given istnieje kontener statyczny o ID 9
When admin wejdzie w /admin/scontainers/edit/id=9 i kliknie "Zatwierdz"
Then rekord o ID 9 zostanie zaktualizowany
And nie powstanie nowy rekord w pp_scontainers

AC-2: Tworzenie nowego kontenera nadal dziala

Given admin otwiera /admin/scontainers/edit/ bez ID
When wypelni dane i kliknie "Zatwierdz"
Then zapis utworzy nowy rekord w pp_scontainers

AC-3: API legacy JSON pozostaje bez zmian

Given zapis kontenera odbywa sie przez legacy payload values (JSON)
When wywolywana jest sciezka legacy w ScontainersController::save()
Then zachowanie insert/update pozostaje zgodne z dotychczasowa logika

</acceptance_criteria>

Task 1: Utrwalic przekazywanie ID w nowym formularzu scontainers autoload/admin/Controllers/ScontainersController.php W `buildFormViewModel()` przeniesc `id` do `hiddenFields` (FormEditViewModel), tak aby pole `id` bylo renderowane niezaleznie od zakladek.
W `save()` dodac defensywny fallback: jesli `data['id']` z requestu jest puste,
pobrac `id` z parametru trasy (`Helpers::get('id')`) i uzyc go przy zapisie.

Nie zmieniac flow legacy (`values` JSON) ani logiki repozytorium.
Manual check: edycja /admin/scontainers/edit/id=9 aktualizuje rekord 9 zamiast tworzyc nowy AC-1 i AC-3 satisfied Task 2: Dodac test regresyjny dla formularza i mapowania ID tests/Unit/admin/Controllers/ScontainersControllerTest.php Rozszerzyc testy kontrolera o przypadki potwierdzajace, ze formularz edycji niesie `id` jako hidden field oraz ze flow zapisu potrafi odczytac ID rekordu dla przypadku edycji.
Uzyc Reflection tam, gdzie potrzeba dostepu do prywatnych metod (zgodnie z obecnym stylem testow).
./test.ps1 tests/Unit/admin/Controllers/ScontainersControllerTest.php AC-1 covered by automated tests Task 3: Zweryfikowac brak regresji create flow autoload/admin/Controllers/ScontainersController.php, tests/Unit/admin/Controllers/ScontainersControllerTest.php Potwierdzic, ze nowy kontener (brak `id` w URL i formularzu) nadal tworzy nowy rekord. Dostosowac warunki fallbacku tak, by nie wymuszaly update przy create. Manual check: /admin/scontainers/edit/ -> Zatwierdz tworzy nowe ID AC-2 satisfied

DO NOT CHANGE

  • autoload/Domain/Scontainers/ScontainersRepository.php (brak zmian logiki insert/update na poziomie repo)
  • admin/templates/components/form-edit.php (bez globalnych zmian w uniwersalnym komponencie)
  • Inne kontrolery admin poza ScontainersController

SCOPE LIMITS

  • Zakres tylko dla problemu edycji kontenerow statycznych (scontainers)
  • Bez refaktoryzacji calego systemu FormEdit
Before declaring plan complete: - [ ] ./test.ps1 tests/Unit/admin/Controllers/ScontainersControllerTest.php - [ ] Manual: edycja istniejacego kontenera nie tworzy nowego rekordu - [ ] Manual: tworzenie nowego kontenera nadal dziala - [ ] All acceptance criteria met

<success_criteria>

  • Blad edycji kontenerow statycznych nie wystepuje
  • Test regresyjny przechodzi
  • Brak regresji w create flow dla scontainers </success_criteria>
After completion, create `.paul/phases/15-scontainers-edit-save-fix/15-01-SUMMARY.md`