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