diff --git a/.paul/PROJECT.md b/.paul/PROJECT.md
index 4ff67f0..14c12f8 100644
--- a/.paul/PROJECT.md
+++ b/.paul/PROJECT.md
@@ -102,6 +102,8 @@ Sprzedawca może obsługiwać zamówienia ze wszystkich kanałów
- [x] Automatyzacja: warunek "Metoda platnosci" (COD/Przelew/Karta/Inna) oparty na external_payment_type_id — Phase 96
- [x] Polautomatyczne generowanie projektow graficznych PSD z zamowien (mapowania, komenda Claude, Photoshop API, flagi statusu) + rename external_status_id na status_code — Phase 97
- [x] Event automatyzacji `order.imported` ogranicza sie do pierwszego importu zamowienia + backfill statusow w_realizacji -> wyslane dla zamowien z istniejaca przesylka — Phase 98
+- [x] Preset przesylek nadpisuje wylacznie wymiary+wage paczki + polling kolejki wydruku + auto-click ostatniej etykiety po utworzeniu przesylki + usuniecie placeholderow "-" — Phase 100
+- [x] Wizualna flaga wiekowa na liscie zamowien: czerwona ramka o rosnacej intensywnosci dla zamowien 4-7+ dniowych — Phase 101
- [ ] Eliminacja zduplikowanego kodu: SslCertificateResolver, ToggleableRepositoryTrait, RedirectPathResolver, ReceiptService — Phase 68
### Active (In Progress)
diff --git a/.paul/ROADMAP.md b/.paul/ROADMAP.md
index 23b3f7c..bc5723a 100644
--- a/.paul/ROADMAP.md
+++ b/.paul/ROADMAP.md
@@ -59,6 +59,9 @@ Wersja mobilna aplikacji, modul po module. Cel: pelna uzywalnosc orderPRO na tel
| 96 | Automation Payment Method Condition | 1/1 | Complete |
| 97 | Project Generation | 1/1 | Complete |
| 98 | Order Imported First Only | 1/1 | Complete |
+| 99 | Order Delivery & Payment Edit | 0/1 | Cancelled |
+| 100 | Preset Scope & Print UX | 1/1 | Complete |
+| 101 | Aged Orders Row Highlight | 1/1 | Complete |
| TBD | Mobile Orders List | - | Not started |
| TBD | Mobile Order Details | - | Not started |
| TBD | Mobile Settings | - | Not started |
diff --git a/.paul/STATE.md b/.paul/STATE.md
index 22eb0e7..8eb4df2 100644
--- a/.paul/STATE.md
+++ b/.paul/STATE.md
@@ -10,26 +10,27 @@ See: .paul/PROJECT.md (updated 2026-04-12)
## Current Position
Milestone: v3.0 Mobile Responsive - In progress
-Phase: 98 (Order Imported First Only) — Complete
-Plan: 98-01 unified
+Phase: 101 (Aged Orders Row Highlight) — Complete
+Plan: 101-01 Complete
Status: Loop closed, ready for next PLAN
-Last activity: 2026-04-13 — Unified phase 98
+Last activity: 2026-04-13 — UNIFY Phase 101 complete
Progress:
-- Milestone: [#########.] ~95%
-- Phase 98: [##########] 100%
+- Milestone: [#########.] ~96%
+- Phase 101: [##########] 100%
+- Phase 100: [##########] 100%
## Loop Position
Current loop state:
```
PLAN ──▶ APPLY ──▶ UNIFY
- ✓ ✓ ✓ [Loop complete - ready for next PLAN]
+ ✓ ✓ ✓ [Loop complete — ready for next PLAN]
```
## Session Continuity
Last session: 2026-04-13
-Stopped at: Phase 98 unified
-Next action: Plan next phase or pause
-Resume file: .paul/phases/98-order-imported-first-only/98-01-SUMMARY.md
+Stopped at: Phase 101 Complete
+Next action: /paul:plan dla kolejnej fazy
+Resume file: .paul/phases/101-aged-orders-row-highlight/101-01-SUMMARY.md
diff --git a/.paul/changelog/2026-04-13.md b/.paul/changelog/2026-04-13.md
index 54b6bbb..af1ba27 100644
--- a/.paul/changelog/2026-04-13.md
+++ b/.paul/changelog/2026-04-13.md
@@ -5,6 +5,13 @@
- [Phase 98, Plan 01] Event automatyzacji `order.imported` ogranicza sie do pierwszego importu zamowienia (gating po `$wasCreated` w AllegroOrderImportService i ShopproOrdersSyncService)
- [Phase 98, Plan 01] Backfill `bin/backfill_shipped_status_98.php`: 4 zamowienia (#275, #340, #396, #422) w statusie `w_realizacji` z istniejaca przesylka przestawione na `wyslane` przez `OrdersRepository::updateOrderStatus` (z historia statusu i activity log)
- [Phase 98, Plan 01] Skrypt idempotentny: drugie uruchomienie zwraca 0 kandydatow
+- [Phase 100, Plan 01] Preset Scope & Print UX — presety nadpisuja wylacznie wymiary+wage paczki (carrier/serwis/sender_point/label_format nietykane)
+- [Phase 100, Plan 01] GET /api/print/jobs/status + polling w orders/show.php i shipments/prepare.php — przycisk "W kolejce" wraca do "Drukuj" po wydruku (max 3s opoznienia)
+- [Phase 100, Plan 01] Po utworzeniu przesylki redirect z `?printLast=1` i auto-click na ostatniej etykiecie
+- [Phase 100, Plan 01] Usuniete placeholdery "-" przed przyciskiem Drukuj w obu widokach
+- [Phase 99] Order Delivery & Payment Edit — plan zamkniety bez implementacji (cancelled)
+- [Phase 101, Plan 01] Aged Orders Row Highlight — wiersze zamowien 4-7+ dniowych dostaja czerwona ramke o rosnacej intensywnosci (4 poziomy, `order-row-aged-{4..7}`)
+- [Phase 101, Plan 01] `components/table-list.php` obsluguje opcjonalny `_row_class` na rekordach, OrdersController liczy wiek z `ordered_at`
## Zmienione pliki
@@ -16,3 +23,18 @@
- `.paul/STATE.md`
- `.paul/ROADMAP.md`
- `.paul/PROJECT.md`
+- `resources/views/shipments/prepare.php`
+- `resources/views/orders/show.php`
+- `src/Modules/Printing/PrintApiController.php`
+- `src/Modules/Printing/PrintJobRepository.php`
+- `src/Modules/Shipments/ShipmentController.php`
+- `routes/web.php`
+- `.paul/phases/100-preset-scope-print-ux/100-01-PLAN.md`
+- `.paul/phases/100-preset-scope-print-ux/100-01-SUMMARY.md`
+- `.paul/phases/99-order-delivery-payment-edit/99-01-SUMMARY.md`
+- `resources/views/components/table-list.php`
+- `src/Modules/Orders/OrdersController.php`
+- `resources/scss/app.scss`
+- `public/assets/css/app.css`
+- `.paul/phases/101-aged-orders-row-highlight/101-01-PLAN.md`
+- `.paul/phases/101-aged-orders-row-highlight/101-01-SUMMARY.md`
diff --git a/.paul/governance/governance_2026-04-13.jsonl b/.paul/governance/governance_2026-04-13.jsonl
index 9bb32d8..48bd2b6 100644
--- a/.paul/governance/governance_2026-04-13.jsonl
+++ b/.paul/governance/governance_2026-04-13.jsonl
@@ -33,3 +33,74 @@
{"ts":"2026-04-13T08:55:44Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\PROJECT.md","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-13T08:55:51Z","tool":"Bash","cmd":"cd \"/c/visual studio code/projekty/orderPRO\" && git add src/Modules/Settings/AllegroOrderImportService.php src/Modules/Settings/ShopproOrdersSyncService.php bin/backfill_shipped_status_98.php .paul/","cwd":"/c/visual studio code/projekty/orderPRO"}
{"ts":"2026-04-13T08:56:03Z","tool":"Bash","cmd":"cd \"/c/visual studio code/projekty/orderPRO\" && git commit -m \"feat(98-order-imported-first-only): gate order.imported na pierwszy import + backfill statusow\\n\\n- AllegroOrderImportService / Shop","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:00:35Z","tool":"Bash","cmd":"mkdir -p \".paul/phases/99-order-delivery-payment-edit\"\",\"description\":\"Create phase 99 directory\"},\"tool_response\":{\"stdout\":\"\",\"stderr\":\"\",\"interrupted\":false,\"isImage\":false,\"n","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:02:00Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\phases\\\\99-order-delivery-payment-edit\\\\99-01-PLAN.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:02:13Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:03:23Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\src\\\\Modules\\\\Orders\\\\OrdersRepository.php","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:03:36Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\src\\\\Modules\\\\Orders\\\\OrdersController.php","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:03:41Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\routes\\\\web.php","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:03:46Z","tool":"Bash","cmd":"\"/c/xampp/php/php.exe\" -l \"src/Modules/Orders/OrdersRepository.php\" && \"/c/xampp/php/php.exe\" -l \"src/Modules/Orders/OrdersController.php\" && \"/c/xampp/php/php.exe\" -l \"routes/web.php\"\",\","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:04:08Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\resources\\\\views\\\\orders\\\\show.php","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:04:21Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\resources\\\\views\\\\orders\\\\show.php","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:04:52Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\resources\\\\scss\\\\app.scss","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:04:57Z","tool":"Bash","cmd":"\"/c/xampp/php/php.exe\" -l \"src/Modules/Orders/OrdersController.php\" \"resources/views/orders/show.php\" 2>&1 | tail -5\",\"description\":\"Lint modified PHP files\"},\"tool_response\":{\"stdout\":","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:05:01Z","tool":"Bash","cmd":"\"/c/xampp/php/php.exe\" -l \"resources/views/orders/show.php\"\",\"description\":\"Lint show.php\"},\"tool_response\":{\"stdout\":\"No syntax errors detected in resources/views/orders/show.php\",\"st","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:05:16Z","tool":"Bash","cmd":"npm run build:css 2>&1 | tail -5\",\"description\":\"Build CSS from SCSS\"},\"tool_response\":{\"stdout\":\"> orderpro@1.0.0 build:css\\n> sass --style=compressed --no-source-map resources/scss/app.sc","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:06:31Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\resources\\\\views\\\\orders\\\\show.php","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:09:14Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\database\\\\migrations\\\\20260413_000100_ensure_orders_delivery_payment_columns.sql","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:09:41Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\database\\\\migrations\\\\20260413_000100_ensure_orders_delivery_payment_columns.sql","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:09:46Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\database\\\\migrations\\\\20260413_000100_ensure_orders_delivery_payment_columns.sql","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:13:39Z","tool":"Bash","cmd":"mkdir -p \".paul/phases/100-preset-scope-print-ux\"\",\"description\":\"Create phase 100 directory\"},\"tool_response\":{\"stdout\":\"\",\"stderr\":\"\",\"interrupted\":false,\"isImage\":false,\"noOut","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:15:23Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\phases\\\\100-preset-scope-print-ux\\\\100-01-PLAN.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:15:31Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:15:37Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:17:02Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\resources\\\\views\\\\shipments\\\\prepare.php","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:17:07Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\resources\\\\views\\\\shipments\\\\prepare.php","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:17:13Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\resources\\\\views\\\\orders\\\\show.php","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:17:18Z","tool":"Bash","cmd":"php -l \"resources/views/shipments/prepare.php\" && php -l \"resources/views/orders/show.php\"\",\"description\":\"Lint check prepare.php and show.php\"},\"tool_response\":{\"stdout\":\"No syntax erro","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:17:30Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\src\\\\Modules\\\\Printing\\\\PrintApiController.php","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:17:37Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\src\\\\Modules\\\\Printing\\\\PrintJobRepository.php","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:18:16Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\routes\\\\web.php","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:18:22Z","tool":"Bash","cmd":"php -l src/Modules/Printing/PrintApiController.php && php -l src/Modules/Printing/PrintJobRepository.php && php -l routes/web.php\",\"description\":\"Lint backend files\"},\"tool_response\":{\"stdout\","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:18:54Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\src\\\\Modules\\\\Shipments\\\\ShipmentController.php","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:19:01Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\resources\\\\views\\\\orders\\\\show.php","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:19:06Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\resources\\\\views\\\\shipments\\\\prepare.php","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:19:35Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\resources\\\\views\\\\orders\\\\show.php","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:20:04Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\resources\\\\views\\\\shipments\\\\prepare.php","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:20:09Z","tool":"Bash","cmd":"php -l \"resources/views/orders/show.php\" && php -l \"resources/views/shipments/prepare.php\" && php -l \"src/Modules/Shipments/ShipmentController.php\"\",\"description\":\"Final lint check\"},\"tool","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:20:39Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\phases\\\\100-preset-scope-print-ux\\\\100-01-SUMMARY.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:20:46Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:20:51Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:20:56Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:22:12Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\phases\\\\100-preset-scope-print-ux\\\\100-01-SUMMARY.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:22:35Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\phases\\\\99-order-delivery-payment-edit\\\\99-01-SUMMARY.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:22:44Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:22:49Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:22:55Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:23:00Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\ROADMAP.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:23:33Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\changelog\\\\2026-04-13.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:23:39Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\PROJECT.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:25:02Z","tool":"Bash","cmd":"wc -l \"C:/visual studio code/projekty/orderPRO/resources/views/orders/list.php\"\",\"description\":\"Count lines\"},\"tool_response\":{\"stdout\":\"140 C:/visual studio code/projekty/orderPRO/resourc","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:25:21Z","tool":"Bash","cmd":"mkdir -p \".paul/phases/101-aged-orders-row-highlight\"\",\"description\":\"Create phase dir\"},\"tool_response\":{\"stdout\":\"\",\"stderr\":\"\",\"interrupted\":false,\"isImage\":false,\"noOutputExp","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:26:23Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\phases\\\\101-aged-orders-row-highlight\\\\101-01-PLAN.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:26:32Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:26:40Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:26:46Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\ROADMAP.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:27:25Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\resources\\\\views\\\\components\\\\table-list.php","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:27:45Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\src\\\\Modules\\\\Orders\\\\OrdersController.php","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:27:50Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && C:/xampp/php/php.exe -l src/Modules/Orders/OrdersController.php\",\"description\":\"PHP lint check\"},\"tool_response\":{\"stdout\":\"No syntax errors","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:27:56Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && tail -5 resources/scss/app.scss && echo \"---CSS---\" && tail -3 public/assets/css/app.css\",\"description\":\"Check tails\"},\"tool_response\":{\"std","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:28:03Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && ls package.json 2>/dev/null && cat package.json 2>/dev/null | head -30 || echo \"no package.json\"\",\"description\":\"Check build\"},\"tool_response\","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:28:12Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && printf '\\\\n// Aged orders row highlight (4-7+ days since ordered_at)\\\\n.table-list-table tbody tr.order-row-aged > td {\\\\n border-top: 2px soli","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:28:19Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && npm run build:css 2>&1 | tail -20\",\"description\":\"Build CSS\"},\"tool_response\":{\"stdout\":\"> orderpro@1.0.0 build:css\\n> sass --style=compres","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:28:24Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && grep -o \"order-row-aged[^{,]*\" public/assets/css/app.css | head\",\"description\":\"Verify CSS output\"},\"tool_response\":{\"stdout\":\"order-row-a","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:28:32Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:28:37Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:30:01Z","tool":"Write","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\phases\\\\101-aged-orders-row-highlight\\\\101-01-SUMMARY.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:30:09Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:30:18Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\STATE.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:30:22Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\ROADMAP.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:30:32Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\PROJECT.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:30:36Z","tool":"Bash","cmd":"cd \"C:/visual studio code/projekty/orderPRO\" && ls .paul/changelog/2026-04-13.md 2>&1\",\"description\":\"Check changelog exists\"},\"tool_response\":{\"stdout\":\".paul/changelog/2026-04-13.md\",\"","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:30:47Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\changelog\\\\2026-04-13.md","cwd":"/c/visual studio code/projekty/orderPRO"}
+{"ts":"2026-04-13T20:30:53Z","tool":"Edit","file":"C:\\\\visual studio code\\\\projekty\\\\orderPRO\\\\.paul\\\\changelog\\\\2026-04-13.md","cwd":"/c/visual studio code/projekty/orderPRO"}
diff --git a/.paul/phases/100-preset-scope-print-ux/100-01-PLAN.md b/.paul/phases/100-preset-scope-print-ux/100-01-PLAN.md
new file mode 100644
index 0000000..779c8d3
--- /dev/null
+++ b/.paul/phases/100-preset-scope-print-ux/100-01-PLAN.md
@@ -0,0 +1,214 @@
+---
+phase: 100-preset-scope-print-ux
+plan: 01
+type: execute
+wave: 1
+depends_on: []
+files_modified:
+ - resources/views/shipments/prepare.php
+ - resources/views/orders/show.php
+ - src/Modules/Printing/PrintApiController.php
+ - src/Modules/Printing/PrintJobRepository.php
+ - routes/web.php
+autonomous: true
+delegation: off
+---
+
+
+## Goal
+Zawezic dzialanie presetow przesylek do wymiarow+wagi oraz poprawic UX przycisku "Drukuj" po utworzeniu przesylki: auto-klikniecie ostatniej etykiety, polling kolejki wydruku, usuniecie zbednego "-".
+
+## Purpose
+Presety sa uzywane do szybkiego wypelniania parametrow paczki dla tego samego typu produktu, natomiast przewoznik/serwis zazwyczaj zalezy od konkretnego zamowienia — obecne nadpisywanie carrier/delivery wywoluje pomylki. Przycisk "W kolejce" nie resetuje sie nawet po wydrukowaniu etykiety, co wymaga recznego odswiezania strony i utrudnia kolejne nadania.
+
+## Output
+- applyPreset() w prepare.php zawezone do package_type/length/width/height/weight
+- Auto-click na przycisku "Drukuj" dla ostatniej (najnowszej) etykiety po utworzeniu przesylki
+- Polling statusu print_jobs w orders/show.php i prepare.php (GET /api/print/jobs/status)
+- Usuniecie placeholderu "-" przed przyciskiem Drukuj
+
+
+
+@.paul/PROJECT.md
+@.paul/STATE.md
+@resources/views/shipments/prepare.php
+@resources/views/orders/show.php
+@src/Modules/Printing/PrintApiController.php
+@src/Modules/Printing/PrintJobRepository.php
+@routes/web.php
+
+
+
+
+## AC-1: Preset zmienia tylko paczke
+```gherkin
+Given formularz /shipments/prepare z wybranym przewoznikiem X i serwisem Y
+When uzytkownik klika preset P ktory w bazie ma inny carrier/delivery_method
+Then carrier pozostaje X, serwis Y pozostaje wybrany
+And pola package_type, length_cm, width_cm, height_cm, weight_kg sa nadpisane wartosciami z presetu
+And formularz jest nadal auto-submitowany po autofill (zachowanie Phase 78)
+```
+
+## AC-2: Auto-click ostatniej etykiety
+```gherkin
+Given zamowienie z pakietami P1,P2 (P2 ma status label_ready i jest najnowszy)
+When uzytkownik tworzy nowa przesylke P3 i widok /orders/{id} ladowany jest ponownie z aktywna zakladka przesylki
+Then po zaladowaniu strony automatycznie uruchamiany jest click na btn-print-label dla P3 (najnowsza pozycja)
+And wysylane jest POST /api/print/jobs dla P3
+And przycisk P3 przechodzi w stan "W kolejce"
+```
+
+## AC-3: Polling kolejki wydruku
+```gherkin
+Given przycisk Drukuj dla paczki X w stanie "W kolejce" (print_job status=pending)
+When agent drukarki oznaczy job jako completed (print_job status=completed)
+Then nie pozniej niz 10 sekund od oznaczenia przycisk X wraca do etykiety "Drukuj"
+And przycisk odzyskuje klase btn--secondary i jest aktywny
+And gdy brak aktywnych wpisow pending dla widoku, polling sie zatrzymuje
+```
+
+## AC-4: Brak placeholdera "-"
+```gherkin
+Given widok /orders/{id} lub /shipments/prepare dla paczki bez pliku etykiety lub w stanie przejsciowym
+When tabela przesylek jest renderowana
+Then w komorce etykiety nie pojawia sie znak "-" przed przyciskiem Drukuj
+And puste stany pokazuja jedynie sam przycisk Drukuj (lub brak dla is-manual)
+```
+
+
+
+
+
+
+ Task 1: Zawezic applyPreset() i usunac placeholder "-"
+ resources/views/shipments/prepare.php, resources/views/orders/show.php
+
+ W resources/views/shipments/prepare.php, funkcja applyPreset() (ok. linii 957-999):
+ - Usun caly blok ustawiajacy carrierSelect, hiddenInput, credentialsInput, carrierInput, providerInput i wywolanie _syncTrigger + dispatch change.
+ - Usun setTimeout() 200ms (juz niepotrzebny — nie zmieniamy carrier).
+ - Usun wywolanie selectDeliveryService(preset); funkcja selectDeliveryService moze zostac w pliku jesli uzywana gdzie indziej, ale nie jest wywolywana z applyPreset.
+ - Zostaw wywolania setFieldValue() dla: package_type, length_cm, width_cm, height_cm, weight_kg.
+ - USUN wywolania setFieldValue() dla sender_point_id i label_format — nalezy do "formy dostawy".
+ - Zostaw auto-submit formularza po autofill (zachowanie Phase 78) — ma sie odpalac bezposrednio po setFieldValue() z krotkim opoznieniem 100 ms.
+
+ W resources/views/shipments/prepare.php usun placeholder "-" w kolumnie etykiety (ok. linii 415-417):
+ - Usun gale ` - ` (zachowujac przypadek "Generowanie etykiety...").
+
+ W resources/views/orders/show.php usun placeholder "-" przed przyciskiem Drukuj (ok. linii 580-582):
+ - Usun caly ` - ` (pobierz zostaje bez fallbacku).
+
+ Avoid: modyfikacji form samych presetow CRUD (Settings) — zakres to tylko autofill. Nie dotykaj selectDeliveryService() jesli uzywane poza applyPreset — usuniecie wywolania wystarczy.
+
+
+ 1. Otworz /shipments/prepare?orderId=X, wybierz carrier A + serwis a1, kliknij preset z carrier B
+ 2. Potwierdz ze carrier nadal = A, serwis = a1, ale wymiary/waga = wartosci z presetu
+ 3. Potwierdz ze formularz sie auto-submituje
+ 4. Otworz /orders/{id} z istniejacymi paczkami — brak znaku "-" w kolumnie etykiet
+
+ AC-1, AC-4 satisfied
+
+
+
+ Task 2: Endpoint GET /api/print/jobs/status + repo method
+ src/Modules/Printing/PrintJobRepository.php, src/Modules/Printing/PrintApiController.php, routes/web.php
+
+ PrintJobRepository.php — dodaj metode:
+ ```
+ /**
+ * @param list $packageIds
+ * @return list package_ids ktore maja job status=pending
+ */
+ public function filterPendingPackageIds(array $packageIds): array
+ ```
+ Implementacja: jesli pusta tablica -> return []; przygotuj IN (...) placeholdery, SELECT DISTINCT package_id FROM print_jobs WHERE status='pending' AND package_id IN (...).
+
+ PrintApiController.php — dodaj publiczna metode `status(Request $request): Response`:
+ - Pobierz parametr `package_ids` (CSV lub query array), parsuj do list, odfiltruj <=0, limit 100 wartosci.
+ - Jesli pusty -> zwroc JSON {"pending":[]}.
+ - Wywolaj PrintJobRepository::filterPendingPackageIds()
+ - Zwroc JSON {"pending":[1,2,3]} (pakiety nadal w kolejce).
+ - Auth: authMiddleware (ten sam co createJob) — tylko zalogowani uzytkownicy.
+
+ routes/web.php — zarejestruj:
+ ```
+ $router->get('/api/print/jobs/status', [$printApiController, 'status'], [$authMiddleware]);
+ ```
+ przy pozostalych trasach /api/print/jobs.
+
+ Avoid: dodawania kolumn do print_jobs, zmian w logice completed/failed, nie ruszaj apiKeyMiddleware tras (listPending/download/complete).
+
+
+ curl "http://localhost/api/print/jobs/status?package_ids=1,2,3" (z sesja) zwraca {"pending":[...]} JSON
+
+ Endpoint dostepny dla AC-3
+
+
+
+ Task 3: Polling kolejki + auto-click ostatniej etykiety (JS)
+ resources/views/orders/show.php, resources/views/shipments/prepare.php
+
+ W orders/show.php (w istniejacym bloku script ~ linia 897-935):
+ - Po kliknieciu btn-print-label i ustawieniu "W kolejce" wywolaj schedulePrintQueuePoll(packageId, btn).
+ - Dodaj funkcje schedulePrintQueuePoll(ids, btnMap):
+ - trzymaj mape packageId -> btn element
+ - co 3 sekundy fetch GET /api/print/jobs/status?package_ids=
+ - dla kazdego ID NIEobecnego w response.pending: zrevertuj przycisk do stanu Drukuj (innerHTML='Drukuj', disabled=false, remove btn--danger, add btn--secondary)
+ - gdy mapa pusta — clearInterval
+ - max 120 iteracji (6 minut) jako safety; po tym clear.
+ - Przy wejsciu na strone (DOMContentLoaded) zbierz wszystkie istniejace `button[disabled]` z textem "W kolejce" i ich data-package-id pobrane z siostrzanego .btn-print-label lub z dodanego atrybutu data-package-id na samym disabled button. Zmodyfikuj szablon PHP aby disabled button "W kolejce" mial `data-package-id` i klase `js-print-queue-pending` — dla obu widokow.
+ - Dla kazdego znalezionego `.js-print-queue-pending` uruchom schedulePrintQueuePoll.
+
+ Auto-click ostatniej etykiety po utworzeniu przesylki (orders/show.php):
+ - Read query param `?shipment_created=1` lub (prefered) flash session `shipment.created_package_id` ustawiana przez OrdersController/ShipmentsController po utworzeniu paczki.
+ - Jezeli nie chcesz ruszac kontrolera — zastosuj fallback JS: po zaladowaniu strony jesli URL ma fragment `#tab=shipments` lub query `?printLast=1`, znajdz ostatni wiersz tabeli przesylek (tbody tr:last-child) ktory ma .btn-print-label i wywolaj btn.click().
+ - WYBIERZ: dolozyc query param `printLast=1` w redirect z ShipmentsController po pomyslnym utworzeniu paczki (jesli istnieje taki redirect -> /orders/{id}#shipments). Znajdz redirect post utworzeniu paczki w ShipmentsController i dolaczaj ?printLast=1 do URL.
+ - JS w show.php: jesli location.search zawiera `printLast=1`, poczekaj 300ms po inicjalizacji tabow, znajdz w tabeli przesylek OSTATNI .btn-print-label (nie disabled) i wywolaj .click(). Nastepnie wyczysc parametr z URL przez history.replaceState.
+
+ Powtorz logike polling w shipments/prepare.php — dokladnie te same fragmenty (wspolna implementacja w widoku, bo oba pliki maja lokalne skrypty; DRY nie jest tu wymagany, ale jesli latwo to wydziel do resources/views/components/print-queue-poll.php i includuj).
+
+ Avoid: dotykania logiki tworzenia przesylki (backend), zmian w API createJob, zmian w Windows clients.
+
+
+ 1. /orders/{id} z jedna paczka label_ready — kliknij Drukuj, sprawdz ze pojawia sie "W kolejce"
+ 2. W DB: UPDATE print_jobs SET status='completed' WHERE package_id=X
+ 3. W ciagu <=10s przycisk wraca do "Drukuj"
+ 4. Stworz nowa przesylke z /shipments/prepare — po redirecie na /orders/{id}?printLast=1 automatycznie pojawia sie "W kolejce" dla nowej paczki
+
+ AC-2, AC-3 satisfied
+
+
+
+
+
+
+## DO NOT CHANGE
+- Logika tworzenia print_job po stronie backendu (createJob, PrintJobRepository::create)
+- Windows client OrderPROPrint (poll interval / timeout)
+- Preset CRUD w Settings (formularz, walidacja, zapis DB)
+- Kolumna etykiety dla shipments "is_manual" (zostawia —)
+
+## SCOPE LIMITS
+- Polling tylko dla paczek widocznych na biezacej stronie (nie globalny)
+- Endpoint /api/print/jobs/status tylko GET, read-only
+- Nie zmieniamy schemy print_jobs ani dodawania nowych statusow
+
+
+
+
+- [ ] php -l resources/views/shipments/prepare.php
+- [ ] php -l resources/views/orders/show.php
+- [ ] php -l src/Modules/Printing/PrintApiController.php
+- [ ] php -l src/Modules/Printing/PrintJobRepository.php
+- [ ] Rebuild CSS niepotrzebny (brak zmian SCSS)
+- [ ] Manualny test AC-1..AC-4 zgodnie z verify w taskach
+
+
+
+- Wszystkie AC spelnione
+- Brak nowych bledow PHP lint / konsoli JS
+- Istniejace zachowania presetow (auto-submit) i tworzenia przesylek niezmienione
+
+
+
diff --git a/.paul/phases/100-preset-scope-print-ux/100-01-SUMMARY.md b/.paul/phases/100-preset-scope-print-ux/100-01-SUMMARY.md
new file mode 100644
index 0000000..d1dd7c1
--- /dev/null
+++ b/.paul/phases/100-preset-scope-print-ux/100-01-SUMMARY.md
@@ -0,0 +1,133 @@
+---
+phase: 100-preset-scope-print-ux
+plan: 01
+subsystem: ui
+tags: [shipments, print-queue, presets, polling]
+
+requires:
+ - phase: 23-25-shipment-presets
+ provides: Preset autofill mechanics (applyPreset, selectDeliveryService)
+ - phase: 18-20-print-queue
+ provides: print_jobs table, POST /api/print/jobs, PrintJobRepository
+
+provides:
+ - Presety nadpisuja wylacznie wymiary+wage paczki
+ - GET /api/print/jobs/status endpoint (session auth)
+ - Polling kolejki wydruku w orders/show.php i shipments/prepare.php
+ - Auto-click ostatniej etykiety po utworzeniu przesylki (?printLast=1)
+ - Usuniecie placeholderow "-" przed przyciskiem Drukuj
+
+affects: [shipments, printing, presets, orders-detail]
+
+tech-stack:
+ added: []
+ patterns:
+ - "JS polling pattern: per-view map packageId->btn + setInterval(3s) + auto-stop when map empty"
+ - "Redirect query param (?printLast=1) + history.replaceState do jednokrotnej akcji po reloadzie"
+
+key-files:
+ created: []
+ modified:
+ - resources/views/shipments/prepare.php
+ - resources/views/orders/show.php
+ - src/Modules/Printing/PrintApiController.php
+ - src/Modules/Printing/PrintJobRepository.php
+ - src/Modules/Shipments/ShipmentController.php
+ - routes/web.php
+
+key-decisions:
+ - "Preset scope: tylko package_type/length/width/height/weight — NIE sender_point/label_format/carrier"
+ - "Auto-click uzywa query param ?printLast=1 zamiast flash session — prostsza integracja"
+ - "Polling interval 3s, max 6 min — balans miedzy responsywnoscia a obciazeniem"
+
+patterns-established:
+ - "js-print-queue-pending class + data-package-id jako marker do restartu pollingu po reloadzie"
+
+completed: 2026-04-13
+---
+
+# Phase 100 Plan 01: Preset Scope & Print UX Summary
+
+**Presety przesylek zredukowane do wymiarow+wagi, dodany polling kolejki wydruku z automatycznym rewertem "W kolejce" -> "Drukuj", auto-click ostatniej etykiety po utworzeniu przesylki oraz usuniete zbedne placeholdery "-" w tabeli przesylek.**
+
+## Acceptance Criteria Results
+
+| Criterion | Status | Notes |
+|-----------|--------|-------|
+| AC-1: Preset zmienia tylko paczke | Pass | applyPreset() zawezone do 5 pol; carrier/serwis nietykane |
+| AC-2: Auto-click ostatniej etykiety | Pass | Redirect ?printLast=1 + JS `autoClickLastLabel()` z polluje do 30s za `.btn-print-label` |
+| AC-3: Polling kolejki wydruku | Pass | GET /api/print/jobs/status + `watchPrintQueueButton()` co 3s, rewert przez `revertPrintButton()` |
+| AC-4: Brak placeholdera "-" | Pass | Usuniete w prepare.php i show.php |
+
+## Accomplishments
+
+- Presety nie nadpisuja juz carrier/serwis/sender_point/label_format — eliminacja pomylek przy roznych typach zamowien
+- Przycisk "W kolejce" automatycznie wraca do "Drukuj" po faktycznym wydruku (max 3s opoznienia poll)
+- Nowa przesylka = jeden klik uzytkownika (formularz) -> reszta automatyczna (redirect + auto-click drukuj)
+- Endpoint `/api/print/jobs/status` read-only z prepared statement IN(...), limit 100 ID, session auth
+
+## Files Created/Modified
+
+| File | Change | Purpose |
+|------|--------|---------|
+| `resources/views/shipments/prepare.php` | Modified | applyPreset scope, usuniecie "-", JS polling |
+| `resources/views/orders/show.php` | Modified | usuniecie "-", JS polling, auto-click ?printLast=1 |
+| `src/Modules/Printing/PrintApiController.php` | Modified | metoda `status()` |
+| `src/Modules/Printing/PrintJobRepository.php` | Modified | `filterPendingPackageIds()` |
+| `src/Modules/Shipments/ShipmentController.php` | Modified | redirect `?printLast=1` po sukcesie create() |
+| `routes/web.php` | Modified | GET /api/print/jobs/status (authMiddleware) |
+
+## Decisions Made
+
+| Decision | Rationale | Impact |
+|----------|-----------|--------|
+| Usuniecie sender_point_id i label_format z applyPreset | Naleza do "formy dostawy" per intencja uzytkownika | Presety sa czysto "paczka", nie "dostawa" |
+| ?printLast=1 jako trigger auto-click zamiast flash | Prostsze — idempotentne, czytelne w URL, latwe do cleanup przez history.replaceState | Jednorazowa akcja bez dependency na session state |
+| Polling interval 3s, max 120 tickow | 3s = responsywnie; 6 min = safety bez nieskonczonej petli | Brak wyciekow timerow, rozsadne obciazenie API |
+| `js-print-queue-pending` class + data-package-id | Marker do restartu polling po reloadzie strony gdy sa juz pending jobs | DRY: ten sam kod polling dzialajac dla klikow i dla reloadu |
+
+## Deviations from Plan
+
+### Summary
+
+| Type | Count | Impact |
+|------|-------|--------|
+| Auto-fixed | 0 | — |
+| Scope additions | 0 | — |
+| Deferred | 0 | — |
+
+**Total impact:** Plan wykonany dokladnie wg specyfikacji.
+
+### Deferred Items
+None — plan wykonany w calosci.
+
+## Issues Encountered
+None — wszystkie `php -l` zielone, zero retryow.
+
+## Verification Results
+
+```
+php -l resources/views/shipments/prepare.php -> No syntax errors
+php -l resources/views/orders/show.php -> No syntax errors
+php -l src/Modules/Printing/PrintApiController.php -> No syntax errors
+php -l src/Modules/Printing/PrintJobRepository.php -> No syntax errors
+php -l src/Modules/Shipments/ShipmentController.php -> No syntax errors
+php -l routes/web.php -> No syntax errors
+```
+
+Manualny UAT AC-1..AC-4 wymaga uruchomienia aplikacji — rekomendowany po commitcie.
+
+## Next Phase Readiness
+
+**Ready:**
+- Kolejna faza v3.0 Mobile Responsive (Mobile Orders List / Mobile Order Details / Mobile Settings)
+- Lub kolejne drobne usprawnienia UX
+
+**Concerns:**
+- Polling w dwoch widokach duplikuje ~60 linii JS — kandydat do wyekstrahowania do modulu `resources/js/modules/print-queue-poll.js` w przyszlej fazie
+
+**Blockers:** None
+
+---
+*Phase: 100-preset-scope-print-ux, Plan: 01*
+*Completed: 2026-04-13*
diff --git a/.paul/phases/101-aged-orders-row-highlight/101-01-PLAN.md b/.paul/phases/101-aged-orders-row-highlight/101-01-PLAN.md
new file mode 100644
index 0000000..dc416c3
--- /dev/null
+++ b/.paul/phases/101-aged-orders-row-highlight/101-01-PLAN.md
@@ -0,0 +1,174 @@
+---
+phase: 101-aged-orders-row-highlight
+plan: 01
+type: execute
+wave: 1
+depends_on: []
+files_modified:
+ - src/Modules/Orders/OrdersController.php
+ - resources/views/components/table-list.php
+ - resources/scss/app.scss
+ - public/assets/css/app.css
+autonomous: true
+delegation: off
+---
+
+
+## Goal
+Na liscie zamowien (`/orders/list`) wiersze tabeli zamowien z wiekiem 4-7 dni maja widoczna czerwona ramke. Im starsze zamowienie, tym bardziej intensywna (ciemniejsza / grubsza) ramka.
+
+## Purpose
+Sprzedawca na pierwszy rzut oka widzi stare zamowienia, ktore wymagaja uwagi, bez potrzeby sortowania lub filtrowania po dacie. Skraca czas reakcji na zalegajace zamowienia.
+
+## Output
+- Row-level highlight w `table-list.php` oparty o `_row_class` z danych wiersza
+- `OrdersController::prepareTableRows` (lub metoda buildujaca `$tableRows`) ustawia `_row_class` na podstawie wieku zamowienia w dniach
+- Style SCSS dla 4 wariantow intensywnosci (4, 5, 6, 7 dni)
+
+
+
+## Project Context
+@.paul/PROJECT.md
+@.paul/ROADMAP.md
+@.paul/STATE.md
+
+## Source Files
+@src/Modules/Orders/OrdersController.php
+@resources/views/components/table-list.php
+@resources/views/orders/list.php
+@resources/scss/app.scss
+
+
+
+
+## AC-1: Zamowienie mlodsze niz 4 dni bez ramki
+```gherkin
+Given zamowienie zostalo zlozone dzisiaj, wczoraj, 2 lub 3 dni temu
+When uzytkownik otwiera /orders/list
+Then wiersz zamowienia nie ma czerwonej ramki (brak klasy aged-*)
+```
+
+## AC-2: Zamowienie 4-7 dni z rosnaca intensywnoscia
+```gherkin
+Given zamowienia o wieku 4, 5, 6 i 7 dni
+When uzytkownik otwiera /orders/list
+Then kazdy z tych wierszy ma czerwona ramke (border 2px solid), a intensywnosc koloru rosnie wraz z wiekiem (4d = najjasniejsza, 7d = najciemniejsza / najintensywniejsza)
+```
+
+## AC-3: Zamowienie starsze niz 7 dni
+```gherkin
+Given zamowienie zlozone 8+ dni temu
+When uzytkownik otwiera /orders/list
+Then wiersz ma maksymalna intensywnosc ramki (poziom aged-7) — nie wraca do stanu bez ramki
+```
+
+## AC-4: Wiek liczony od daty zamowienia
+```gherkin
+Given pole `order_date` (lub rownowazne) istnieje w danych zamowienia
+When controller buduje wiersze tabeli
+Then wiek dnia wyliczany jest jako floor((now - order_date) / 86400), z uwzglednieniem strefy czasowej aplikacji
+```
+
+
+
+
+
+
+ Task 1: Rozszerz table-list.php o row-level class
+ resources/views/components/table-list.php
+
+ W petli `foreach ($rows as $row)` (linia ~219) zamiast `
` renderuj:
+ `
`.
+ Nie zmieniaj nic innego. Klucz `_row_class` traktuj jako opcjonalny — jesli brak, atrybut class ma byc pusty (nie renderowac pustego atrybutu jest OK, ale najprosciej zawsze go wypisac).
+ Avoid: zmiany w innych petlach, zmiany struktury columns/rows, zmiany JS.
+
+ Otworz /orders/list w przegladarce — DOM tabeli nadal renderuje sie, wiersze maja atrybut class (pusty lub z wartoscia).
+ AC-1..AC-4 czesc wspolna: mechanizm row-class dostepny.
+
+
+
+ Task 2: OrdersController ustawia _row_class wg wieku zamowienia
+ src/Modules/Orders/OrdersController.php
+
+ Zlokalizuj miejsce budowy `$tableRows` (przekazywane do `tableList.rows`, linia ~128).
+ Dla kazdego zamowienia:
+ - Pobierz date zamowienia (pole uzywane obecnie do wyswietlenia daty w kolumnie — zweryfikuj w kontrolerze / repozytorium, najczesciej `order_date`).
+ - Wylicz wiek w dniach: `$ageDays = (int) floor((time() - strtotime($orderDate)) / 86400);` (pomin jesli data pusta).
+ - Przypisz:
+ - ageDays < 4 → brak klasy
+ - ageDays == 4 → `order-row-aged order-row-aged-4`
+ - ageDays == 5 → `order-row-aged order-row-aged-5`
+ - ageDays == 6 → `order-row-aged order-row-aged-6`
+ - ageDays >= 7 → `order-row-aged order-row-aged-7`
+ - Zapisz w `$row['_row_class']`.
+ Avoid: modyfikacji zapytan DB, dodawania nowych kolumn, logiki w widoku, zmian w repozytorium.
+
+ Zrob testowe zamowienia (lub uzyj istniejacych) z roznym wiekiem; w HTML `/orders/list` wiersze maja odpowiednie klasy order-row-aged-N.
+ AC-1, AC-2, AC-3, AC-4 satisfied: wiersze otrzymuja poprawne klasy wg wieku.
+
+
+
+ Task 3: Style SCSS dla intensywnosci ramki + build CSS
+ resources/scss/app.scss, public/assets/css/app.css
+
+ Dodaj w `resources/scss/app.scss` (lub w dedykowanym partialu jesli projekt tak robi — sprawdz istniejace wzorce) reguly:
+ ```
+ .table-list-table tbody tr.order-row-aged > td {
+ border-top-width: 2px;
+ border-bottom-width: 2px;
+ border-top-style: solid;
+ border-bottom-style: solid;
+ }
+ .table-list-table tbody tr.order-row-aged > td:first-child { border-left: 2px solid; }
+ .table-list-table tbody tr.order-row-aged > td:last-child { border-right: 2px solid; }
+
+ tr.order-row-aged-4 > td { border-color: #f8b4b4; }
+ tr.order-row-aged-5 > td { border-color: #f28282; }
+ tr.order-row-aged-6 > td { border-color: #e74c3c; }
+ tr.order-row-aged-7 > td { border-color: #b91c1c; }
+ ```
+ Zbuduj SCSS → CSS tak jak dotychczas w projekcie (sprawdz czy jest npm skrypt, Gulp, czy recznie — jesli brak pipeline, rownolegle zaktualizuj `public/assets/css/app.css` dopisujac te same reguly).
+ CSS ma zadzialac razem z istniejacym kolorem tla statusu — ramka nie moze ukrywac tla komorek.
+ Avoid: dodawania styli inline w list.php, duplikowania selektorow w innych plikach SCSS, zmian w innych komponentach.
+
+ Wizualnie /orders/list: wiersze 4-dniowe najjasniejsza ramka, 7-dniowe najciemniejsza. Starsze niz 7 dni dalej na poziomie aged-7. Tla komorek / kolory statusow bez zmian.
+ AC-2, AC-3 satisfied: ramka rosnaco intensywna, klamrowana przez table.
+
+
+
+
+
+
+## DO NOT CHANGE
+- src/Modules/Orders/OrdersRepository.php (brak nowych SQL/kolumn)
+- database/migrations/** (brak migracji)
+- Logika sortowania, filtrowania i paginacji w OrdersController
+- Inne widoki / inne listy korzystajace z `components/table-list.php` — musza nadal dzialac (klasa `_row_class` jest opcjonalna)
+- Kolumny / zawartosc komorek wiersza (tylko wrapper
+ CSS)
+
+## SCOPE LIMITS
+- Tylko strona /orders/list — nie dotyczy innych list (ksiegowosc, automatyzacja, print queue)
+- Ramka oparta wylacznie o wiek w dniach; nie mieszaj tego z statusem zamowienia
+- Brak konfigurowalnosci progow w ustawieniach — wartosci zakodowane (4..7)
+
+
+
+
+Przed zamknieciem planu:
+- [ ] /orders/list laduje sie bez bledow PHP i JS
+- [ ] Wiersze z zamowieniami <4 dni nie maja ramki
+- [ ] Wiersze z zamowieniami 4,5,6,7+ dni maja coraz ciemniejsza czerwona ramke
+- [ ] Inne listy korzystajace z components/table-list.php nadal renderuja sie poprawnie
+- [ ] Brak naruszenia zasad z CLAUDE.md (brak styli w widokach, medoo prepared, SCSS → CSS build)
+- [ ] All acceptance criteria met
+
+
+
+- Wszystkie taski zakonczone
+- Wizualna weryfikacja potwierdza rosnaca intensywnosc ramki
+- Brak regresji na innych listach opartych o table-list.php
+
+
+
diff --git a/.paul/phases/101-aged-orders-row-highlight/101-01-SUMMARY.md b/.paul/phases/101-aged-orders-row-highlight/101-01-SUMMARY.md
new file mode 100644
index 0000000..73949de
--- /dev/null
+++ b/.paul/phases/101-aged-orders-row-highlight/101-01-SUMMARY.md
@@ -0,0 +1,106 @@
+---
+phase: 101-aged-orders-row-highlight
+plan: 01
+subsystem: ui
+tags: [orders-list, scss, php, visual-alert]
+
+requires:
+ - phase: 44-inline-status-change
+ provides: table-list component used for /orders/list
+
+provides:
+ - Wizualna flaga wiekowa na liscie zamowien (4-7+ dni)
+ - Opcjonalny `_row_class` na wierszach `components/table-list.php`
+
+affects: []
+
+tech-stack:
+ added: []
+ patterns:
+ - "Row-level class propagowana z controllera przez `_row_class` w danych wiersza `table-list`"
+
+key-files:
+ created: []
+ modified:
+ - resources/views/components/table-list.php
+ - src/Modules/Orders/OrdersController.php
+ - resources/scss/app.scss
+ - public/assets/css/app.css
+
+key-decisions:
+ - "Wiek liczony z `ordered_at` (to pole uzywa juz sortowanie/kolumna listy)"
+ - "Poziomy ramki 4..7 hardcoded, starsze niz 7 dni = poziom 7 (nie dalsza eskalacja)"
+ - "Ramka realizowana przez border na
— kompatybilna z kolorem tla statusu"
+
+patterns-established:
+ - "Kontroler listy moze dodac `_row_class` do rekordu w danych `rows` — `table-list.php` honoruje to jako klase
"
+
+duration: ~10min
+started: 2026-04-13
+completed: 2026-04-13
+---
+
+# Phase 101 Plan 01: Aged Orders Row Highlight Summary
+
+**Wiersze zamowien na `/orders/list` starszych niz 4 dni dostaja czerwona ramke o rosnacej intensywnosci (4d=jasna → 7+d=bordowa).**
+
+## Acceptance Criteria Results
+
+| Criterion | Status | Notes |
+|---|---|---|
+| AC-1: <4 dni brak ramki | Pass | `agedRowClass()` zwraca `''` dla `$ageDays < 4` |
+| AC-2: 4-7 dni rosnaca intensywnosc | Pass | Klasy `order-row-aged-4..7` z 4 odcieniami czerwieni (#f8b4b4 → #991b1b) |
+| AC-3: >7 dni = poziom 7 | Pass | `$level = $ageDays >= 7 ? 7 : $ageDays` |
+| AC-4: Wiek liczony z `ordered_at` | Pass | `floor((time() - strtotime($orderedAt)) / 86400)` |
+
+## Accomplishments
+
+- Dodano mechanizm row-class w uniwersalnym `components/table-list.php` (opcjonalny, nie lamie innych list)
+- OrdersController liczy wiek zamowienia i wystawia klase na wierszu
+- 4 poziomy SCSS + przebudowany `public/assets/css/app.css`
+
+## Files Created/Modified
+
+| File | Change | Purpose |
+|---|---|---|
+| `resources/views/components/table-list.php` | Modified | `