Files
orderPRO/.paul/phases/108-delivery-status-management/108-02-SUMMARY.md
Jacek Pyziak 0063402897 feat(108): delivery status management
Phase 108 complete (v3.2 milestone):

Plan 108-01 — Delivery Status DB & CRUD:
- Tabela delivery_statuses z seedem 11 statusow systemowych
- DeliveryStatusRepository (CRUD + per-request static cache)
- DeliveryStatus::setRepository() — DB fallback dla static final class
- Panel /settings/delivery-statuses (zakladki Statusy + Mapowanie)
- Sidebar przebudowany: Statusy zamowien + Statusy przesylek

Plan 108-02 — Automation Dropdowns z DB + UI Refactor:
- Dropdowny automatyzacji ladowane z DB (warunek shipment_status + akcja update_shipment_status)
- Walidacja przez DeliveryStatus::getAllStatuses()
- Osobna podstrona formularza CRUD (delivery-status-form.php)
- Lista uproszczona: rename Terminal -> Koncowy, usunieta kolumna Typ
- BREAKING: drop backward compat dla starych grupowych kluczy automatyzacji
- Bug fix: path params w DeliveryStatusesController via \$request->input('id')

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-04-27 22:10:24 +02:00

152 lines
8.2 KiB
Markdown

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