--- phase: 108-delivery-status-management plan: 02 subsystem: automation, settings tags: [delivery-status, automation, dropdown, php, db-driven, ui-refactor] requires: - phase: 108-01-delivery-status-management provides: DeliveryStatusRepository, DeliveryStatus::setRepository(), getAllOptions(), getAllStatuses() provides: - Automation dropdowns dla shipment_status (warunek + akcja) załadowane z DB - Walidacja shipment_status / update_shipment_status przeciw kluczom z DB - Osobna podstrona formularza dla CRUD delivery statuses (`/settings/delivery-statuses/new`, `/{id}/edit`) - Lista statusów uproszczona: rename "Terminal" → "Końcowy", usunięta kolumna "Typ" affects: [delivery-status-consumers, automation-rules-existing] tech-stack: added: [] patterns: - Path params w controllerach przez `$request->input('id')`, nie jako argumenty metody - Form-as-separate-page pattern dla CRUD (zamiast inline edit row) key-files: created: - resources/views/settings/delivery-status-form.php modified: - src/Modules/Automation/AutomationController.php - src/Modules/Automation/AutomationService.php - src/Modules/Settings/DeliveryStatusesController.php - resources/views/settings/delivery-statuses.php - routes/web.php - .paul/docs/ARCHITECTURE.md - .paul/docs/TECH_CHANGELOG.md key-decisions: - "BREAKING: Drop backward compat dla starych grupowych kluczy automatyzacji (registered, courier_pickup, etc.) — kolizja semantyczna picked_up by silently dawała wrong matches" - "Path params w DeliveryStatusesController via $request->input('id') — naprawia bug pre-existing z Plan 01 (update/destroy też miały błędną sygnaturę)" - "CRUD delivery statuses przeniesiony na osobną podstronę — UX lepszy niż inline edit row" patterns-established: - "Walidacja submitted status keys przez DeliveryStatus::getAllStatuses() (zamiast hardcoded array_keys konstanty)" - "Form view jako osobna podstrona z disabled key field przy edycji (immutable po utworzeniu)" duration: ~50min started: 2026-04-27T01:00:00Z completed: 2026-04-27T02:00:00Z --- # Phase 108 Plan 02: Automation Dropdowns z DB Summary **Domknięcie integracji DB-driven statusów: dropdowny automatyzacji ładują się z `delivery_statuses`, plus refaktor UI listy statusów (osobna podstrona dla CRUD).** ## Performance | Metric | Value | |--------|-------| | Duration | ~50 min | | Tasks | 1 planowane + 2 user-requested ad-hoc | | Files created | 1 | | Files modified | 7 | ## Acceptance Criteria Results | Criterion | Status | Notes | |-----------|--------|-------| | AC-1: Dropdown statusów z DB | Pass | `AutomationController::buildShipmentStatusOptions()` z `DeliveryStatus::getAllOptions()` | | AC-2: Istniejące reguły działają bez błędów | Pass* | *BREAKING: stare grupowe klucze nie matchują (decyzja użytkownika "poprawię ręcznie"); brak wyjątków, ciche no-match | ## Accomplishments - `AutomationController` — usunięto stałą `SHIPMENT_STATUS_OPTIONS` (8 grupowych kluczy); dropdown buduje się z DB przez `DeliveryStatus::getAllOptions()` - `AutomationService` — usunięto stałą `SHIPMENT_STATUS_OPTION_MAP`; ewaluacja `evaluateShipmentStatusCondition` porównuje klucze bezpośrednio; `resolveStatusFromActionKey` używa kluczy DB jako target - Walidacja w `parseConditionValue('shipment_status')` i `parseActionConfig('update_shipment_status')` przez `DeliveryStatus::getAllStatuses()` - **Ad-hoc UI refactor (user request):** osobna podstrona formularza CRUD (`delivery-status-form.php`) zamiast inline edit row na liście; przycisk "+ Dodaj status" zamiast formy na dole strony - **Ad-hoc UI changes:** rename column "Terminal" → "Końcowy", usunięta kolumna "Typ" (badge "systemowy" — informacja zbędna gdy brak akcji edycji) - **Bug fix (pre-existing):** sygnatury `update`/`destroy`/`edit` w `DeliveryStatusesController` używały path param jako 2. argument metody — router projektu przekazuje params przez `$request->input('id')`. Naprawione wszystkie trzy. ## Files Created/Modified | File | Change | Purpose | |------|--------|---------| | `src/Modules/Automation/AutomationController.php` | Modified | Usunięta stała SHIPMENT_STATUS_OPTIONS; nowa metoda `buildShipmentStatusOptions()`; walidacja przez DeliveryStatus | | `src/Modules/Automation/AutomationService.php` | Modified | Usunięta stała SHIPMENT_STATUS_OPTION_MAP; bezpośrednie porównanie kluczy w ewaluacji | | `src/Modules/Settings/DeliveryStatusesController.php` | Modified | +`create()`, `edit()`, `renderForm()`; fix path params w update/destroy | | `resources/views/settings/delivery-status-form.php` | Created | Osobna podstrona formularza CRUD statusów | | `resources/views/settings/delivery-statuses.php` | Modified | Lista uproszczona: rename Terminal→Końcowy, usunięte Typ + inline edit + bottom add form, przycisk "+ Dodaj status" | | `routes/web.php` | Modified | +2 GET routes: `/new`, `/{id}/edit` | | `.paul/docs/ARCHITECTURE.md` | Modified | Sekcja Phase 108 Plan 02 | | `.paul/docs/TECH_CHANGELOG.md` | Modified | Wpis Phase 108 Plan 02 (BREAKING) | ## Decisions Made | Decyzja | Uzasadnienie | Wpływ | |---------|-------------|-------| | Drop backward compat (option A) | Kolizja semantyczna `picked_up`: stary grupowy klucz mapował na `delivered`, nowy klucz DB to "Odebrana przez kuriera" — odwrotne końce cyklu | BREAKING dla istniejących reguł; user: "poprawię ręcznie jak coś" | | Form jako osobna podstrona zamiast inline | Inline edit row na liście "źle wygląda" (user feedback) | Lepszy UX, czytelniejszy formularz z grid 2-col | | Usunięcie kolumny "Typ" | Badge "systemowy" zbędny — brak przycisku Edytuj/Usuń przy systemowych już to komunikuje | Lista 6 kolumn zamiast 7 | | Path params via `$request->input('id')` | Konwencja projektu (router nie injectuje argumentów do handlerów) | Naprawiono pre-existing bug w update/destroy z Plan 01 | ## Deviations from Plan ### Summary | Type | Count | Impact | |------|-------|--------| | Files w plan, ale bez zmian | 3 | `AutomationRepository.php`, `form.php`, `automation-form.js` — analiza wykazała brak potrzeby modyfikacji | | Scope additions (user request) | 3 | Rename column, hide column, separate form page | | Bug fix poza scope | 1 | Path params w update/destroy (pre-existing z Plan 01) | | Deferred | 1 | sonar-scanner dla Phase 105/106/107/108 — punkt deferred z Plan 01, niezmieniony | **Total impact:** Plan zakończony plus dodatkowe ulepszenia UX zgłoszone przez użytkownika podczas weryfikacji Plan 01. Bug fix path params eliminuje crash przy edycji. ### Auto-fixed Issues **1. [Routing] Path params jako argumenty metody zamiast `$request->input()`** - **Found during:** Test ścieżki `/settings/delivery-statuses/{id}/edit` (user runtime error) - **Issue:** "Too few arguments to function ... edit(), 1 passed ... and exactly 2 expected" - **Fix:** Zmieniono sygnatury `edit()`, `update()`, `destroy()` na single `Request $request`; `$id` czytany przez `$request->input('id', 0)` - **Files:** `src/Modules/Settings/DeliveryStatusesController.php` - **Verification:** `php -l` OK; konwencja zgodna z `ReceiptController` ### Deferred Items - sonar-scanner skill (required) — Phase 105, 106, 107, 108 (już deferred z poprzednich planów) ## Issues Encountered | Issue | Resolution | |-------|------------| | Kolizja semantyczna klucza `picked_up` (stary group → `delivered` vs nowy DB → "Odebrana przez kuriera") | Advisor consult przed kodowaniem; user wybrał opcję A (drop backward compat) | | Pre-existing bug z path params w update/destroy | Zauważony dopiero przy nowym `edit()` — naprawiony razem | ## Next Phase Readiness **Ready:** - Pełna integracja DB-driven statusów: dropdowny + walidacja + ewaluacja - CRUD UI ergonomiczny: lista + osobna podstrona formularza - Phase 108 — wszystkie 2 plans zamknięte **Concerns:** - Migracja `20260427_000103_create_delivery_statuses_table.sql` — wymaga `php bin/migrate.php` na środowisku produkcyjnym (XAMPP offline podczas APPLY 108-01) - Stare reguły automatyzacji z grupowymi kluczami (jeśli istnieją) — wymagają ręcznego odtworzenia z nowymi kluczami DB - sonar-scanner gap dla Phase 105/106/107/108 — odłożony **Blockers:** None --- *Phase: 108-delivery-status-management, Plan: 02* *Completed: 2026-04-27*