feat(47-shipment-created-automation): immediate shipment automation trigger

Phase 47 complete:

- add event shipment.created triggered immediately after shipment creation

- add action update_shipment_status with real-change guard and chain-safe emit

- update automation UI/options, docs, and PAUL state artifacts
This commit is contained in:
2026-03-28 13:24:20 +01:00
parent d3f4bdaecd
commit ad9087d5e4
17 changed files with 784 additions and 310 deletions

View File

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

View File

@@ -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
<details>
<summary>v1.9 Shipment Automation Immediate Trigger - 2026-03-28 (1 phase, 1 plan)</summary>
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/`
</details>
<details>
<summary>v1.8 Allegro Status Push - 2026-03-28 (1 phase, 1 plan)</summary>
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/`
</details>
<details>
<summary>v1.7 ShopPRO Status Push - 2026-03-27 (1 phase, 1 plan)</summary>
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
</details>
<details>
<summary>v1.6 Quick Status Change - 2026-03-27 (1 phase, 1 plan)</summary>
@@ -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*

View File

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

View File

@@ -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
---
<objective>
## 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.
</objective>
<context>
## 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
</context>
<skills>
## 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)
</skills>
<acceptance_criteria>
## 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 spójne 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
```
</acceptance_criteria>
<tasks>
<task type="auto">
<name>Task 1: Dodaj event `shipment.created` i natychmiastowy trigger po utworzeniu przesylki</name>
<files>src/Modules/Automation/AutomationController.php, src/Modules/Shipments/ShipmentController.php, src/Modules/Automation/AutomationService.php</files>
<action>
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.
</action>
<verify>rg -n "shipment\.created|trigger\('shipment\.created'|Utworzenie przesylki" src/Modules/Automation src/Modules/Shipments resources/views/automation</verify>
<done>AC-1 satisfied: event jest dostepny i odpalany od razu po utworzeniu przesylki.</done>
</task>
<task type="auto">
<name>Task 2: Dodaj akcje `update_shipment_status` i wykonanie backend</name>
<files>src/Modules/Automation/AutomationController.php, src/Modules/Automation/AutomationService.php, src/Modules/Shipments/ShipmentPackageRepository.php, src/Modules/Cron/CronHandlerFactory.php</files>
<action>
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.
</action>
<verify>rg -n "update_shipment_status|handleUpdateShipmentStatus|delivery_status|ALLOWED_ACTION_TYPES" src/Modules/Automation src/Modules/Shipments src/Modules/Cron</verify>
<done>AC-2 satisfied i AC-3 satisfied: akcja jest walidowana, wykonuje realna zmiane i nie petli sie.</done>
</task>
<task type="auto">
<name>Task 3: Rozszerz formularz automatyzacji oraz dokumentacje techniczna</name>
<files>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</files>
<action>
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).
</action>
<verify>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</verify>
<done>AC-4 satisfied: UI i dokumentacja sa spójne z wdrozonym zakresem.</done>
</task>
<task type="checkpoint:human-verify" gate="blocking">
<what-built>Nowy natychmiastowy event `shipment.created` oraz nowa akcja automatyzacji `update_shipment_status`.</what-built>
<how-to-verify>
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.
</how-to-verify>
<resume-signal>Type "approved" to continue, or describe issues to fix</resume-signal>
</task>
</tasks>
<boundaries>
## 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.
</boundaries>
<verification>
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
</verification>
<success_criteria>
- 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.
</success_criteria>
<output>
After completion, create `.paul/phases/47-shipment-created-automation/47-01-SUMMARY.md`
</output>

View File

@@ -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`