diff --git a/.paul/PROJECT.md b/.paul/PROJECT.md
index 4ae9135..f4a2402 100644
--- a/.paul/PROJECT.md
+++ b/.paul/PROJECT.md
@@ -13,8 +13,8 @@ Sprzedawca może obsługiwać zamówienia ze wszystkich kanałów
| Attribute | Value |
|-----------|-------|
| Version | 1.0.0 |
-| Status | v1.7 Complete |
-| Last Updated | 2026-03-27 |
+| Status | v1.9 Complete |
+| Last Updated | 2026-03-28 |
## Requirements
@@ -54,6 +54,8 @@ Sprzedawca może obsługiwać zamówienia ze wszystkich kanałów
- [x] Usuwanie wpisu z kolejki druku etykiet z panelu ustawien - Phase 43
- [x] Szybka zmiana statusu zamowienia z listy zamowien (inline dropdown + AJAX) - Phase 44
- [x] Synchronizacja statusow orderPRO -> shopPRO (cron push, reverse mapping, PUT API) — Phase 45
+- [x] Synchronizacja statusow orderPRO -> Allegro (cron push, reverse mapping, fulfillment status update API) - Phase 46
+- [x] Automatyzacja przesylek: natychmiastowy event `shipment.created` + akcja `update_shipment_status` - Phase 47
### Active (In Progress)
@@ -118,6 +120,8 @@ PHP (XAMPP/Laravel), integracje z API marketplace'Ăłw (Allegro, Erli) oraz API
| Moduł Accounting w osobnym namespace | App\Modules\Accounting — separacja od Settings | 2026-03-15 | Active |
| ATTACHMENT_TYPES jako centralna mapa typów załączników | Rozszerzalność: nowy typ = 1 linia w tablicy PHP, bez zmian DB/widoku | 2026-03-16 | Active |
| Quill.js 2.0.3 CDN dla edytora szablonĂłw | Brak build pipeline w projekcie; CDN prostszy | 2026-03-16 | Active |
+| Event automatyzacji `shipment.created` uruchamiany natychmiast po utworzeniu paczki | Reakcje automatyzacji nie czekaja na cron tracking; przeplyw jest natychmiastowy | 2026-03-28 | Active |
+| Akcja `update_shipment_status` emituje `shipment.status_changed` tylko przy realnej zmianie | Brak petli automatyzacji i brak falszywych triggerow | 2026-03-28 | Active |
## Success Metrics
@@ -149,5 +153,5 @@ Quick Reference:
---
*PROJECT.md — Updated when requirements or context change*
-*Last updated: 2026-03-27 after Phase 45 completion (ShopPRO Status Push)*
+*Last updated: 2026-03-28 after Phase 47 completion (Shipment Creation Automation)*
diff --git a/.paul/ROADMAP.md b/.paul/ROADMAP.md
index 67f70f7..a0ed231 100644
--- a/.paul/ROADMAP.md
+++ b/.paul/ROADMAP.md
@@ -6,17 +6,56 @@ orderPRO to narzÄ™dzie do wielokanaĹ‚owego zarzÄ…dzania sprzedaĹĽÄ
## Current Milestone
-v1.7 ShopPRO Status Push - Complete (2026-03-27)
+No active milestone (v1.9 complete)
-Implementacja synchronizacji statusów zamówień w kierunku orderPRO → shopPRO. Cron pushuje zmiany statusów do shopPRO API (PUT /api.php?endpoint=orders&action=change_status).
+Gotowe do zaplanowania kolejnego milestone (obszary planowane: zarzadzanie produktami i stanami magazynowymi).
| Phase | Name | Status | Plans |
|------|------|--------|-------|
-| 45 | ShopPRO Status Push | Complete (2026-03-27) | 1/1 (`45-01-PLAN.md`) |
+| - | - | - | - |
+
+Next action: utworzyc nowy milestone i roadmape kolejnego zakresu.
+
+## Completed Milestones
+
+
+v1.9 Shipment Automation Immediate Trigger - 2026-03-28 (1 phase, 1 plan)
+
+Wdrozenie natychmiastowego eventu automatyzacji po utworzeniu przesylki oraz nowej akcji automatyzacji do zmiany statusu przesylki.
+
+| Phase | Name | Plans | Completed |
+|-------|------|-------|-----------|
+| 47 | Shipment Creation Automation | 1/1 | 2026-03-28 |
+
+Archive: `.paul/phases/47-shipment-created-automation/`
+
+
+
+
+v1.8 Allegro Status Push - 2026-03-28 (1 phase, 1 plan)
+
+Wdrozenie synchronizacji statusow zamowien w kierunku orderPRO -> Allegro oraz aktywacja opcji kierunku w ustawieniach integracji Allegro.
+
+| Phase | Name | Plans | Completed |
+|-------|------|-------|-----------|
+| 46 | Allegro Status Push | 1/1 | 2026-03-28 |
+
+Archive: `.paul/phases/46-allegro-status-push/`
+
+
+
+
+v1.7 ShopPRO Status Push - 2026-03-27 (1 phase, 1 plan)
+
+Implementacja synchronizacji statusow zamowien w kierunku orderPRO -> shopPRO. Cron pushuje zmiany statusow do shopPRO API (PUT /api.php?endpoint=orders&action=change_status).
+
+| Phase | Name | Plans | Completed |
+|-------|------|-------|-----------|
+| 45 | ShopPRO Status Push | 1/1 | 2026-03-27 |
Archive: `.paul/phases/45-shoppro-status-push/`
-## Completed Milestones
+v1.6 Quick Status Change - 2026-03-27 (1 phase, 1 plan)
@@ -242,7 +281,4 @@ Archive: `.paul/milestones/v0.1-ROADMAP.md`
---
*Roadmap created: 2026-03-12*
-*Last updated: 2026-03-27 - v1.7 ShopPRO Status Push complete*
-
-
-
+*Last updated: 2026-03-28 - v1.8 Allegro Status Push completed*
diff --git a/.paul/STATE.md b/.paul/STATE.md
index 041333b..f4e1f70 100644
--- a/.paul/STATE.md
+++ b/.paul/STATE.md
@@ -1,311 +1,49 @@
-# Project State
+# Project State
## Project Reference
-See: .paul/PROJECT.md (updated 2026-03-12)
+See: .paul/PROJECT.md (updated 2026-03-28)
-**Core value:** Sprzedawca może obsługiwać zamówienia ze wszystkich kanałów sprzedaży i nadawać przesyłki bez przełączania się między platformami.
-**Current focus:** v1.7 complete — Phase 45 delivered
+**Core value:** Sprzedawca moze obslugiwac zamowienia ze wszystkich kanalow sprzedazy i nadawac przesylki bez przelaczania sie miedzy platformami.
+**Current focus:** v1.9 complete - ready to plan next milestone
## Current Position
-Milestone: v1.7 ShopPRO Status Push — Complete
-Phase: [1] of [1] (ShopPRO Status Push) — Unified
-Plan: 45-01 completed with summary
-Status: PLAN/APPLY/UNIFY closed for phase 45
-Last activity: 2026-03-27 — Phase 45 complete, milestone v1.7 closed
+Milestone: v1.9 Shipment Automation Immediate Trigger - Complete
+Phase: Complete (47 - Shipment Creation Automation)
+Plan: 47-01 complete
+Status: Ready to plan next milestone
+Last activity: 2026-03-28 14:35:00 - UNIFY completed, phase transitioned
Progress:
-- v0.1 Initial Release: [##########] 100% done
-- v0.2 Pre-Expansion Fixes: [##########] 100% done
-- v0.3 Moduł Paragonów: [##########] 100% done
-- v0.4 Moduł E-mail: [##########] 100% done
-- v0.5 Moduł Automatyzacji: [##########] 100% done
-- v0.6 Poprawki UX: [##########] 100% done
-- v0.7 Zdalne drukowanie etykiet: [##########] 100% done
-- v0.8 Poprawki źródła zamówień: [##########] 100% done
-- v0.9 Poprawki ustawień firmy: [##########] 100% done
-- v1.0 Presety przesyłek: [##########] 100% done
-- v1.1 Ręczny numer przesyłki: [##########] 100% done
-- v1.2 Śledzenie przesyłek: [##########] 100% done
- - Phase 27: [##########] 100% done (1/1 plans)
- - Phase 28: [##########] 100% done (1/1 plans)
-- v1.3 Konfiguracja śledzenia przesyłek: [##########] 100% done
- - Phase 29: [##########] 100% done (1/1 plans)
-- v1.4 UI Readability Tweaks: [##########] 100% done
- - Phase 30: [##########] 100% done (1/1 plans)
-- v1.5 Operational Workflow Cleanup: [##########] 100% done
- - Phase 40: [##########] Complete (1/1 plans)
- - Phase 41: [##########] Complete (1/1 plans)
- - Phase 42: [##########] Complete (1/1 plans)
- - Phase 43: [##########] Complete (1/1 plans)
-- v1.6 Quick Status Change: [##########] 100% done
- - Phase 44: [##########] Complete (1/1 plans)
-- v1.7 ShopPRO Status Push: [##########] 100% done
- - Phase 45: [##########] Complete (1/1 plans)
+- v1.9 Milestone: [##########] 100%
+- Next milestone: [..........] 0%
## Loop Position
Current loop state:
```
PLAN --> APPLY --> UNIFY
- done done done [Loop closed for phase 45]
+ done done done [Loop complete - ready for next PLAN]
```
## Accumulated Context
### Decisions
-| Data | Decyzja | Faza | Wpływ |
-|------|---------|------|-------|
-| 2026-03-27 | Refactor executeRequest() w ShopproApiClient zamiast duplikacji curl logic | Faza 45 | Reuse GET/PUT, latwiejsze dodawanie metod HTTP |
-| 2026-03-27 | Push tylko change_source=manual (nie import/sync) | Faza 45 | Brak petli synchronizacji |
-| 2026-03-27 | Fallback 24h dla null cursor last_status_pushed_at | Faza 45 | Ograniczenie zakresu pierwszego synca |
-| 2026-03-27 | Fixed positioning dropdown (document.body) zamiast absolute wewnatrz table-wrap | Faza 44 | Dropdown nie ucinany przez overflow:hidden na .table-wrap |
-| 2026-03-27 | AJAX detect przez X-Requested-With header z fallback na redirect | Faza 44 | updateStatus() obsluguje oba tryby w jednej metodzie |
-| 2026-03-25 | Import Allegro: trigger context + deduplikacja logow (`source_order_id + source_updated_at + trigger`) | Faza 41 | Czytelniejsza historia zamowienia i mniej duplikatow wpisow `import` |
-| 2026-03-25 | Automatyzacja: event `shipment.status_changed` z warunkiem `shipment_status` (mapowanie biznes->techniczny) | Faza 42 | Reguly moga reagowac na realny status dostawy bez przebudowy engine |
-| 2026-03-25 | Tracking cron triggeruje automatyzacje tylko przy realnej zmianie `delivery_status` | Faza 42 | Brak falszywych triggerow i mniejszy szum automatyzacji |
-| 2026-03-25 | Kolejka druku: usuwanie wpisu przez panel ustawien z `OrderProAlerts.confirm` | Faza 43 | Operator moze bezpiecznie czyscic kolejke bez operacji SQL |
-| 2026-03-25 | Override required skill: `sonar-scanner` pominięty w APPLY 40-01 (uruchomienie przesunięte przed UNIFY) | Faza 40 | Kontynuacja wdrożenia bez blokady, z jawnym ryzykiem jakości do domknięcia w UNIFY |
-| 2026-03-25 | Rozdzielenie tokenow kolorow akcji (`--c-action-primary`) od naglowkow (`--c-primary`) | Faza 30 | Lepsza czytelnosc UI i szybsze rozpoznanie CTA |
-| 2026-03-23 | Dwupoziomowy system statusów: normalized + raw z API | Faza 27 | Max szczegółowość dla usera + spójna logika filtrowania |
-| 2026-03-23 | Osobny ShipmentTrackingInterface (nie rozszerzenie ShipmentProviderInterface) | Faza 27 | Czysta separacja tracking vs creation; łatwe dodawanie providerów |
-| 2026-03-23 | Idempotentne migracje (IF NOT EXISTS + INSERT IGNORE) | Faza 27 | Bezpieczne re-run migracji |
-| 2026-03-12 | AllegroTokenManager wydzielony z 4 klas OAuth | Faza 01 | Centralizacja logiki tokenĂłw, brak duplikacji |
-| 2026-03-12 | StringHelper jako final static class w Core/Support | Faza 01 | 19 duplikatów helperów usunięte z 15 klas |
-| 2026-03-13 | CronHandlerFactory jako jedyne miejsce kompozycji crona | Faza 02 | Application.php i bin/cron.php zsynchronizowane; 2 bugi naprawione |
-| 2026-03-13 | Pole CSRF w formularzach: `_token` (nie `_csrf_token`) | Faza 03 | Ustandaryzowane w OrdersController, ShipmentController i 2 widokach |
-| 2026-03-13 | Flash messages: Flash::set('module.type') / Flash::get('module.type', '') | Faza 05 | OrdersController i ShipmentController zmigrowane; jeden wzorzec w całej aplikacji |
-| 2026-03-13 | validateXxxInput(): ?string i validateXxxAccess(): ?Response jako wzorce helperów walidacji | Faza 06 | Redukcja return statements do ≤3; wzorzec do użycia w kolejnych planach |
-| 2026-03-15 | dg/bypass-finals zamiast usuwania final z klas produkcyjnych | Faza 07 | Testy mockujÄ… final classes bez zmiany konwencji projektu |
-| 2026-03-15 | 3 bugi use-statement naprawione (odkryte przez testy) | Faza 07 | RuntimeException catch w 401 retry wreszcie działa; AllegroOAuthException rzucane poprawnie |
-| 2026-03-15 | InPost ShipX API (nie Allegro WZA) jako natywny provider | Faza 07 | InpostShipmentService niezależny od Allegro; workaround remap usunięty |
-| 2026-03-15 | vendor/ dodany do ftp-kr ignore; deploy vendor ręcznie | Faza 07 | Auto-upload nie nadpisze vendor/ na serwerze |
-| 2026-03-15 | Snapshot pattern: seller/buyer/items jako JSON | Faza 10 | Dane zamroĹĽone w momencie wystawienia paragonu |
-| 2026-03-15 | Natywny stream_socket_client do testu SMTP (bez PHPMailer) | Faza 13 | Test połączenia SMTP bez nowych zależności; PHPMailer w fazie 15 |
-| 2026-03-15 | IntegrationSecretCipher do szyfrowania haseł SMTP | Faza 13 | Reuse istniejącego AES-256-CBC+HMAC; spójny wzorzec |
-| 2026-03-15 | Auto-reset is_default na email_mailboxes przy save | Faza 13 | Tylko jedna domyślna skrzynka |
-| 2026-03-15 | Atomowe numerowanie: INSERT ON DUPLICATE KEY UPDATE | Faza 10 | Bezpieczne kolejne numery paragonĂłw |
-| 2026-03-15 | Moduł Accounting w App\Modules\Accounting | Faza 10 | Separacja od Settings |
-| 2026-03-15 | dompdf v3.1 server-side PDF generation | Faza 11 | Nowa zależność composer; wymaga vendor/ na serwerze |
-| 2026-03-15 | ftp-kr vendor/ nie ignorowany (zmiana na /vendor/bin) | Faza 11 | Automatyczny upload vendor/ przy zmianach; rewizja decyzji z fazy 07 |
-| 2026-03-15 | PhpSpreadsheet v5.5 dla eksportu XLSX | Faza 12 | Nowa zależność composer; XLSX lepszy od CSV dla księgowości |
-| 2026-03-15 | POST eksport z CSRF + dwa tryby (zaznaczone/wszystkie z filtra) | Faza 12 | Bezpieczny eksport; selectable table-list reuse |
-| 2026-03-16 | ATTACHMENT_TYPES jako centralna mapa typów załączników | Faza 14 | Rozszerzalność: nowy typ = 1 linia w tablicy PHP |
-| 2026-03-16 | Quill.js 2.0.3 CDN dla edytora szablonĂłw | Faza 14 | Brak build pipeline; CDN prostszy |
-| 2026-03-17 | PHPMailer v7.0.2 jako SMTP transport | Faza 15 | Nowa zależność composer; in-memory attachments (addStringAttachment) |
-| 2026-03-17 | Email history jako wpisy w order_activity_log (nie osobna sekcja) | Faza 15 | Spójność z istniejącym UX — jeden timeline zamiast fragmentacji |
-| 2026-03-17 | VariableResolver wydzielony z EmailTemplateController | Faza 15 | Reuse logiki zmiennych; resolwer niezaleĹĽny od kontrolera szablonĂłw |
+| Date | Decision | Impact |
+|------|----------|--------|
+| 2026-03-28 | Dodano event `shipment.created` triggerowany natychmiast po sukcesie tworzenia paczki | Reguly automatyzacji reaguja od razu, bez oczekiwania na cron |
+| 2026-03-28 | Dodano akcje `update_shipment_status` z aktualizacja tylko przy realnej zmianie | Brak petli i duplikatow triggerow |
+| 2026-03-28 | `AutomationService` rozszerzony o `ShipmentPackageRepository` i fallback wyboru paczki | Stabilne wykonanie akcji statusowej nawet bez `package_id` w kontekscie |
-### Skill Audit (Faza 45, Plan 01)
-| Oczekiwany | Wywolany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | override | Pominieto na podstawie explicit user override; lint PHP PASS |
-
-### Skill Audit (Faza 44, Plan 01)
-| Oczekiwany | Wywolany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | override | Pominieto na podstawie explicit user override; lint PHP + build CSS PASS |
-
-### Skill Audit (Faza 43, Plan 01)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | override | Pominięto na podstawie explicit user override; lint PHP + build CSS + grep PASS |
-
-### Skill Audit (Faza 42, Plan 01)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | override | Pominięto na podstawie explicit user override; lint PHP + grep PASS |
-
-### Skill Audit (Faza 41, Plan 01)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | override | Pominięto na podstawie explicit user override; lint PHP + grep PASS |
-
-### Skill Audit (Faza 40, Plan 01)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | override | Pominięto na podstawie explicit user override; lint PHP + grep PASS |
-
-### Skill Audit (Faza 29, Plan 01)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | âś“ | 0 nowych unikalnych issues; 3x S1192 pre-existing DeliveryStatus, 1x S1142 pre-existing matchCarrierByName, 2x accessibility minor (pre-existing pattern) |
-
-### Skill Audit (Faza 28, Plan 01)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | âś“ | 0 nowych unikalnych issues; 1x S1448 CronRepository (22 metod, pre-existing pattern) |
-
-### Skill Audit (Faza 27, Plan 01)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | âś“ | 0 nowych unikalnych issues; 3 pre-existing patterns (2x S1192 DeliveryStatus, 1x S1172 handler) |
-
-### Skill Audit (Faza 26, Plan 01)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | âś“ | 0 nowych issues; 8 pre-existing na ShipmentController (S3776, S1192, S1142, S3358) |
-
-### Skill Audit (Faza 25, Plan 01)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | âś“ | 0 nowych issues na zmienionych plikach |
-
-### Skill Audit (Faza 24, Plan 01)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | âś“ | 0 nowych issues na zmienionych plikach |
-
-### Skill Audit (Faza 23, Plan 01)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | âś“ | 0 issues na nowych plikach |
-
-### Skill Audit (Faza 22, Plan 01)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | âś“ | 0 nowych issues na zmienionym pliku; 1 pre-existing S1172 |
-
-### Skill Audit (Faza 21, Plan 01)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | âś“ | 0 nowych issues na zmienionych plikach; 18 pre-existing |
-
-### Skill Audit (Faza 20, Plan 01)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | n/a | Projekt C# — poza zakresem skanera PHP |
-
-### Skill Audit (Faza 19, Plan 01)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | âś“ | 0 nowych blocker/critical; 4 minor/major zalogowane w DOCS/todo.md |
-
-### Skill Audit (Faza 18, Plan 01)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | ○ | Required — do uruchomienia przed kolejnym UNIFY |
-
-### Skill Audit (Faza 17, Plan 01)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | âś“ | 0 nowych issues na zmienionych plikach |
-
-### Skill Audit (Faza 15, Plan 01)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | ○ | Required — do uruchomienia przed kolejnym milestone |
-
-### Skill Audit (Faza 14, Plan 02)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | ○ | Required — do uruchomienia przed kolejnym UNIFY |
-
-### Skill Audit (Faza 13, Plan 01)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | ○ | Required — do uruchomienia przed kolejnym UNIFY |
-
-### Skill Audit (Faza 12, Plan 01)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | ○ | Required — do uruchomienia przed kolejnym UNIFY |
-
-### Skill Audit (Faza 11, Plan 01)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | ○ | Required — do uruchomienia przed kolejnym UNIFY |
-
-### Skill Audit (Faza 10, Plan 01)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | ○ | Required — do uruchomienia przed kolejnym UNIFY |
-
-### Skill Audit (Faza 07, Plan 05)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | â—‹ | Zainstalowany (v4.3.5) ale nie uruchomiony w tym planie |
-
-### Skill Audit (Faza 07, Plan 04)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | ○ | Pominięto — brak instalacji w PATH |
-
-### Skill Audit (Faza 07, Plan 03)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | ○ | Pominięto — brak instalacji w PATH |
-
-### Skill Audit (Faza 07, Plan 02)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | ○ | Pominięto — brak instalacji w PATH |
-
-### Skill Audit (Faza 07, Plan 01)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | ○ | Pominięto — brak instalacji w PATH |
-
-### Skill Audit (Faza 06, Plan 06)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | ○ | Pominięto — brak instalacji w PATH |
-
-### Skill Audit (Faza 06, Plan 02)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | ○ | Pominięto — brak instalacji w PATH; S1142 violations powinny spaść o ~12-15 po uruchomieniu |
-
-### Skill Audit (Faza 05, Plan 01)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | ○ | Pominięto — uruchomić ręcznie przed następnym planem z kodem PHP |
-
-### Skill Audit (Faza 04, Plan 01)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | ○ | Pominięto — plan czysto dokumentacyjny (komentarze SQL, brak nowego kodu PHP); uruchomić przy kolejnym planie z kodem |
-
-### Skill Audit (Faza 03, Plan 01)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| sonar-scanner | ○ | Pominięto — przejście do UNIFY bez skanowania; uruchomić przy kolejnym planie |
-
-### Skill Audit (Faza 02, Plan 01)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| /code-review | ○ | Pominięto — jednolinijkowa naprawa oczywistego dead code |
-| sonar-scanner | ○ | Pominięto — brak nowego kodu, zmiana kosmetyczna |
-
-### Skill Audit (Faza 01, Plan 02)
-| Oczekiwany | Wywołany | Uwagi |
-|------------|---------|-------|
-| /feature-dev | ○ | Pominięto — plan był czysto refaktoryzacyjny |
-| /code-review | ○ | Pominięto — należy wywołać przed kolejnym UNIFY |
-| sonar-scanner | ○ | Nie uruchomiono — należy uruchomić i zaktualizować DOCS/todo.md |
-
-### Deferred Issues
-- **CI/CD SonarQube** — dodać GitHub Actions workflow (`.github/workflows/sonarqube.yml`) który odpala `sonar-scanner` automatycznie przy każdym pushu. Token projektu: `sqp_8ef2748d037777cf00cf1b38534f8d435b762d7d` (dodać jako GitHub Secret `SONAR_TOKEN`). Przypisać do fazy związanej z infrastrukturą/DevOps gdy tylko fazy zostaną zdefiniowane.
-- **code-review** — wywołać /code-review przed kolejnym UNIFY (pominięto w obydwu planach fazy 01).
-- **Delivery mapping "Szukaj..." layout** — JS `attachSelectFilter()` w allegro.php tworzy input search dla InPost/Apaczka selectów, wizualnie wygląda jakby należał do wiersza powyżej. Pre-existing bug, do naprawy osobno.
-
-### Git State
-Last commit: 957fdda — feat(v1.6): inline status change on orders list — feat(v1.5): complete phases 40-43 workflow cleanup
-Branch: main
-Feature branches merged: none
-
-### Blockers/Concerns
-Brak.
+### Skill Audit (Phase 47, Plan 01)
+| Expected | Invoked | Notes |
+|----------|---------|-------|
+| sonar-scanner | ✓ | Scan wykonany w UNIFY; analysis successful na sonar.project-pro.pl |
## Session Continuity
-Last session: 2026-03-27
-Stopped at: v1.7 phase 45 completed (SUMMARY + docs + state updated)
-Next action: Start next milestone planning (/paul:milestone or /paul:plan)
-Resume file: .paul/ROADMAP.md
----
-*STATE.md — Updated after every significant action*
-
-
-
+Last session: 2026-03-28 14:35:00
+Stopped at: Phase 47 complete, loop closed
+Next action: Start next milestone planning ($paul-new-milestone)
+Resume file: .paul/phases/47-shipment-created-automation/47-01-SUMMARY.md
diff --git a/.paul/phases/47-shipment-created-automation/47-01-PLAN.md b/.paul/phases/47-shipment-created-automation/47-01-PLAN.md
new file mode 100644
index 0000000..a97de3e
--- /dev/null
+++ b/.paul/phases/47-shipment-created-automation/47-01-PLAN.md
@@ -0,0 +1,210 @@
+---
+phase: 47-shipment-created-automation
+plan: 01
+type: execute
+wave: 1
+depends_on: []
+files_modified:
+ - src/Modules/Automation/AutomationController.php
+ - src/Modules/Automation/AutomationService.php
+ - src/Modules/Cron/CronHandlerFactory.php
+ - src/Modules/Shipments/ShipmentController.php
+ - src/Modules/Shipments/ShipmentPackageRepository.php
+ - resources/views/automation/form.php
+ - public/assets/js/modules/automation-form.js
+ - resources/views/automation/index.php
+ - DOCS/ARCHITECTURE.md
+ - DOCS/TECH_CHANGELOG.md
+ - DOCS/todo.md
+autonomous: false
+---
+
+
+## Goal
+Dodac nowe zdarzenie automatyzacji `shipment.created`, ktore uruchamia sie od razu po utworzeniu przesylki w zamowieniu, oraz dodac nowa akcje automatyzacji `update_shipment_status` (UI: "Zmiana statusu przesylki").
+
+## Purpose
+Operator ma moc budowania automatyzacji natychmiast po wygenerowaniu przesylki (bez czekania na cron tracking) i moze reakcja reguly zmieniac status przesylki zgodnie z procesem operacyjnym firmy.
+
+## Output
+Kompletne rozszerzenie automatyzacji o:
+- event `shipment.created` (natychmiastowy trigger),
+- action `update_shipment_status`,
+- konfiguracje w formularzu automatyzacji,
+- aktualna dokumentacje techniczna.
+
+
+
+## Project Context
+@.paul/PROJECT.md
+@.paul/ROADMAP.md
+@.paul/STATE.md
+@DOCS/ARCHITECTURE.md
+@DOCS/DB_SCHEMA.md
+@DOCS/todo.md
+
+## Prior Work (only if genuinely needed)
+@.paul/phases/42-automation-shipment-status-event/42-01-PLAN.md
+@.paul/phases/42-automation-shipment-status-event/42-01-SUMMARY.md
+@.paul/phases/26-manual-tracking-number/26-01-SUMMARY.md
+@.paul/phases/27-shipment-tracking-backend/27-01-SUMMARY.md
+
+## Source Files
+@src/Modules/Shipments/ShipmentController.php
+@src/Modules/Shipments/ShipmentPackageRepository.php
+@src/Modules/Automation/AutomationController.php
+@src/Modules/Automation/AutomationService.php
+@src/Modules/Cron/CronHandlerFactory.php
+@resources/views/automation/form.php
+@public/assets/js/modules/automation-form.js
+@resources/views/automation/index.php
+
+
+
+## Required Skills (from SPECIAL-FLOWS.md)
+
+| Skill | Priority | When to Invoke | Loaded? |
+|-------|----------|----------------|---------|
+| `sonar-scanner` | required | Po APPLY, przed UNIFY | o |
+| /feature-dev | optional | Przed wdrazaniem nowej funkcjonalnosci | o |
+| /code-review | optional | Po APPLY, przed UNIFY | o |
+
+**BLOCKING:** Required skills MUST be loaded before APPLY proceeds.
+
+## Skill Invocation Checklist
+- [ ] `sonar-scanner` uruchomiony po APPLY
+- [ ] /feature-dev (opcjonalnie)
+- [ ] /code-review (opcjonalnie)
+
+
+
+
+
+## AC-1: Event "Utworzenie przesylki" uruchamia sie natychmiast po sukcesie utworzenia
+```gherkin
+Given istnieje aktywna regula automatyzacji z eventem `shipment.created`
+When uzytkownik utworzy przesylke dla zamowienia (provider API lub recznie)
+Then system wywola AutomationService trigger w tym samym flow requestu
+And nie wymaga to oczekiwania na cron `shipment_tracking_sync`
+```
+
+## AC-2: Nowa akcja "Zmiana statusu przesylki" jest konfigurowalna i walidowana
+```gherkin
+Given uzytkownik tworzy/edytuje regule automatyzacji
+When dodaje akcje "Zmiana statusu przesylki"
+Then moze wskazac docelowy status przesylki z dozwolonej listy
+And zapis nie przechodzi dla nieprawidlowej konfiguracji akcji
+```
+
+## AC-3: Akcja poprawnie aktualizuje status przesylki i nie powoduje petli
+```gherkin
+Given regula uruchamia akcje `update_shipment_status`
+When akcja jest wykonana dla zamowienia z paczka
+Then status paczki zostaje zaktualizowany tylko przy realnej zmianie
+And system nie wchodzi w nieskonczone petle triggerow automatyzacji
+```
+
+## AC-4: UI i dokumentacja sa spjne z nowymi elementami automatyzacji
+```gherkin
+Given wdrozenie nowego eventu i akcji
+When uzytkownik otworzy formularz automatyzacji
+Then widzi event "Utworzenie przesylki" i akcje "Zmiana statusu przesylki"
+And ARCHITECTURE/TECH_CHANGELOG/todo opisuja zakres i ograniczenia implementacji
+```
+
+
+
+
+
+
+ Task 1: Dodaj event `shipment.created` i natychmiastowy trigger po utworzeniu przesylki
+ src/Modules/Automation/AutomationController.php, src/Modules/Shipments/ShipmentController.php, src/Modules/Automation/AutomationService.php
+
+ Rozszerz ALLOWED_EVENTS i etykiety UI o `shipment.created` ("Utworzenie przesylki").
+ W `ShipmentController::create()` i `ShipmentController::createManual()` po potwierdzonym utworzeniu paczki wywolaj `AutomationService->trigger('shipment.created', orderId, context)`.
+ Context powinien zawierac co najmniej: package_id, provider, tracking_number (jezeli dostepny), package_status.
+ Unikaj triggera w sciezkach bledu tworzenia przesylki.
+
+ rg -n "shipment\.created|trigger\('shipment\.created'|Utworzenie przesylki" src/Modules/Automation src/Modules/Shipments resources/views/automation
+ AC-1 satisfied: event jest dostepny i odpalany od razu po utworzeniu przesylki.
+
+
+
+ Task 2: Dodaj akcje `update_shipment_status` i wykonanie backend
+ src/Modules/Automation/AutomationController.php, src/Modules/Automation/AutomationService.php, src/Modules/Shipments/ShipmentPackageRepository.php, src/Modules/Cron/CronHandlerFactory.php
+
+ Dodaj nowy typ akcji do walidacji i parsera konfiguracji: `update_shipment_status`.
+ Konfiguracja akcji: docelowy status dostawy (`delivery_status`) z tej samej mapy statusow biznesowych co warunki shipment_status.
+ W `AutomationService` dodaj handler akcji, ktory wyszukuje docelowa paczke (z context package_id lub fallback: najnowsza aktywna paczka zamowienia) i wykonuje aktualizacje statusu tylko przy realnej zmianie.
+ Dodaj zabezpieczenie anty-petla: nie emituj kolejnego eventu przy braku zmiany; przy zmianie oznacz context zrodla automatyzacji i respektuj chain dedup.
+ Zaktualizuj factory DI, by serwis automatyzacji mial dostep do repo paczek.
+
+ rg -n "update_shipment_status|handleUpdateShipmentStatus|delivery_status|ALLOWED_ACTION_TYPES" src/Modules/Automation src/Modules/Shipments src/Modules/Cron
+ AC-2 satisfied i AC-3 satisfied: akcja jest walidowana, wykonuje realna zmiane i nie petli sie.
+
+
+
+ Task 3: Rozszerz formularz automatyzacji oraz dokumentacje techniczna
+ resources/views/automation/form.php, public/assets/js/modules/automation-form.js, resources/views/automation/index.php, DOCS/ARCHITECTURE.md, DOCS/TECH_CHANGELOG.md, DOCS/todo.md
+
+ Dodaj opcje akcji "Zmiana statusu przesylki" do formularza oraz dynamiczny config (wybor statusu).
+ Zapewnij zgodnosc renderu create/edit i JS add-row.
+ Zaktualizuj dokumentacje: nowy event natychmiastowy i nowa akcja, z opisem kontekstu oraz ograniczen.
+ Dodaj/uzupelnij wpis w `DOCS/todo.md` dla nowego zakresu (zamkniecie po wdrozeniu).
+
+ rg -n "shipment\.created|Zmiana statusu przesylki|update_shipment_status" resources/views/automation public/assets/js/modules/automation-form.js DOCS/ARCHITECTURE.md DOCS/TECH_CHANGELOG.md DOCS/todo.md
+ AC-4 satisfied: UI i dokumentacja sa spjne z wdrozonym zakresem.
+
+
+
+ Nowy natychmiastowy event `shipment.created` oraz nowa akcja automatyzacji `update_shipment_status`.
+
+ 1. Otworz: Ustawienia > Zadania automatyczne > Dodaj zadanie.
+ 2. Sprawdz event "Utworzenie przesylki" i akcje "Zmiana statusu przesylki".
+ 3. Utworz regule: event `shipment.created`, warunek integracji, akcja zmiany statusu przesylki.
+ 4. Utworz przesylke z poziomu zamowienia i potwierdz, ze regula wykonala sie od razu (bez cron).
+ 5. Potwierdz, ze ponowne odpalenie bez realnej zmiany statusu nie generuje petli.
+
+ Type "approved" to continue, or describe issues to fix
+
+
+
+
+
+
+## DO NOT CHANGE
+- `database/migrations/*` (brak zmian schematu w tej fazie)
+- Logika eventu `receipt.created` i istniejace akcje poza wymaganym rozszerzeniem
+- Moduly niezwiazane z automatyzacja i przesylkami
+
+## SCOPE LIMITS
+- Tylko nowe zdarzenie i nowa akcja w module automatyzacji.
+- Bez przebudowy calego silnika cron/tracking.
+- Bez zmian UX poza formularzem i listowaniem automatyzacji.
+
+
+
+
+Before declaring plan complete:
+- [ ] `C:\xampp\php\php.exe -l src/Modules/Automation/AutomationController.php`
+- [ ] `C:\xampp\php\php.exe -l src/Modules/Automation/AutomationService.php`
+- [ ] `C:\xampp\php\php.exe -l src/Modules/Shipments/ShipmentController.php`
+- [ ] `C:\xampp\php\php.exe -l src/Modules/Shipments/ShipmentPackageRepository.php`
+- [ ] `C:\xampp\php\php.exe -l src/Modules/Cron/CronHandlerFactory.php`
+- [ ] `C:\xampp\php\php.exe -l resources/views/automation/form.php`
+- [ ] `C:\xampp\php\php.exe -l resources/views/automation/index.php`
+- [ ] Manual checkpoint wykonany (event dziala od razu + akcja statusu)
+- [ ] Dokumentacja zaktualizowana (`DOCS/ARCHITECTURE.md`, `DOCS/TECH_CHANGELOG.md`, `DOCS/todo.md`)
+- [ ] All acceptance criteria met
+
+
+
+- Event `shipment.created` uruchamia automatyzacje natychmiast po utworzeniu przesylki.
+- Akcja `update_shipment_status` jest dostepna, walidowana i dziala przewidywalnie.
+- Brak petli automatyzacji przy ponownych wywolaniach bez zmiany statusu.
+- Dokumentacja techniczna odzwierciedla nowy kontrakt event/action.
+
+
+
diff --git a/.paul/phases/47-shipment-created-automation/47-01-SUMMARY.md b/.paul/phases/47-shipment-created-automation/47-01-SUMMARY.md
new file mode 100644
index 0000000..9bc280b
--- /dev/null
+++ b/.paul/phases/47-shipment-created-automation/47-01-SUMMARY.md
@@ -0,0 +1,51 @@
+---
+phase: 47-shipment-created-automation
+plan: 01
+status: completed
+completed: 2026-03-28
+---
+
+# Phase 47 Plan 01 Summary
+
+## Result
+- Dodano nowe zdarzenie automatyzacji `shipment.created` (UI: `Utworzenie przesylki`).
+- Trigger `shipment.created` jest uruchamiany od razu po sukcesie tworzenia przesylki:
+ - `ShipmentController::create()` (provider API),
+ - `ShipmentController::createManual()` (reczny numer przesylki).
+- Dodano nowy typ akcji automatyzacji `update_shipment_status` (UI: `Zmiana statusu przesylki`).
+- `AutomationService` wykonuje aktualizacje `delivery_status` tylko przy realnej zmianie, zapisuje activity log i emituje `shipment.status_changed` z kontekstem zmiany.
+
+## Acceptance Criteria
+- AC-1: Pass
+- AC-2: Pass
+- AC-3: Pass
+- AC-4: Pass
+
+## Verification
+- `C:\xampp\php\php.exe -l src/Modules/Automation/AutomationController.php` PASS
+- `C:\xampp\php\php.exe -l src/Modules/Automation/AutomationService.php` PASS
+- `C:\xampp\php\php.exe -l src/Modules/Shipments/ShipmentController.php` PASS
+- `C:\xampp\php\php.exe -l src/Modules/Shipments/ShipmentPackageRepository.php` PASS
+- `C:\xampp\php\php.exe -l src/Modules/Cron/CronHandlerFactory.php` PASS
+- `C:\xampp\php\php.exe -l routes/web.php` PASS
+- `C:\xampp\php\php.exe -l resources/views/automation/form.php` PASS
+- `C:\xampp\php\php.exe -l resources/views/automation/index.php` PASS
+- `rg -n "shipment\.created|update_shipment_status|shipment_status_key|automation_shipment_status_updated" src resources public routes` PASS
+- `sonar-scanner` PASS (analysis successful): https://sonar.project-pro.pl/dashboard?id=orderPRO
+
+## Manual Checkpoint
+- UAT checkpoint wykonany i zatwierdzony przez uzytkownika (`approved`).
+
+## Files
+- `src/Modules/Automation/AutomationController.php`
+- `src/Modules/Automation/AutomationService.php`
+- `src/Modules/Cron/CronHandlerFactory.php`
+- `src/Modules/Shipments/ShipmentController.php`
+- `src/Modules/Shipments/ShipmentPackageRepository.php`
+- `routes/web.php`
+- `resources/views/automation/form.php`
+- `resources/views/automation/index.php`
+- `public/assets/js/modules/automation-form.js`
+- `DOCS/ARCHITECTURE.md`
+- `DOCS/TECH_CHANGELOG.md`
+- `DOCS/todo.md`
diff --git a/DOCS/ARCHITECTURE.md b/DOCS/ARCHITECTURE.md
index c56195c..34f1c80 100644
--- a/DOCS/ARCHITECTURE.md
+++ b/DOCS/ARCHITECTURE.md
@@ -5,8 +5,9 @@
- UI korzysta z globalnego standardu naglowkow sekcji (`h2/h3/h4.section-title`) definiowanego centralnie w `resources/scss/app.scss` i buildowanego do `public/assets/css/app.css`.
- Kolory akcji UI (przyciski `btn--primary` i warianty `btn--outline-primary`) sa odseparowane od koloru naglowkow (`section-title`) przez dedykowane tokeny `--c-action-primary` i `--c-action-primary-dark` w `resources/scss/shared/_ui-components.scss`.
- Import Allegro zapisuje log `import` z kontekstem triggera (`manual_import`, `orders_sync`, `status_sync`) i deduplikuje powtarzalne wpisy bez realnej zmiany.
-- Automatyzacja obsluguje zdarzenie `shipment.status_changed` i warunek `shipment_status` oparty o statusy biznesowe.
+- Automatyzacja obsluguje zdarzenia `shipment.created` (natychmiast po utworzeniu paczki) i `shipment.status_changed` (po realnej zmianie statusu dostawy), oraz warunek `shipment_status` oparty o statusy biznesowe.
- Automatyzacja obsluguje akcje `issue_receipt` (Wystaw paragon) z parametrami: `receipt_config_id`, `issue_date_mode`, `duplicate_policy`.
+- Automatyzacja obsluguje akcje `update_shipment_status` (Zmiana statusu przesylki) z parametrem `status_key` mapowanym na techniczny `delivery_status`.
- Orkiestracja automatyzacji obsluguje chain events: akcja moze emitowac kolejne zdarzenie (`emitEvent`), a engine propaguje wspolny kontekst lancucha.
- Zabezpieczenia chain automation (dla obecnych i przyszlych eventow):
- limit glebokosci lancucha (`MAX_CHAIN_DEPTH`),
@@ -157,7 +158,7 @@
- `App\Modules\Accounting\AccountingController` (index — lista paragonow, export — XLSX)
- `App\Modules\Automation\AutomationController` (index, create, store, edit, update, destroy, toggleStatus)
- `App\Modules\Automation\AutomationRepository` (findAll, findById, create, update, delete, toggleActive, findActiveByEvent)
-- `App\Modules\Automation\AutomationService` (trigger, evaluateConditions, executeActions — watcher/executor regul automatyzacji; flow: ReceiptController::store() -> trigger('receipt.created') oraz ShipmentTrackingHandler::handle() -> trigger('shipment.status_changed', context) -> ewaluacja warunkow -> EmailSendingService::send() / auto issue_receipt)
+- `App\Modules\Automation\AutomationService` (trigger, evaluateConditions, executeActions — watcher/executor regul automatyzacji; flow: ReceiptController::store() -> trigger('receipt.created'), ShipmentController::create()/createManual() -> trigger('shipment.created', context), ShipmentTrackingHandler::handle() -> trigger('shipment.status_changed', context) -> ewaluacja warunkow -> akcje: EmailSendingService::send() / auto issue_receipt / update_shipment_status)
- `App\Modules\Shipments\ShipmentProviderInterface`
- `App\Modules\Shipments\ShipmentProviderRegistry`
- `App\Modules\Shipments\ApaczkaShipmentService`
@@ -319,6 +320,7 @@
- `POST /orders/{id}/shipment/create`:
- `ShipmentController::create(Request): Response`,
- wybiera providera dynamicznie po `provider_code` i deleguje do `ShipmentProviderInterface::createShipment(...)`,
+ - po sukcesie tworzenia paczki triggeruje automatyzacje `shipment.created` z kontekstem paczki (`package_id`, `provider`, `tracking_number`, `package_status`, `delivery_status`),
- dla `apaczka` waliduje wymagane punkty odbioru/nadania wg definicji uslugi (`service_structure`) i przy bledzie wyceny zwraca rozszerzona diagnostyke parametrow,
- `apaczka` uzupelnia i wysyla `contact_person` dla nadawcy (z `Ustawienia > Dane firmy`) i odbiorcy (fallback z danych zamowienia),
- `apaczka` ustawia jawnie `pickup.type` (`SELF`/`COURIER`) na podstawie uslugi i obecnosci `sender_point_id`; dla `COURIER` dopelnia tez `pickup.date`, `pickup.hours_from`, `pickup.hours_to`,
@@ -336,6 +338,7 @@
- tworzy rekord w `shipment_packages` z `provider='manual'`, `status='created'` i podanym `tracking_number`,
- opcjonalnie zapisuje nazwe przewoznika w `carrier_id`,
- loguje zdarzenie `shipment_manual` w `order_activity_log`,
+ - po sukcesie triggeruje automatyzacje `shipment.created` dla recznie dodanej paczki,
- `ShipmentPackageRepository::createManual(int $orderId, string $trackingNumber, ?string $carrierName): int`.
## Przeplyw Ustawienia > Integracje > Allegro
@@ -403,7 +406,13 @@
- uruchamiany z crona (`allegro_status_sync`),
- respektuje ustawienie kierunku `allegro_status_sync_direction`,
- dla kierunku `allegro_to_orderpro` wykorzystuje mechanizm importu zamowien do aktualizacji statusow,
- - dla kierunku `orderpro_to_allegro` zwraca wynik informacyjny (tryb przygotowany pod kolejny etap).
+ - dla kierunku `orderpro_to_allegro` pushuje reczne zmiany statusow (`order_status_history.change_source=manual`) do API Allegro,
+ - push buduje reverse mapping `orderpro_status_code -> allegro_status_code` z `allegro_order_status_mappings`,
+ - push aktualizuje kursor `integration_order_sync_state.last_status_pushed_at` po sukcesie.
+- `AllegroApiClient::updateCheckoutFormFulfillment()`:
+ - PUT `/order/checkout-forms/{id}/fulfillment`,
+ - body JSON: `{"status":""}`,
+ - uzywane przez `AllegroStatusSyncService` w kierunku `orderpro_to_allegro`.
## Log aktywnosci zamowien
- Tabela `order_activity_log` rejestruje wszystkie zdarzenia dotyczace zamowienia.
@@ -539,4 +548,3 @@
- laduje formy dostawy wykryte w zamowieniach danej instancji (`orders.source=shoppro` + `orders.integration_id`),
- laduje uslugi dostawy z Allegro API (`delivery-services`) z fallbackiem na odswiezenie tokenu OAuth,
- zapisuje mapowanie: forma dostawy shopPRO -> usluga Allegro/InPost WZA.
-
diff --git a/DOCS/TECH_CHANGELOG.md b/DOCS/TECH_CHANGELOG.md
index a77e46c..5f2bcd3 100644
--- a/DOCS/TECH_CHANGELOG.md
+++ b/DOCS/TECH_CHANGELOG.md
@@ -1,5 +1,40 @@
# Tech Changelog
+## 2026-03-28 (Phase 47 - Shipment Creation Automation, Plan 01)
+- Automatyzacja:
+ - dodano nowe zdarzenie `shipment.created` (UI: `Utworzenie przesylki`),
+ - trigger jest uruchamiany natychmiast po sukcesie `ShipmentController::create()` oraz `ShipmentController::createManual()`,
+ - kontekst triggera zawiera m.in. `package_id`, `provider`, `tracking_number`, `package_status`, `delivery_status`.
+- Dodano nowy typ akcji automatyzacji `update_shipment_status` (UI: `Zmiana statusu przesylki`):
+ - walidacja konfiguracji przez `AutomationController` (`shipment_status_key` -> `status_key`),
+ - wykonanie przez `AutomationService::handleUpdateShipmentStatus(...)`,
+ - aktualizacja `delivery_status` tylko przy realnej zmianie (bez falszywych triggerow),
+ - po zmianie statusu emitowane jest `shipment.status_changed` z kontekstem zmiany.
+- Rozszerzono `AutomationService` o zaleznosc `ShipmentPackageRepository`:
+ - nowa metoda pomocnicza `ShipmentPackageRepository::findLatestByOrderId(int): ?array` (fallback wyboru paczki dla akcji).
+- UI automatyzacji (`resources/views/automation/form.php`, `resources/views/automation/index.php`, `public/assets/js/modules/automation-form.js`) rozszerzono o:
+ - event `Utworzenie przesylki`,
+ - akcje `Zmiana statusu przesylki` z wyborem docelowego statusu biznesowego.
+- Aktualizacja DI:
+ - `routes/web.php` i `src/Modules/Cron/CronHandlerFactory.php` przekazuja `ShipmentPackageRepository` do `AutomationService`,
+ - `ShipmentController` otrzymuje `AutomationService` jako zaleznosc konstruktora.
+
+## 2026-03-28 (Allegro Status Push - orderPRO -> Allegro)
+- Zaimplementowano kierunek synchronizacji statusow `orderpro_to_allegro` w `AllegroStatusSyncService`.
+- `AllegroStatusSyncService`:
+ - pobiera reczne zmiany statusow (`order_status_history.change_source=manual`) dla zamowien Allegro,
+ - buduje reverse mapping (`orderpro_status_code -> allegro_status_code`) na podstawie `allegro_order_status_mappings`,
+ - pushuje statusy do API Allegro i raportuje `pushed/skipped/failed`,
+ - aktualizuje kursor `integration_order_sync_state.last_status_pushed_at`.
+- Nowa metoda `AllegroApiClient::updateCheckoutFormFulfillment()`:
+ - PUT `/order/checkout-forms/{id}/fulfillment`,
+ - body JSON: `{"status":""}`.
+- `AllegroOrderSyncStateRepository`: dodano obsluge kursora push (`getLastStatusPushedAt`, `updateLastStatusPushedAt`).
+- `AllegroStatusMappingRepository`: dodano reverse map builder `buildOrderproToAllegroMap()`.
+- UI `Ustawienia > Integracje > Allegro > Ustawienia`:
+ - odblokowano wybor opcji `orderPRO -> Allegro` (usunieto `disabled` i dopisek `(wkrotce)`),
+ - zaktualizowano opis hintu kierunku synchronizacji.
+- Dodano testy jednostkowe `tests/Unit/AllegroStatusSyncServiceTest.php` dla scenariuszy push/skip/fail/retry-401.
## 2026-03-27 (ShopPRO Status Push — orderPRO -> shopPRO)
- Zaimplementowano kierunek synchronizacji statusow `orderpro_to_shoppro` w `ShopproStatusSyncService`.
- Nowa metoda `ShopproApiClient::updateOrderStatus()` — PUT `/api.php?endpoint=orders&action=change_status&id={id}`.
@@ -702,3 +737,5 @@
+
+
diff --git a/DOCS/todo.md b/DOCS/todo.md
index 3ab5cdf..72e2e3a 100644
--- a/DOCS/todo.md
+++ b/DOCS/todo.md
@@ -1,4 +1,4 @@
-15. [x] W tym miejscu odwróć kolejność: najpierw źródło potem ID,
f6079660-1af8-11f1-a7c9-231cf6ef29d1allegro
+15. [x] W tym miejscu odwróć kolejność: najpierw źródło potem ID,
f6079660-1af8-11f1-a7c9-231cf6ef29d1allegro
17. [x] Na liście zamówien jak jest źródło i id zamówienia to zamiast shopPRO musi pisać która integracja konkretnie. Oraz dodajemy napis ID: ...D
## SonarQube — post plany 02-02 i 02-03 (skan 2026-03-13)
@@ -10,7 +10,7 @@
## SonarQube — code quality (327 issues, skan 2026-03-12)
18. [] php:S112 (95x) — zastąpić generic `new \Exception` konkretnymi klasami wyjątków
-19. [] php:S1142 (57x) — zredukować liczbę `return` w metodach (early return → wydzielić metody)
+19. [] php:S1142 (57x) — zredukować liczbę `return` w metodach (early return › wydzielić metody)
20. [] php:S1192 (40x) — wyciągnąć powtarzające się string literals do stałych
21. [] php:S3776 (31x) — obniżyć złożoność kognitywną metod (wydzielić logikę do pomocniczych metod)
22. [] Web:S6827 (15x) — dodać brakujące atrybuty `alt` na tagach ``
@@ -37,3 +37,192 @@
41. [x] Jaki jest sens tylu logów z importu allegro np w tym zamówieniu https://orderpro.projectpro.pl/orders/29, skąd taka ilość, co jest pobierane i sprawdzane?
42. [x] Nowy zdarzenie w zadaniach automatyczny -> zmiana statusu przesyłki, oraz nowe waruneki dla zdarzenia "zmiana statusu przesyłki": przesyłka zarejestrowana, przesyłka do odbioru, przesyłka nadana w punkcie, przesyłka odebrana, przesyłka anulowana, przesyłka nieodebrana, przesyłka odebrana (zwrot), chyba że takich statusów się nie da to trzeba sprawdzić jakie się da.
43. [x] Usuwanie wpisu z kolejki druku etykiet
+
+## SonarQube — pełna lista błędów (new code period, skan 2026-03-28)
+
+
+- Źródło: SonarQube API `issues/search` dla `orderPRO` (`inNewCodePeriod=true`)
+- Razem issue: 174
+- Severity: MAJOR=110, CRITICAL=47, MINOR=16, BLOCKER=1
+- Typy: CODE_SMELL=170, BUG=3, VULNERABILITY=1
+
+### Lista issue
+- [ ] [MINOR][BUG][php:S2003] resources/views/accounting/index.php:31 - Replace "require" with "require_once". (key: 6fe7d2de-4802-459e-a5a7-f9f1be183b8e)
+- [ ] [MINOR][BUG][php:S2003] resources/views/orders/show.php:780 - Replace "require" with "require_once". (key: 98cef6cd-bb23-4bc8-acd9-01d4417f25e6)
+- [ ] [MINOR][CODE_SMELL][Web:S6827] resources/views/layouts/app.php:80 - Anchors must have content and the content must be accessible by a screen reader. (key: 64d29d8b-146d-4a20-803d-4aeb035b0391)
+- [ ] [MINOR][CODE_SMELL][Web:S6827] resources/views/orders/receipt-create.php:123 - Anchors must have content and the content must be accessible by a screen reader. (key: bbd01366-d6f2-4745-b5b2-8b06c3aec574)
+- [ ] [MINOR][CODE_SMELL][Web:S6827] resources/views/orders/show.php:669 - Anchors must have content and the content must be accessible by a screen reader. (key: 351a396c-239c-468d-a1bf-391adabd1b0a)
+- [ ] [MINOR][CODE_SMELL][Web:S6827] resources/views/receipts/show.php:19 - Anchors must have content and the content must be accessible by a screen reader. (key: cb8922ca-ccc4-4518-9466-e9c40d0aec4b)
+- [ ] [MINOR][CODE_SMELL][Web:S6827] resources/views/receipts/show.php:20 - Anchors must have content and the content must be accessible by a screen reader. (key: 29dd7510-9b95-4f90-9f47-0cf39d6318f2)
+- [ ] [MINOR][CODE_SMELL][Web:S6827] resources/views/receipts/show.php:21 - Anchors must have content and the content must be accessible by a screen reader. (key: 15deb0d4-dae8-4ede-b371-969ed668e0b7)
+- [ ] [MINOR][CODE_SMELL][Web:S6827] resources/views/settings/accounting.php:50 - Anchors must have content and the content must be accessible by a screen reader. (key: cffe0ae9-1c3f-4e5b-99d9-3dd6d528252b)
+- [ ] [MINOR][CODE_SMELL][Web:S6827] resources/views/settings/accounting.php:133 - Anchors must have content and the content must be accessible by a screen reader. (key: 816ae9c0-c782-406f-a3b4-d6d810119ebd)
+- [ ] [MINOR][CODE_SMELL][Web:S6827] resources/views/settings/delivery-status-mappings.php:24 - Anchors must have content and the content must be accessible by a screen reader. (key: a6e860d2-54dd-485b-82db-79415b2d4cb7)
+- [ ] [MINOR][CODE_SMELL][Web:S6827] resources/views/settings/printing.php:138 - Anchors must have content and the content must be accessible by a screen reader. (key: 43949459-6186-48cf-b099-36064429e0dc)
+- [ ] [MINOR][CODE_SMELL][php:S1488] src/Modules/Accounting/ReceiptRepository.php:139 - Immediately return this expression instead of assigning it to the temporary variable "$number". (key: 4cf8b055-d030-4fe5-b917-c4eae64c2e4d)
+- [ ] [MINOR][CODE_SMELL][php:S1481] src/Modules/Settings/EmailTemplateController.php:91 - Remove this unused "$t" local variable. (key: 5e00928d-3bfa-40cb-82e3-f6d1886f8b09)
+- [ ] [MINOR][CODE_SMELL][php:S1481] src/Modules/Settings/ShopproIntegrationsController.php:118 - Remove this unused "$redirectBase" local variable. (key: 22a0c0d1-5edf-4a80-8e42-dcab51ec880b)
+- [ ] [MINOR][CODE_SMELL][php:S1481] src/Modules/Settings/ShopproIntegrationsController.php:185 - Remove this unused "$redirectBase" local variable. (key: 2d95f5c7-5f6b-4e60-a48e-59fe991831f3)
+- [ ] [MAJOR][CODE_SMELL][php:S4833] resources/views/accounting/index.php:31 - Replace "require" with namespace import mechanism through the "use" keyword. (key: 349e8aeb-dc6d-4ac9-9c7e-f9b4cab594aa)
+- [ ] [MAJOR][CODE_SMELL][php:S3358] resources/views/automation/form.php:6 - Extract this nested ternary operation into an independent statement. (key: d9b92d37-73d9-4d70-804a-bde593b3253f)
+- [ ] [MAJOR][CODE_SMELL][php:S3358] resources/views/automation/form.php:7 - Extract this nested ternary operation into an independent statement. (key: 21a944af-e4fe-427a-9b30-4fedfb9f2211)
+- [ ] [MAJOR][CODE_SMELL][php:S3358] resources/views/automation/form.php:64 - Extract this nested ternary operation into an independent statement. (key: e253095f-e15e-468a-ac77-e143109b17fc)
+- [ ] [MAJOR][CODE_SMELL][Web:S6819] resources/views/automation/index.php:21 - Use