---
phase: 15-scontainers-edit-save-fix
plan: 01
type: execute
wave: 1
depends_on: []
files_modified:
  - autoload/admin/Controllers/ScontainersController.php
  - tests/Unit/admin/Controllers/ScontainersControllerTest.php
autonomous: true
delegation: off
---

<objective>
## 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
</objective>

<context>
## 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
</context>

<skills>
## 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)

</skills>

<acceptance_criteria>

## AC-1: Edycja nie tworzy nowego kontenera
```gherkin
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
```gherkin
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
```gherkin
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>

<tasks>

<task type="auto">
  <name>Task 1: Utrwalic przekazywanie ID w nowym formularzu scontainers</name>
  <files>autoload/admin/Controllers/ScontainersController.php</files>
  <action>
    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.
  </action>
  <verify>Manual check: edycja /admin/scontainers/edit/id=9 aktualizuje rekord 9 zamiast tworzyc nowy</verify>
  <done>AC-1 i AC-3 satisfied</done>
</task>

<task type="auto">
  <name>Task 2: Dodac test regresyjny dla formularza i mapowania ID</name>
  <files>tests/Unit/admin/Controllers/ScontainersControllerTest.php</files>
  <action>
    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).
  </action>
  <verify>./test.ps1 tests/Unit/admin/Controllers/ScontainersControllerTest.php</verify>
  <done>AC-1 covered by automated tests</done>
</task>

<task type="auto">
  <name>Task 3: Zweryfikowac brak regresji create flow</name>
  <files>autoload/admin/Controllers/ScontainersController.php, tests/Unit/admin/Controllers/ScontainersControllerTest.php</files>
  <action>
    Potwierdzic, ze nowy kontener (brak `id` w URL i formularzu) nadal tworzy nowy rekord.
    Dostosowac warunki fallbacku tak, by nie wymuszaly update przy create.
  </action>
  <verify>Manual check: /admin/scontainers/edit/ -> Zatwierdz tworzy nowe ID</verify>
  <done>AC-2 satisfied</done>
</task>

</tasks>

<boundaries>

## 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

</boundaries>

<verification>
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
</verification>

<success_criteria>
- Blad edycji kontenerow statycznych nie wystepuje
- Test regresyjny przechodzi
- Brak regresji w create flow dla scontainers
</success_criteria>

<output>
After completion, create `.paul/phases/15-scontainers-edit-save-fix/15-01-SUMMARY.md`
</output>
