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>
152 lines
8.2 KiB
Markdown
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*
|