feat(30-button-primary-color): separate CTA color from section headings

Phase 30 complete:\n- split semantic tokens for actions vs informational headings\n- update primary/outline button styles and rebuild CSS assets\n- update TODO/docs and close PAUL loop with SUMMARY
This commit is contained in:
2026-03-25 21:59:37 +01:00
parent f592203b60
commit 9cbe0a89f0
12 changed files with 623 additions and 3372 deletions

View File

@@ -1,60 +1,62 @@
# orderPRO
# orderPRO
## What This Is
Aplikacja do zarządzania zamówieniami pobieranymi z wielu źródeł sprzedaży (Allegro, Erli, własne sklepy internetowe). Umożliwia generowanie etykiet przewozowych u kurierów oraz docelowo zarządzanie produktami i stanami magazynowymi w jednym miejscu.
Aplikacja do zarządzania zamówieniami pobieranymi z wielu źródeŠsprzedaży (Allegro, Erli, własne sklepy internetowe). Umożliwia generowanie etykiet przewozowych u kurierów oraz docelowo zarządzanie produktami i stanami magazynowymi w jednym miejscu.
## 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.
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 State
| Attribute | Value |
|-----------|-------|
| Version | 1.0.0 |
| Status | v1.0 Complete |
| Last Updated | 2026-03-22 |
| Status | v1.4 Complete |
| Last Updated | 2026-03-25 |
## Requirements
### Validated (Shipped)
- [x] Integracja z Allegro pobieranie zamówień
- [x] Integracja z Allegro — pobieranie zamówień
- [x] Generowanie etykiet (InPost)
- [x] Performance: N+1 subqueries fix, DB indexes Phase 7
- [x] Stability: SSL verification, cron throttle Phase 7
- [x] UX: orderpro-to-allegro disable, lista zamówień poprawki Phase 7
- [x] Unit tests: AllegroTokenManager, AllegroOrderImportService (12 testów) Phase 7
- [x] InPost ShipX API: natywny provider niezależny od Allegro Phase 7
- [x] DB Foundation: tabele receipts, receipt_configs, receipt_number_counters + company_settings extended Phase 8
- [x] Konfiguracja paragonów (CRUD w Ustawienia > Księgowość) — Phase 9
- [x] Wystawianie paragonów z zamówienia (formularz, snapshoty, atomowe numerowanie) Phase 10
- [x] Podgląd i wydruk paragonu (HTML+PDF, dompdf) Phase 11
- [x] Sekcja Księgowość — lista paragonów z filtrami, paginacją, eksportem XLSX Phase 12
- [x] DB Foundation: tabele email_mailboxes, email_templates, email_logs Phase 13
- [x] Skrzynki pocztowe SMTP (CRUD + test połączenia) Phase 13
- [x] Szablony wiadomości e-mail (CRUD + Quill.js + system zmiennych + załączniki) Phase 14
- [x] Wysyłka e-mail z zamówień (resolwer zmiennych, załączniki, log) Phase 15
- [x] Zadania automatyczne reguły zdarzenie/warunki/akcje (CRUD + watcher/executor) Phase 16
- [x] Ostrzeżenie i potwierdzenie przy duplikacie paragonu Phase 17
- [x] Print Queue Backend: REST API + API key auth + CRUD kluczy Phase 18
- [x] UI Integration: przycisk Drukuj, bulk print, kolejka wydruku Phase 19
- [x] Windows Client: C# WinForms tray app, polling API, druk etykiet PDF Phase 20
- [x] Wyświetlanie nazwy integracji zamiast generycznego "shopPRO" na liście i szczegółach zamówienia Phase 21
- [x] Naprawa zapisu REGON, BDO, KRS i logo w ustawieniach firmy Phase 22
- [x] Presety przesyłek customowe przyciski szybkiego wypełniania formularza (CRUD + autofill + zarządzanie) Phase 23-25
- [x] Ręczny numer przesyłki dodawanie tracking number bez API przewoźnika Phase 26
- [x] Tracking backend dwupoziomowe statusy dostawy, 3 implementacje providerów, cron handler Phase 27
- [x] Performance: N+1 subqueries fix, DB indexes — Phase 7
- [x] Stability: SSL verification, cron throttle — Phase 7
- [x] UX: orderpro-to-allegro disable, lista zamówień poprawki — Phase 7
- [x] Unit tests: AllegroTokenManager, AllegroOrderImportService (12 testów) — Phase 7
- [x] InPost ShipX API: natywny provider niezależny od Allegro — Phase 7
- [x] DB Foundation: tabele receipts, receipt_configs, receipt_number_counters + company_settings extended — Phase 8
- [x] Konfiguracja paragonów (CRUD w Ustawienia > Księgowość) — Phase 9
- [x] Wystawianie paragonów z zamówienia (formularz, snapshoty, atomowe numerowanie) — Phase 10
- [x] Podgląd i wydruk paragonu (HTML+PDF, dompdf) — Phase 11
- [x] Sekcja Księgowość — lista paragonów z filtrami, paginacją, eksportem XLSX — Phase 12
- [x] DB Foundation: tabele email_mailboxes, email_templates, email_logs — Phase 13
- [x] Skrzynki pocztowe SMTP (CRUD + test połączenia) — Phase 13
- [x] Szablony wiadomości e-mail (CRUD + Quill.js + system zmiennych + załączniki) — Phase 14
- [x] Wysyłka e-mail z zamówień (resolwer zmiennych, załączniki, log) — Phase 15
- [x] Zadania automatyczne — reguły zdarzenie/warunki/akcje (CRUD + watcher/executor) — Phase 16
- [x] Ostrzeżenie i potwierdzenie przy duplikacie paragonu — Phase 17
- [x] Print Queue Backend: REST API + API key auth + CRUD kluczy — Phase 18
- [x] UI Integration: przycisk Drukuj, bulk print, kolejka wydruku — Phase 19
- [x] Windows Client: C# WinForms tray app, polling API, druk etykiet PDF — Phase 20
- [x] Wyświetlanie nazwy integracji zamiast generycznego "shopPRO" na liście i szczegółach zamówienia — Phase 21
- [x] Naprawa zapisu REGON, BDO, KRS i logo w ustawieniach firmy — Phase 22
- [x] Presety przesyłek — customowe przyciski szybkiego wypełniania formularza (CRUD + autofill + zarządzanie) — Phase 23-25
- [x] Ręczny numer przesyłki — dodawanie tracking number bez API przewoźnika — Phase 26
- [x] Tracking backend — dwupoziomowe statusy dostawy, 3 implementacje providerów, cron handler — Phase 27
- [x] Tracking UI i ustawienia crona — statusy dostawy i konfiguracja harmonogramu — Phase 28-29
- [x] UI readability tweak - rozdzielenie koloru przyciskow akcji od naglowkow sekcji (button primary distinction) - Phase 30
### Active (In Progress)
- [ ] Śledzenie przesyłek UI — wyświetlanie statusów, ustawienia crona — Phase 28
- [ ] Brak aktywnych zadan - gotowe na nowy milestone
### Planned (Next)
- [ ] Zarządzanie produktami
- [ ] Zarządzanie stanami magazynowymi
- [ ] ZarzÄ…dzanie produktami
- [ ] ZarzÄ…dzanie stanami magazynowymi
### Out of Scope
@@ -62,28 +64,28 @@ Sprzedawca może obsługiwać zamówienia ze wszystkich kanałów sprzedaży i n
## Target Users
**Primary:** Sprzedawcy wielokanałowi (Allegro, Erli, własny sklep)
- Obsługują zamówienia z wielu platform jednocześnie
- Potrzebują szybkiego nadawania przesyłek
- Chcą jednego miejsca do zarządzania sprzedażą
**Primary:** Sprzedawcy wielokanałowi (Allegro, Erli, własny sklep)
- Obsługują zamówienia z wielu platform jednocześnie
- Potrzebują szybkiego nadawania przesyłek
- ChcÄ… jednego miejsca do zarzÄ…dzania sprzedaĹĽÄ…
## Context
**Business Context:**
Rynek narzędzi do zarządzania sprzedażą wielokanałową (podobne rozwiązania: base.com, apilo.com). Aplikacja budowana jako własne rozwiązanie.
Rynek narzÄ™dzi do zarzÄ…dzania sprzedaĹĽÄ… wielokanaĹowÄ… (podobne rozwiÄ…zania: base.com, apilo.com). Aplikacja budowana jako wĹ‚asne rozwiÄ…zanie.
**Technical Context:**
PHP (XAMPP/Laravel), integracje z API marketplace'ów (Allegro, Erli) oraz API przewoźników (InPost i inne).
PHP (XAMPP/Laravel), integracje z API marketplace'Ăłw (Allegro, Erli) oraz API przewoĹşnikĂłw (InPost i inne).
## Constraints
### Technical Constraints
- PHP/XAMPP — środowisko Windows lokalne
- PHP/XAMPP — środowisko Windows lokalne
- Medoo + prepared statements (bez sklejania SQL)
- Brak natywnych `alert()`/`confirm()` — używać `window.OrderProAlerts`
- Metody pomocnicze string/date/color `App\Core\Support\StringHelper` (nie powielać w klasach)
- Zarządzanie tokenami OAuth Allegro `App\Modules\Settings\AllegroTokenManager`
- Kompozycja obiektów crona `App\Modules\Cron\CronHandlerFactory` (jedyne miejsce `new AllegroIntegrationRepository` i in. w kontekście crona)
- Brak natywnych `alert()`/`confirm()` — używać `window.OrderProAlerts`
- Metody pomocnicze string/date/color → `App\Core\Support\StringHelper` (nie powielać w klasach)
- Zarządzanie tokenami OAuth Allegro → `App\Modules\Settings\AllegroTokenManager`
- Kompozycja obiektów crona → `App\Modules\Cron\CronHandlerFactory` (jedyne miejsce `new AllegroIntegrationRepository` i in. w kontekście crona)
- Pole CSRF w formularzach HTTP: zawsze `_token` (nie `_csrf_token`)
### Business Constraints
@@ -93,30 +95,30 @@ PHP (XAMPP/Laravel), integracje z API marketplace'ów (Allegro, Erli) oraz API p
| Decision | Rationale | Date | Status |
|----------|-----------|------|--------|
| Własne rozwiązanie zamiast gotowego SaaS | Pełna kontrola nad funkcjonalnością | 2026-03-12 | Active |
| AllegroTokenManager wydzielony z 4 klas OAuth | Eliminacja duplikacji logiki odświeżania tokenów | 2026-03-12 | Active |
| StringHelper jako final static class w Core/Support | Centralizacja 19 kopii helperów string/date/color z 15+ klas | 2026-03-12 | Active |
| CronHandlerFactory jako jedyne miejsce kompozycji crona | Application.php i bin/cron.php były rozsynchronizowane 2 bugi w bin/cron.php | 2026-03-13 | Active |
| Pole CSRF w formularzach: `_token` (nie `_csrf_token`) | Standardyzacja na nazwę używaną przez większość kodu (10+ kontrolerów); eliminacja ryzyka pomyłki przy nowych formularzach | 2026-03-13 | Active |
| Flash messages: Flash::set('module.type') / Flash::get('module.type', '') | Jeden wzorzec w całej aplikacji; eliminacja bezpośrednich zapisów $_SESSION | 2026-03-13 | Active |
| validateXxxInput(): ?string i validateXxxAccess(): ?Response jako wzorce helperów walidacji | Redukcja return statements do 3; spójny wzorzec kontrolerów | 2026-03-13 | Active |
| God class split via move-method bez zmiany logiki | ShopproOrdersSyncService 399 metod; AllegroIntegrationController 35→25 — czysty podział przez ekstrakcję klas | 2026-03-13 | Active |
| AllegroIntegrationController pozostaje przy 25 metodach (nie 15) | Pełny podział wymaga AllegroImportScheduleService poza zakresem v0.1 | 2026-03-13 | Active |
| dg/bypass-finals do testów final classes | Wszystkie klasy final mockowanie przez bypass-finals zamiast usuwania final | 2026-03-15 | Active |
| InPost ShipX API zamiast Allegro WZA remap | InpostIntegrationRepository jest pod ShipX; niezależność od Allegro | 2026-03-15 | Active |
| vendor/ w ftp-kr ignore | Auto-upload dev deps na serwer powodował Fatal Error | 2026-03-15 | Active |
| Snapshot pattern: seller/buyer/items jako JSON w receipts | Dane zamrożone w momencie wystawienia niezależne od przyszłych zmian źródła | 2026-03-15 | Active |
| Atomowe numerowanie paragonów: INSERT ON DUPLICATE KEY UPDATE | Bezpieczne generowanie kolejnych numerów bez race conditions | 2026-03-15 | Active |
| 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 |
| WĹ‚asne rozwiÄ…zanie zamiast gotowego SaaS | PeĹ‚na kontrola nad funkcjonalnoĹciÄ… | 2026-03-12 | Active |
| AllegroTokenManager wydzielony z 4 klas OAuth | Eliminacja duplikacji logiki odświeżania tokenów | 2026-03-12 | Active |
| StringHelper jako final static class w Core/Support | Centralizacja 19 kopii helperĂłw string/date/color z 15+ klas | 2026-03-12 | Active |
| CronHandlerFactory jako jedyne miejsce kompozycji crona | Application.php i bin/cron.php były rozsynchronizowane — 2 bugi w bin/cron.php | 2026-03-13 | Active |
| Pole CSRF w formularzach: `_token` (nie `_csrf_token`) | Standardyzacja na nazwę używaną przez większość kodu (10+ kontrolerów); eliminacja ryzyka pomyłki przy nowych formularzach | 2026-03-13 | Active |
| Flash messages: Flash::set('module.type') / Flash::get('module.type', '') | Jeden wzorzec w całej aplikacji; eliminacja bezpośrednich zapisów $_SESSION | 2026-03-13 | Active |
| validateXxxInput(): ?string i validateXxxAccess(): ?Response jako wzorce helperów walidacji | Redukcja return statements do ≤3; spójny wzorzec kontrolerów | 2026-03-13 | Active |
| God class split via move-method bez zmiany logiki | ShopproOrdersSyncService 39→9 metod; AllegroIntegrationController 35â†25 — czysty podziaĹ‚ przez ekstrakcjÄ™ klas | 2026-03-13 | Active |
| AllegroIntegrationController pozostaje przy 25 metodach (nie ≤15) | Pełny podział wymaga AllegroImportScheduleService — poza zakresem v0.1 | 2026-03-13 | Active |
| dg/bypass-finals do testów final classes | Wszystkie klasy final — mockowanie przez bypass-finals zamiast usuwania final | 2026-03-15 | Active |
| InPost ShipX API zamiast Allegro WZA remap | InpostIntegrationRepository jest pod ShipX; niezaleĹĽnoĹć od Allegro | 2026-03-15 | Active |
| vendor/ w ftp-kr ignore | Auto-upload dev deps na serwer powodował Fatal Error | 2026-03-15 | Active |
| Snapshot pattern: seller/buyer/items jako JSON w receipts | Dane zamroĹĽone w momencie wystawienia — niezaleĹĽne od przyszĹ‚ych zmian ĹşrĂłdĹa | 2026-03-15 | Active |
| Atomowe numerowanie paragonĂłw: INSERT ON DUPLICATE KEY UPDATE | Bezpieczne generowanie kolejnych numerĂłw bez race conditions | 2026-03-15 | Active |
| 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 |
## Success Metrics
| Metric | Target | Current | Status |
|--------|--------|---------|--------|
| Liczba zintegrowanych źródeł zamówień | 3 | 2 (Allegro, Erli) | In progress |
| Generowanie etykiet | Działa | InPost | In progress |
| Liczba zintegrowanych źródeŠzamówień | ≥3 | 2 (Allegro, Erli) | In progress |
| Generowanie etykiet | Działa | InPost | In progress |
## Tech Stack
@@ -126,7 +128,7 @@ PHP (XAMPP/Laravel), integracje z API marketplace'ów (Allegro, Erli) oraz API p
| Frontend | HTML/CSS/JS + SCSS | jQuery Alerts module |
| Database | MySQL (Medoo) | Prepared statements |
| Auth | Sesje PHP | |
| Integracje | Allegro API, Erli API | Przewoźnicy: InPost (ShipX), Apaczka |
| Integracje | Allegro API, Erli API | PrzewoĹşnicy: InPost (ShipX), Apaczka |
| Testing | PHPUnit 11.5 + dg/bypass-finals | Unit tests w tests/Unit/ |
## Specialized Flows
@@ -134,11 +136,12 @@ PHP (XAMPP/Laravel), integracje z API marketplace'ów (Allegro, Erli) oraz API p
See: .paul/SPECIAL-FLOWS.md
Quick Reference:
- /feature-dev Nowe funkcjonalności i integracje (optional)
- /code-review Przegląd kodu przed UNIFY (optional)
- /frontend-design Komponenty UI i widoki (optional)
- /simplify Refaktoryzacja po implementacji (optional)
- /feature-dev → Nowe funkcjonalności i integracje (optional)
- /code-review → Przegląd kodu przed UNIFY (optional)
- /frontend-design → Komponenty UI i widoki (optional)
- /simplify → Refaktoryzacja po implementacji (optional)
---
*PROJECT.md Updated when requirements or context change*
*Last updated: 2026-03-23 after Phase 26 (Manual Tracking Number complete)*
*PROJECT.md — Updated when requirements or context change*
*Last updated: 2026-03-25 after Phase 30 (Button Primary Color Distinction complete)*

View File

@@ -1,19 +1,32 @@
# Roadmap: orderPRO
# Roadmap: orderPRO
## Overview
orderPRO to narzędzie do wielokanałowego zarządzania sprzedażą. Projekt przechodzi od podstawowych integracji z marketplace'ami i generowania etykiet, przez rozbudowę o nowe źródła zamówień i przewoźników, aż do pełnego zarządzania produktami i stanami magazynowymi.
orderPRO to narzÄ™dzie do wielokanaĹ‚owego zarzÄ…dzania sprzedaĹĽÄ…. Projekt przechodzi od podstawowych integracji z marketplace'ami i generowania etykiet, przez rozbudowÄ™ o nowe ĹşrĂłdĹa zamĂłwieĹ„ i przewoĹşnikĂłw, aĹĽ do peĹ‚nego zarzÄ…dzania produktami i stanami magazynowymi.
## Current Milestone
None ready for next milestone.
None - ready for next milestone.
## Completed Milestones
<details>
<summary>v1.3 Konfiguracja śledzenia przesyłek — 2026-03-23 (1 phase, 1 plan)</summary>
<summary>v1.4 UI Readability Tweaks - 2026-03-25 (1 phase, 1 plan)</summary>
Konfiguracja mapowania statusów dostawy z API przewoźników na znormalizowane statusy widoczne w aplikacji. Użytkownik może dostosować tłumaczenia i przypisania statusów bez zmian w kodzie.
Rozdzielenie semantyki kolorow UI: glowny kolor przyciskow akcji zostal oddzielony od koloru naglowkow sekcji, aby poprawic czytelnosc i szybkosc skanowania interfejsu.
| Phase | Name | Plans | Completed |
|-------|------|-------|-----------|
| 30 | Button Primary Color Distinction | 1/1 | 2026-03-25 |
Archive: `.paul/phases/30-button-primary-color/`
</details>
<details>
<summary>v1.3 Konfiguracja Ĺledzenia przesyĹek — 2026-03-23 (1 phase, 1 plan)</summary>
Konfiguracja mapowania statusĂłw dostawy z API przewoĹşnikĂłw na znormalizowane statusy widoczne w aplikacji. UĹĽytkownik moĹĽe dostosować tĹumaczenia i przypisania statusĂłw bez zmian w kodzie.
| Phase | Name | Plans | Completed |
|-------|------|-------|-----------|
@@ -24,9 +37,9 @@ Archive: `.paul/phases/29-delivery-status-mapping-ui/`
</details>
<details>
<summary>v1.2 Śledzenie przesyłek 2026-03-23 (2 phases, 2 plans)</summary>
<summary>v1.2 Śledzenie przesyłek — 2026-03-23 (2 phases, 2 plans)</summary>
Automatyczne śledzenie statusu dostawy przesyłek przez API przewoźników (InPost ShipX, Apaczka, Allegro WZA). Cykliczne odpytywanie przez cron z konfigurowalnym interwałem. Dwupoziomowy system statusów: znormalizowany + surowy z API. Badge'e w UI, linki śledzenia, ustawienia interwału.
Automatyczne śledzenie statusu dostawy przesyłek przez API przewoźników (InPost ShipX, Apaczka, Allegro WZA). Cykliczne odpytywanie przez cron z konfigurowalnym interwałem. Dwupoziomowy system statusów: znormalizowany + surowy z API. Badge'e w UI, linki śledzenia, ustawienia interwału.
| Phase | Name | Plans | Completed |
|-------|------|-------|-----------|
@@ -38,9 +51,9 @@ Archive: `.paul/phases/27-shipment-tracking-backend/`, `.paul/phases/28-shipment
</details>
<details>
<summary>v1.1 Ręczny numer przesyłki 2026-03-23 (1 phase, 1 plan)</summary>
<summary>v1.1 Ręczny numer przesyłki — 2026-03-23 (1 phase, 1 plan)</summary>
Możliwość ręcznego dodania numeru śledzenia przesyłki do zamówienia (bez tworzenia przesyłki przez API przewoźnika).
Możliwość ręcznego dodania numeru śledzenia przesyłki do zamówienia (bez tworzenia przesyłki przez API przewoźnika).
| Phase | Name | Plans | Completed |
|-------|------|-------|-----------|
@@ -51,9 +64,9 @@ Archive: `.paul/phases/26-manual-tracking-number/`
</details>
<details>
<summary>v1.0 Presety przesyłek 2026-03-22 (3 phases, 3 plans)</summary>
<summary>v1.0 Presety przesyłek — 2026-03-22 (3 phases, 3 plans)</summary>
Customowe przyciski szybkiego wypełniania formularza przygotowania przesyłki. Presety globalne z nazwą i kolorem tworzenie, autofill, edycja, usuwanie.
Customowe przyciski szybkiego wypełniania formularza przygotowania przesyłki. Presety globalne z nazwą i kolorem — tworzenie, autofill, edycja, usuwanie.
| Phase | Name | Plans | Completed |
|-------|------|-------|-----------|
@@ -66,9 +79,9 @@ Archive: `.paul/phases/23-shipment-presets-backend/`, `.paul/phases/24-shipment-
</details>
<details>
<summary>v0.9 Poprawki ustawień firmy 2026-03-22 (1 phase, 1 plan)</summary>
<summary>v0.9 Poprawki ustawień firmy — 2026-03-22 (1 phase, 1 plan)</summary>
Naprawa buga: pola REGON, BDO, KRS i logo nie zapisywały się w ustawieniach firmy (kontroler nie przekazywał ich do repozytorium).
Naprawa buga: pola REGON, BDO, KRS i logo nie zapisywały się w ustawieniach firmy (kontroler nie przekazywał ich do repozytorium).
| Phase | Name | Plans | Completed |
|-------|------|-------|-----------|
@@ -79,9 +92,9 @@ Archive: `.paul/phases/22-regon-save-fix/`
</details>
<details>
<summary>v0.8 Poprawki wyświetlania źródła zamówień — 2026-03-22 (1 phase, 1 plan)</summary>
<summary>v0.8 Poprawki wyĹ›wietlania ĹşrĂłdĹa zamĂłwieĹ„ — 2026-03-22 (1 phase, 1 plan)</summary>
Na liście zamówień i stronie szczegółów: wyświetlanie nazwy konkretnej integracji (z tabeli `integrations`) zamiast generycznego "shopPRO". Korekta kolejności source/ID.
Na liście zamówień i stronie szczegółów: wyświetlanie nazwy konkretnej integracji (z tabeli `integrations`) zamiast generycznego "shopPRO". Korekta kolejności source/ID.
| Phase | Name | Plans | Completed |
|-------|------|-------|-----------|
@@ -92,9 +105,9 @@ Archive: `.paul/phases/21-order-source-display/`
</details>
<details>
<summary>v0.7 Zdalne drukowanie etykiet 2026-03-22 (3 phases, 3 plans)</summary>
<summary>v0.7 Zdalne drukowanie etykiet — 2026-03-22 (3 phases, 3 plans)</summary>
System zdalnego drukowania etykiet przesyłek na drukarce termicznej. Aplikacja Windows w system tray odpytuje API orderPRO, pobiera zlecenia i drukuje etykiety A6.
System zdalnego drukowania etykiet przesyłek na drukarce termicznej. Aplikacja Windows w system tray odpytuje API orderPRO, pobiera zlecenia i drukuje etykiety A6.
| Phase | Name | Plans | Completed |
|-------|------|-------|-----------|
@@ -107,7 +120,7 @@ Archive: `.paul/phases/18-print-queue-backend/`, `.paul/phases/19-ui-integration
</details>
<details>
<summary>v0.6 Poprawki UX 2026-03-22 (1 phase, 1 plan)</summary>
<summary>v0.6 Poprawki UX — 2026-03-22 (1 phase, 1 plan)</summary>
| Phase | Name | Plans | Completed |
|-------|------|-------|-----------|
@@ -120,7 +133,19 @@ Archive: `.paul/phases/17-receipt-duplicate-guard/`
## Completed Milestones
<details>
<summary>v0.5 Moduł Automatyzacji — 2026-03-18 (1 phase, 2 plans)</summary>
<summary>v1.4 UI Readability Tweaks - 2026-03-25 (1 phase, 1 plan)</summary>
Rozdzielenie semantyki kolorow UI: glowny kolor przyciskow akcji zostal oddzielony od koloru naglowkow sekcji, aby poprawic czytelnosc i szybkosc skanowania interfejsu.
| Phase | Name | Plans | Completed |
|-------|------|-------|-----------|
| 30 | Button Primary Color Distinction | 1/1 | 2026-03-25 |
Archive: .paul/phases/30-button-primary-color/
</details>
<details>
<summary>v0.5 ModuŠAutomatyzacji — 2026-03-18 (1 phase, 2 plans)</summary>
| Phase | Name | Plans | Completed |
|-------|------|-------|-----------|
@@ -131,35 +156,35 @@ Archive: `.paul/phases/16-automated-tasks/`
</details>
<details>
<summary>v0.4 Moduł E-mail 2026-03-17 (3 phases, 4 plans)</summary>
<summary>v0.4 Moduł E-mail — 2026-03-17 (3 phases, 4 plans)</summary>
| Phase | Name | Plans | Completed |
|-------|------|-------|-----------|
| 13 | DB + Skrzynki pocztowe | 1/1 | 2026-03-17 |
| 14 | Szablony wiadomości | 2/2 | 2026-03-17 |
| 15 | Wysyłka e-mail z zamówień | 1/1 | 2026-03-17 |
| 14 | Szablony wiadomości | 2/2 | 2026-03-17 |
| 15 | Wysyłka e-mail z zamówień | 1/1 | 2026-03-17 |
Archive: `.paul/milestones/v0.4-ROADMAP.md`
</details>
<details>
<summary>v0.3 Moduł Paragonów — 2026-03-15 (5 phases, 5 plans)</summary>
<summary>v0.3 Moduł Paragonów — 2026-03-15 (5 phases, 5 plans)</summary>
| Phase | Name | Plans | Completed |
|-------|------|-------|-----------|
| 8 | DB Foundation + Company Settings | 1/1 | 2026-03-15 |
| 9 | Konfiguracja paragonów (Ustawienia) | 1/1 | 2026-03-15 |
| 10 | Wystawianie paragonów z zamówienia | 1/1 | 2026-03-15 |
| 11 | Podgląd i wydruk paragonu (HTML+PDF) | 1/1 | 2026-03-15 |
| 12 | Sekcja Księgowość — lista + eksport XLSX | 1/1 | 2026-03-15 |
| 9 | Konfiguracja paragonĂłw (Ustawienia) | 1/1 | 2026-03-15 |
| 10 | Wystawianie paragonĂłw z zamĂłwienia | 1/1 | 2026-03-15 |
| 11 | PodglÄ…d i wydruk paragonu (HTML+PDF) | 1/1 | 2026-03-15 |
| 12 | Sekcja Księgowość — lista + eksport XLSX | 1/1 | 2026-03-15 |
Archive: `.paul/milestones/v0.3-ROADMAP.md`
</details>
<details>
<summary>v0.2 Pre-Expansion Fixes 2026-03-15 (1 phase, 5 plans)</summary>
<summary>v0.2 Pre-Expansion Fixes — 2026-03-15 (1 phase, 5 plans)</summary>
| Phase | Name | Plans | Completed |
|-------|------|-------|-----------|
@@ -168,8 +193,8 @@ Archive: `.paul/milestones/v0.3-ROADMAP.md`
Plans:
- 07-01: Performance (N+1 subqueries, DB indexes, information_schema cache)
- 07-02: Stability (SSL verification, cron throttle DB, migration 000014b)
- 07-03: UX (orderpro_to_allegro disable, lista zamówień fixes)
- 07-04: Tests (AllegroTokenManager + AllegroOrderImportService 12 testów)
- 07-03: UX (orderpro_to_allegro disable, lista zamówień fixes)
- 07-04: Tests (AllegroTokenManager + AllegroOrderImportService — 12 testów)
- 07-05: InPost ShipmentProviderInterface (natywne ShipX API)
Archive: `.paul/phases/07-pre-expansion-fixes/`
@@ -177,7 +202,7 @@ Archive: `.paul/phases/07-pre-expansion-fixes/`
</details>
<details>
<summary>v0.1 Initial Release 2026-03-13 (6 phases, 15 plans)</summary>
<summary>v0.1 Initial Release — 2026-03-13 (6 phases, 15 plans)</summary>
| Phase | Name | Plans | Completed |
|-------|------|-------|-----------|
@@ -194,4 +219,7 @@ Archive: `.paul/milestones/v0.1-ROADMAP.md`
---
*Roadmap created: 2026-03-12*
*Last updated: 2026-03-23 — v1.3 milestone complete*
*Last updated: 2026-03-25 - v1.4 milestone complete*

View File

@@ -1,245 +1,248 @@
# Project State
# Project State
## Project Reference
See: .paul/PROJECT.md (updated 2026-03-12)
**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.3 complete ready for next milestone
**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.4 complete - ready for next milestone
## Current Position
Milestone: v1.3 complete
Phase: [1] of [1] (Delivery Status Mapping UI) Complete
Plan: 29-01 complete
Status: Milestone v1.3 complete ready for next milestone
Last activity: 2026-03-23 — Phase 29 transition complete, v1.3 done
Milestone: v1.4 complete
Phase: [1] of [1] (Button Primary Color Distinction) - Complete
Plan: 30-01 complete
Status: Milestone v1.4 complete - ready for next milestone
Last activity: 2026-03-25 22:05 - Unified .paul/phases/30-button-primary-color/30-01-SUMMARY.md
Progress:
- v0.1 Initial Release: [██████████] 100%
- v0.2 Pre-Expansion Fixes: [██████████] 100%
- v0.3 Moduł Paragonów: [██████████] 100%
- v0.4 Moduł E-mail: [██████████] 100%
- v0.5 Moduł Automatyzacji: [██████████] 100%
- v0.6 Poprawki UX: [██████████] 100%
- v0.7 Zdalne drukowanie etykiet: [██████████] 100%
- v0.8 Poprawki źródła zamówień: [██████████] 100%
- v0.9 Poprawki ustawień firmy: [██████████] 100%
- v1.0 Presety przesyłek: [██████████] 100%
- v1.1 Ręczny numer przesyłki: [██████████] 100%
- v1.2 Śledzenie przesyłek: [██████████] 100%
- Phase 27: [██████████] 100% (1/1 plans)
- Phase 28: [██████████] 100% (1/1 plans)
- v1.3 Konfiguracja śledzenia przesyłek: [██████████] 100%
- Phase 29: [██████████] 100% (1/1 plans)
- 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)
## Loop Position
Current loop state:
```
PLAN ──▶ APPLY ──▶ UNIFY
[Loop complete]
PLAN --> APPLY --> UNIFY
done done done [Loop complete - ready for next PLAN]
```
## Accumulated Context
### Decisions
| Data | Decyzja | Faza | Wpływ |
| Data | Decyzja | Faza | Wpływ |
|------|---------|------|-------|
| 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-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-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-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 | 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 |
| 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 |
### Skill Audit (Faza 29, Plan 01)
| Oczekiwany | Wywołany | Uwagi |
| 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) |
| 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 |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | | 0 nowych unikalnych issues; 1x S1448 CronRepository (22 metod, pre-existing pattern) |
| sonar-scanner | âś“ | 0 nowych unikalnych issues; 1x S1448 CronRepository (22 metod, pre-existing pattern) |
### Skill Audit (Faza 27, Plan 01)
| Oczekiwany | Wywołany | Uwagi |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | | 0 nowych unikalnych issues; 3 pre-existing patterns (2x S1192 DeliveryStatus, 1x S1172 handler) |
| 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 |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | | 0 nowych issues; 8 pre-existing na ShipmentController (S3776, S1192, S1142, S3358) |
| sonar-scanner | âś“ | 0 nowych issues; 8 pre-existing na ShipmentController (S3776, S1192, S1142, S3358) |
### Skill Audit (Faza 25, Plan 01)
| Oczekiwany | Wywołany | Uwagi |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | | 0 nowych issues na zmienionych plikach |
| sonar-scanner | âś“ | 0 nowych issues na zmienionych plikach |
### Skill Audit (Faza 24, Plan 01)
| Oczekiwany | Wywołany | Uwagi |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | | 0 nowych issues na zmienionych plikach |
| sonar-scanner | âś“ | 0 nowych issues na zmienionych plikach |
### Skill Audit (Faza 23, Plan 01)
| Oczekiwany | Wywołany | Uwagi |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | | 0 issues na nowych plikach |
| sonar-scanner | âś“ | 0 issues na nowych plikach |
### Skill Audit (Faza 22, Plan 01)
| Oczekiwany | Wywołany | Uwagi |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | | 0 nowych issues na zmienionym pliku; 1 pre-existing S1172 |
| sonar-scanner | âś“ | 0 nowych issues na zmienionym pliku; 1 pre-existing S1172 |
### Skill Audit (Faza 21, Plan 01)
| Oczekiwany | Wywołany | Uwagi |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | | 0 nowych issues na zmienionych plikach; 18 pre-existing |
| sonar-scanner | âś“ | 0 nowych issues na zmienionych plikach; 18 pre-existing |
### Skill Audit (Faza 20, Plan 01)
| Oczekiwany | Wywołany | Uwagi |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | n/a | Projekt C# poza zakresem skanera PHP |
| sonar-scanner | n/a | Projekt C# — poza zakresem skanera PHP |
### Skill Audit (Faza 19, Plan 01)
| Oczekiwany | Wywołany | Uwagi |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | | 0 nowych blocker/critical; 4 minor/major zalogowane w DOCS/todo.md |
| sonar-scanner | âś“ | 0 nowych blocker/critical; 4 minor/major zalogowane w DOCS/todo.md |
### Skill Audit (Faza 18, Plan 01)
| Oczekiwany | Wywołany | Uwagi |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | | Required do uruchomienia przed kolejnym UNIFY |
| sonar-scanner | ○ | Required — do uruchomienia przed kolejnym UNIFY |
### Skill Audit (Faza 17, Plan 01)
| Oczekiwany | Wywołany | Uwagi |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | | 0 nowych issues na zmienionych plikach |
| sonar-scanner | âś“ | 0 nowych issues na zmienionych plikach |
### Skill Audit (Faza 15, Plan 01)
| Oczekiwany | Wywołany | Uwagi |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | | Required do uruchomienia przed kolejnym milestone |
| sonar-scanner | ○ | Required — do uruchomienia przed kolejnym milestone |
### Skill Audit (Faza 14, Plan 02)
| Oczekiwany | Wywołany | Uwagi |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | | Required do uruchomienia przed kolejnym UNIFY |
| sonar-scanner | ○ | Required — do uruchomienia przed kolejnym UNIFY |
### Skill Audit (Faza 13, Plan 01)
| Oczekiwany | Wywołany | Uwagi |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | | Required do uruchomienia przed kolejnym UNIFY |
| sonar-scanner | ○ | Required — do uruchomienia przed kolejnym UNIFY |
### Skill Audit (Faza 12, Plan 01)
| Oczekiwany | Wywołany | Uwagi |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | | Required do uruchomienia przed kolejnym UNIFY |
| sonar-scanner | ○ | Required — do uruchomienia przed kolejnym UNIFY |
### Skill Audit (Faza 11, Plan 01)
| Oczekiwany | Wywołany | Uwagi |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | | Required do uruchomienia przed kolejnym UNIFY |
| sonar-scanner | ○ | Required — do uruchomienia przed kolejnym UNIFY |
### Skill Audit (Faza 10, Plan 01)
| Oczekiwany | Wywołany | Uwagi |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | | Required do uruchomienia przed kolejnym UNIFY |
| sonar-scanner | ○ | Required — do uruchomienia przed kolejnym UNIFY |
### Skill Audit (Faza 07, Plan 05)
| Oczekiwany | Wywołany | Uwagi |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | | Zainstalowany (v4.3.5) ale nie uruchomiony w tym planie |
| sonar-scanner | â—‹ | Zainstalowany (v4.3.5) ale nie uruchomiony w tym planie |
### Skill Audit (Faza 07, Plan 04)
| Oczekiwany | Wywołany | Uwagi |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | | Pominięto brak instalacji w PATH |
| sonar-scanner | ○ | Pominięto — brak instalacji w PATH |
### Skill Audit (Faza 07, Plan 03)
| Oczekiwany | Wywołany | Uwagi |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | | Pominięto brak instalacji w PATH |
| sonar-scanner | ○ | Pominięto — brak instalacji w PATH |
### Skill Audit (Faza 07, Plan 02)
| Oczekiwany | Wywołany | Uwagi |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | | Pominięto brak instalacji w PATH |
| sonar-scanner | ○ | Pominięto — brak instalacji w PATH |
### Skill Audit (Faza 07, Plan 01)
| Oczekiwany | Wywołany | Uwagi |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | | Pominięto brak instalacji w PATH |
| sonar-scanner | ○ | Pominięto — brak instalacji w PATH |
### Skill Audit (Faza 06, Plan 06)
| Oczekiwany | Wywołany | Uwagi |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | | Pominięto brak instalacji w PATH |
| sonar-scanner | ○ | Pominięto — brak instalacji w PATH |
### Skill Audit (Faza 06, Plan 02)
| Oczekiwany | Wywołany | Uwagi |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | | Pominięto brak instalacji w PATH; S1142 violations powinny spaść o ~12-15 po uruchomieniu |
| 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 |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | | Pominięto uruchomić ręcznie przed następnym planem z kodem PHP |
| sonar-scanner | ○ | Pominięto — uruchomić ręcznie przed następnym planem z kodem PHP |
### Skill Audit (Faza 04, Plan 01)
| Oczekiwany | Wywołany | Uwagi |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | | Pominięto plan czysto dokumentacyjny (komentarze SQL, brak nowego kodu PHP); uruchomić przy kolejnym planie z kodem |
| 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 |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| sonar-scanner | | Pominięto przejście do UNIFY bez skanowania; uruchomić przy kolejnym planie |
| sonar-scanner | ○ | Pominięto — przejście do UNIFY bez skanowania; uruchomić przy kolejnym planie |
### Skill Audit (Faza 02, Plan 01)
| Oczekiwany | Wywołany | Uwagi |
| Oczekiwany | Wywołany | Uwagi |
|------------|---------|-------|
| /code-review | | Pominięto jednolinijkowa naprawa oczywistego dead code |
| sonar-scanner | | Pominięto brak nowego kodu, zmiana kosmetyczna |
| /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 |
| 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 |
| /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.
- **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: pending feat(29-delivery-status-mapping-ui)
Last commit: pending — feat(29-delivery-status-mapping-ui)
Branch: main
Feature branches merged: none
@@ -248,13 +251,15 @@ Brak.
## Session Continuity
Last session: 2026-03-23
Stopped at: v1.3 milestone complete
Next action: /paul:discuss-milestone ustalić zakres v1.4
Last session: 2026-03-25 22:05
Stopped at: v1.4 milestone complete
Next action: /paul:discuss-milestone - ustalic zakres kolejnego milestone
Resume file: .paul/ROADMAP.md
Resume context:
- v0.1v1.3: COMPLETE ✓ (29 phases, 41 plans)
- v0.1-v1.4: COMPLETE done (30 phases, 42 plans)
- Ready for next milestone
---
*STATE.md Updated after every significant action*
*STATE.md — Updated after every significant action*

View File

@@ -0,0 +1,163 @@
---
phase: 30-button-primary-color
plan: 01
type: execute
wave: 1
depends_on: []
files_modified:
- resources/scss/shared/_ui-components.scss
- resources/scss/modules/_printing.scss
- public/assets/css/app.css
- DOCS/ARCHITECTURE.md
- DOCS/TECH_CHANGELOG.md
- DOCS/todo.md
autonomous: true
---
<objective>
## Goal
Zaplanowac wdrozenie zmiany z `DOCS/todo.md` pkt 39: glowny kolor przyciskow ma zostac zmieniony z niebieskiego na inny, aby nie mylil sie wizualnie z naglowkami sekcji.
## Purpose
Poprawa czytelnosci interfejsu i szybsze rozroznianie elementow akcji (przyciski) od elementow informacyjnych (naglowki `section-title`).
## Output
Gotowa implementacja nowego koloru akcji w warstwie SCSS (bez inline CSS), przebudowany `public/assets/css/app.css`, oraz aktualizacja dokumentacji technicznej i statusu punktu 39 na liscie TODO.
</objective>
<context>
## Project Context
@.paul/PROJECT.md
@.paul/ROADMAP.md
@.paul/STATE.md
@DOCS/todo.md
@DOCS/ARCHITECTURE.md
@DOCS/DB_SCHEMA.md
## Source Files
@resources/scss/shared/_ui-components.scss
@resources/scss/modules/_printing.scss
@resources/scss/app.scss
@public/assets/css/app.css
</context>
<skills>
## Required Skills (from SPECIAL-FLOWS.md)
| Skill | Priority | When to Invoke | Loaded? |
|-------|----------|----------------|---------|
| `sonar-scanner` | required | Po APPLY, przed UNIFY | done |
| /frontend-design | optional | Przy finalnym dopracowaniu kontrastu i czytelnosci UI | pending |
| /code-review | optional | Po implementacji, przed UNIFY | pending |
**BLOCKING:** Required skills MUST be loaded before APPLY proceeds.
Run each skill command or confirm already loaded.
## Skill Invocation Checklist
- [x] `sonar-scanner` uruchomiony po APPLY
- [ ] /frontend-design (opcjonalnie) jesli potrzebna korekta kontrastu
- [ ] /code-review (opcjonalnie) przed UNIFY
</skills>
<acceptance_criteria>
## AC-1: Rozdzielenie kolorow naglowkow i przyciskow
```gherkin
Given interfejs korzysta z globalnych tokenow kolorow
When widok renderuje `section-title` oraz `btn btn--primary`
Then glowny przycisk nie uzywa niebieskiego koloru bazowego naglowkow i jest latwo odroznialny wizualnie
```
## AC-2: Spojne stany przyciskow akcji
```gherkin
Given przyciski glownych akcji (`.btn--primary` i `.btn--outline-primary`)
When uzytkownik wejdzie w hover/focus
Then wszystkie stany korzystaja z nowej palety akcji i zachowuja czytelnosc
```
## AC-3: Zmiana wdrozona zgodnie ze standardem projektu
```gherkin
Given standard frontendowy orderPRO
When zmiana zostanie zakonczona
Then style sa utrzymane w plikach SCSS, assets sa zbudowane do `public/assets/css/app.css`, a dokumentacja i TODO sa zaktualizowane
```
</acceptance_criteria>
<tasks>
<task type="auto">
<name>Task 1: Wydzielenie palety kolorow dla akcji (buttons)</name>
<files>resources/scss/shared/_ui-components.scss</files>
<action>
Wprowadz oddzielne tokeny kolorystyczne dla przyciskow akcji (np. `--c-action-primary`, `--c-action-primary-dark`, opcjonalny token focus-ring),
pozostawiajac `--c-primary` dla elementow informacyjnych (naglowki/linki), aby nie mieszac semantyki.
Podlacz nowe tokeny do `.btn--primary` oraz focusa przyciskow.
Unikaj zmian w HTML/PHP - zakres to warstwa stylow.
</action>
<verify>rg -n "c-action-primary|btn--primary|focus-ring" resources/scss/shared/_ui-components.scss</verify>
<done>AC-1 satisfied: primary button nie korzysta juz z tej samej niebieskiej bazy co `section-title`.</done>
</task>
<task type="auto">
<name>Task 2: Ujednolicenie wariantow przyciskow zaleznych od primary</name>
<files>resources/scss/modules/_printing.scss, resources/scss/shared/_ui-components.scss</files>
<action>
Zaktualizuj miejsca, ktore semantycznie reprezentuja glowna akcje, aby korzystaly z nowej palety akcji
(w szczegolnosci `.btn--outline-primary` i pokrewne stany), bez zmiany logiki UI.
Zachowaj kompaktowosc interfejsu i aktualne rozmiary komponentow.
</action>
<verify>rg -n "btn--outline-primary|c-primary|c-action-primary" resources/scss/modules/_printing.scss resources/scss/shared/_ui-components.scss</verify>
<done>AC-2 satisfied: stany hover/focus dla przyciskow sa spojne i oparte o nowy kolor akcji.</done>
</task>
<task type="auto">
<name>Task 3: Build assets i aktualizacja dokumentacji zmiany</name>
<files>public/assets/css/app.css, DOCS/ARCHITECTURE.md, DOCS/TECH_CHANGELOG.md, DOCS/todo.md</files>
<action>
Zbuduj CSS (`npm run build:css`) po zmianach SCSS.
Zaktualizuj dokumentacje techniczna (ARCHITECTURE + TECH_CHANGELOG) o nowy standard rozdzielenia kolorow akcji i naglowkow.
Oznacz punkt 39 w `DOCS/todo.md` jako zrealizowany po pozytywnej weryfikacji.
</action>
<verify>npm run build:css oraz manualny check ekranow z przyciskami i naglowkami (np. orders/list, settings/*)</verify>
<done>AC-3 satisfied: assets + dokumentacja + status TODO sa zgodne z wymaganiami projektu.</done>
</task>
</tasks>
<boundaries>
## DO NOT CHANGE
- `database/migrations/*`
- Logika backendu PHP (kontrolery/repozytoria/serwisy)
- Moduly alertow `resources/modules/jquery-alerts/*` (poza zakresem tej zmiany)
## SCOPE LIMITS
- Zakres dotyczy tylko zmiany glównego koloru przyciskow i powiazanych tokenow wizualnych.
- Bez redesignu layoutu, bez zmian spacingu i bez realizacji innych punktow z `DOCS/todo.md`.
- Brak zmian kontraktow API i brak zmian schematu DB.
</boundaries>
<verification>
Before declaring plan complete:
- [ ] `npm run build:css` przechodzi bez bledow
- [ ] Widoczna roznica miedzy `section-title` i `btn--primary` na kluczowych ekranach
- [ ] Brak inline CSS w widokach
- [ ] `DOCS/ARCHITECTURE.md` i `DOCS/TECH_CHANGELOG.md` zaktualizowane
- [ ] `DOCS/todo.md` punkt 39 oznaczony jako zrealizowany
- [ ] All acceptance criteria met
</verification>
<success_criteria>
- Wszystkie taski zakonczone
- Build CSS zakonczony sukcesem
- Kontrast semantyczny: naglowki i glowny CTA nie myla sie kolorystycznie
- Zmiana udokumentowana i gotowa do UNIFY
</success_criteria>
<output>
After completion, create `.paul/phases/30-button-primary-color/30-01-SUMMARY.md`
</output>

View File

@@ -0,0 +1,133 @@
---
phase: 30-button-primary-color
plan: 01
subsystem: ui
tags: [scss, css, ui, design]
requires:
- phase: 29-delivery-status-mapping-ui
provides: global UI conventions based on section-title and shared button classes
provides:
- separated color tokens for action buttons vs section headings
- updated primary/outline button styles in SCSS and built CSS assets
affects: [frontend-styling, visual-consistency, docs]
tech-stack:
added: [none]
patterns: [semantic-color-tokens]
key-files:
created: [.paul/phases/30-button-primary-color/30-01-SUMMARY.md]
modified:
- resources/scss/shared/_ui-components.scss
- resources/scss/modules/_printing.scss
- public/assets/css/app.css
- DOCS/ARCHITECTURE.md
- DOCS/TECH_CHANGELOG.md
- DOCS/todo.md
key-decisions:
- "Action colors decoupled from informational heading colors"
- "Primary/outline buttons now consume action tokens"
patterns-established:
- "Use --c-primary for informational accents (links/section-title)"
- "Use --c-action-primary for call-to-action buttons"
duration: 11min
started: 2026-03-25T21:40:00+01:00
completed: 2026-03-25T21:51:00+01:00
---
# Phase 30 Plan 01: Button Primary Color Distinction Summary
**Wydzielono semantyczna palete kolorow akcji, dzieki czemu przyciski glownych akcji nie myla sie wizualnie z naglowkami sekcji.**
## Performance
| Metric | Value |
|--------|-------|
| Duration | 11 min |
| Started | 2026-03-25T21:40:00+01:00 |
| Completed | 2026-03-25T21:51:00+01:00 |
| Tasks | 3 completed |
| Files modified | 10 |
## Acceptance Criteria Results
| Criterion | Status | Notes |
|-----------|--------|-------|
| AC-1: Rozdzielenie kolorow naglowkow i przyciskow | Pass | `btn--primary` przeniesiony na `--c-action-primary`, `section-title` pozostaje na `--c-primary`. |
| AC-2: Spojne stany przyciskow akcji | Pass | `btn--primary`, focus i `btn--outline-primary` korzystaja z tej samej palety akcji. |
| AC-3: Zmiana wdrozona zgodnie ze standardem projektu | Pass | Zmiany w SCSS + build do `public/assets/css/app.css` + aktualizacje dokumentacji i TODO. |
## Accomplishments
- Wprowadzono dedykowane tokeny akcji (`--c-action-primary`, `--c-action-primary-dark`, `--focus-ring-action`) bez naruszania koloru informacyjnego `--c-primary`.
- Ujednolicono przyciski glownych akcji i ich stany hover/focus w calym UI.
- Zakonczono wymagania planu wraz ze skanem `sonar-scanner` i aktualizacja dokumentacji technicznej.
## Verification Results
- `rg -n "c-action-primary|btn--primary|focus-ring-action" resources/scss/shared/_ui-components.scss` -> PASS
- `rg -n "btn--outline-primary|c-action-primary" resources/scss/modules/_printing.scss` -> PASS
- `npm run build:css` -> PASS
- `sonar-scanner` -> PASS (`ANALYSIS SUCCESSFUL`, project `orderPRO`)
## Files Created/Modified
| File | Change | Purpose |
|------|--------|---------|
| `.paul/phases/30-button-primary-color/30-01-SUMMARY.md` | Created | Podsumowanie UNIFY planu 30-01 |
| `resources/scss/shared/_ui-components.scss` | Modified | Dodanie tokenow akcji + przepiecie `btn--primary` i focus |
| `resources/scss/modules/_printing.scss` | Modified | Przepiecie `btn--outline-primary` na token akcji |
| `public/assets/css/app.css` | Modified | Build CSS po zmianach SCSS |
| `public/assets/css/login.css` | Modified | Rebuild assets (`npm run build:css`) |
| `DOCS/ARCHITECTURE.md` | Modified | Aktualizacja standardu kolorow UI |
| `DOCS/TECH_CHANGELOG.md` | Modified | Log zmian technicznych dla fazy 30 |
| `DOCS/todo.md` | Modified | Punkt 39 oznaczony jako wykonany |
| `.paul/STATE.md` | Modified | Zamkniecie loopa i aktualizacja pozycji |
| `.paul/ROADMAP.md` | Modified | Status fazy/milestone po UNIFY |
## Decisions Made
| Decision | Rationale | Impact |
|----------|-----------|--------|
| Action colors decoupled from heading colors | Niebieskie CTA mylilo sie z naglowkami `section-title` | Lepsza czytelnosc i szybsze rozpoznanie akcji |
| Keep `--c-primary` for informational accents | Zachowanie dotychczasowej semantyki linkow i naglowkow | Mniejsza skala zmian i brak regresji semantycznej |
## Deviations from Plan
### Summary
| Type | Count | Impact |
|------|-------|--------|
| Auto-fixed | 1 | Niski - naprawa formatowania wpisu w changelogu bez zmian zakresu |
| Scope additions | 0 | Brak |
| Deferred | 0 | Brak |
**Total impact:** Minimalny, bez scope creep.
### Auto-fixed Issues
1. Wpis changeloga po pierwszym zapisie mial artefakty formatowania; zostal nadpisany poprawna trescia UTF-8.
### Deferred Items
None — plan executed exactly as written.
## Skill Audit
| Expected | Invoked | Notes |
|----------|---------|-------|
| `sonar-scanner` | ✓ | Wymagany skill uruchomiony po APPLY |
## Next Phase Readiness
**Ready:**
- Standard kolorow akcji jest zdefiniowany i udokumentowany.
- Todo item 39 zamkniety.
**Concerns:**
- Optional `/frontend-design` i `/code-review` nie byly wymagane do domkniecia zakresu tej mikro-zmiany.
**Blockers:**
- None.
---
*Phase: 30-button-primary-color, Plan: 01*
*Completed: 2026-03-25*

View File

@@ -3,6 +3,7 @@
## Status
- Projekt po resecie do trybu `users-only`.
- 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`.
## Moduly aktywne
- `App\Modules\Auth`

View File

@@ -1,44 +1,51 @@
# Tech Changelog
# Tech Changelog
## 2026-03-23 (Phase 26 — Manual Tracking Number, Plan 01)
- Nowa metoda `ShipmentPackageRepository::createManual(int, string, ?string): int` — INSERT do `shipment_packages` z `provider='manual'`, `status='created'`.
- Nowa metoda `ShipmentController::createManual(Request): Response` — endpoint `POST /orders/{id}/shipment/manual`, walidacja CSRF + tracking_number, activity log `shipment_manual`.
## 2026-03-25 (Phase 30 - Button Primary Color Distinction, Plan 01)
- Rozdzielono palete kolorow naglowkow i przyciskow akcji w warstwie SCSS:
- `resources/scss/shared/_ui-components.scss` ma nowe tokeny `--c-action-primary`, `--c-action-primary-dark`, `--focus-ring-action`,
- `btn--primary` i `btn:focus-visible` korzystaja z tokenow akcji, bez zmiany koloru `section-title` opartego o `--c-primary`.
- `resources/scss/modules/_printing.scss`: `btn--outline-primary` zostal przepiety z twardego niebieskiego (`#4a90d9`) na token `--c-action-primary`.
- Przebudowano assety frontendowe komenda `npm run build:css`, co zaktualizowalo `public/assets/css/app.css`.
## 2026-03-23 (Phase 26 — Manual Tracking Number, Plan 01)
- Nowa metoda `ShipmentPackageRepository::createManual(int, string, ?string): int` — INSERT do `shipment_packages` z `provider='manual'`, `status='created'`.
- Nowa metoda `ShipmentController::createManual(Request): Response` — endpoint `POST /orders/{id}/shipment/manual`, walidacja CSRF + tracking_number, activity log `shipment_manual`.
- Nowa route w `routes/web.php`: `POST /orders/{id}/shipment/manual`.
- `resources/views/orders/show.php` formularz inline do dodawania recznego numeru przesylki w zakladce Przesylki; zmienione wyswietlanie przesylek manualnych (status "Dodana recznie", przewoznik z carrier_id, brak etykiety).
- `resources/scss/app.scss` nowa klasa `.manual-tracking-form` (flex, gap 8px).
- `resources/views/orders/show.php` — formularz inline do dodawania recznego numeru przesylki w zakladce Przesylki; zmienione wyswietlanie przesylek manualnych (status "Dodana recznie", przewoznik z carrier_id, brak etykiety).
- `resources/scss/app.scss` — nowa klasa `.manual-tracking-form` (flex, gap 8px).
## 2026-03-22 (Phase 21 Order Source Display, Plan 01)
- `OrdersRepository::buildListSql()` LEFT JOIN `integrations ig ON ig.id = o.integration_id`, nowa kolumna `ig.name AS integration_name`.
- `OrdersRepository::findDetails()` analogiczny LEFT JOIN dla strony szczegolow zamowienia.
- `OrdersRepository::transformOrderRow()` nowe pole `integration_name`.
- `OrdersController::toTableRow()` wyswietla `integration_name` gdy niepuste, fallback na `sourceLabel()` (Allegro/Erli/default).
- `resources/views/orders/show.php` naglowek zamowienia: dwa osobne spany (nazwa integracji + "ID: identyfikator") zamiast jednego.
## 2026-03-22 (Phase 21 — Order Source Display, Plan 01)
- `OrdersRepository::buildListSql()` — LEFT JOIN `integrations ig ON ig.id = o.integration_id`, nowa kolumna `ig.name AS integration_name`.
- `OrdersRepository::findDetails()` — analogiczny LEFT JOIN dla strony szczegolow zamowienia.
- `OrdersRepository::transformOrderRow()` — nowe pole `integration_name`.
- `OrdersController::toTableRow()` — wyswietla `integration_name` gdy niepuste, fallback na `sourceLabel()` (Allegro/Erli/default).
- `resources/views/orders/show.php` — naglowek zamowienia: dwa osobne spany (nazwa integracji + "ID: identyfikator") zamiast jednego.
## 2026-03-18 (Phase 16 Zadania automatyczne, Plan 02: Watcher/Executor)
- Nowa klasa `App\Modules\Automation\AutomationService` trigger + ewaluacja warunkow (AND) + wykonanie akcji.
## 2026-03-18 (Phase 16 — Zadania automatyczne, Plan 02: Watcher/Executor)
- Nowa klasa `App\Modules\Automation\AutomationService` — trigger + ewaluacja warunkow (AND) + wykonanie akcji.
- Flow: `ReceiptController::store()` -> `AutomationService::trigger('receipt.created', orderId)` -> sprawdzenie warunkow (integration_id) -> `EmailSendingService::send()`.
- Rozszerzenie `EmailSendingService::send()` o opcjonalne parametry `$recipientEmailOverride` i `$recipientNameOverride` (kompatybilnosc wsteczna).
- 3 tryby odbiorcy: 'client' (kupujacy), 'company' (e-mail firmy z company_settings), 'client_and_company' (oba).
- Trigger w try/catch blad automatyzacji nie blokuje sukcesu tworzenia paragonu.
- Trigger w try/catch — blad automatyzacji nie blokuje sukcesu tworzenia paragonu.
- Activity log: automation_email_sent / automation_email_failed z actor_type='system'.
## 2026-03-18 (Phase 16 Zadania automatyczne, Plan 01: DB + CRUD)
## 2026-03-18 (Phase 16 — Zadania automatyczne, Plan 01: DB + CRUD)
- Nowe tabele: `automation_rules`, `automation_conditions`, `automation_actions` (migracja 000057).
- Nowy modul `App\Modules\Automation` z 2 klasami:
- `AutomationController` CRUD regul automatyzacji (index, create, store, edit, update, destroy, toggleStatus).
- `AutomationRepository` operacje DB z transakcjami (create/update atomowe z conditions+actions), findActiveByEvent dla watchera.
- `AutomationController` — CRUD regul automatyzacji (index, create, store, edit, update, destroy, toggleStatus).
- `AutomationRepository` — operacje DB z transakcjami (create/update atomowe z conditions+actions), findActiveByEvent dla watchera.
- 7 nowych route'ow: `/settings/automation/*`.
- Widoki: `resources/views/automation/index.php` (lista regul), `resources/views/automation/form.php` (formularz z dynamicznymi warunkami/akcjami).
- Nowy JS: `public/assets/js/modules/automation-form.js` (dodawanie/usuwanie wierszy warunkow i akcji).
- Nowy SCSS: `resources/scss/modules/_automation.scss` (style formularza dynamicznego).
- Menu nawigacji: dodany link "Zadania automatyczne" w sekcji Ustawienia.
## 2026-03-17 (Phase 15 Wysylka e-mail z zamowien)
## 2026-03-17 (Phase 15 — Wysylka e-mail z zamowien)
- Nowa zaleznosc: `phpmailer/phpmailer` v7.0.2 (SMTP transport).
- Nowy modul `App\Modules\Email` z 3 klasami:
- `EmailSendingService` wysylka e-mail (send, preview), logowanie do email_logs, resolwer skrzynki (mailboxId template default).
- `VariableResolver` zamiana `{{grupa.zmienna}}` na dane zamowienia/kupujacego/adresu/firmy.
- `AttachmentGenerator` generowanie PDF paragonu (dompdf) jako zalacznik in-memory (addStringAttachment).
- `EmailSendingService` — wysylka e-mail (send, preview), logowanie do email_logs, resolwer skrzynki (mailboxId → template → default).
- `VariableResolver` — zamiana `{{grupa.zmienna}}` na dane zamowienia/kupujacego/adresu/firmy.
- `AttachmentGenerator` — generowanie PDF paragonu (dompdf) jako zalacznik in-memory (addStringAttachment).
- `OrdersController`: nowe metody `sendEmail()`, `emailPreview()`, `loadEmailLogs()`.
- Nowe route'y: `POST /orders/{id}/send-email`, `POST /orders/{id}/email-preview`.
- Widok `orders/show.php`: przycisk "Wyslij e-mail" + modal (wybor szablonu/skrzynki, podglad, wysylka AJAX).
@@ -46,28 +53,28 @@
- Nowy partial: `resources/views/orders/partials/email-send-modal.php`.
- Nowy SCSS: `resources/scss/modules/_email-send.scss` (modal overlay, podglad, style).
## 2026-03-15 (Phase 13 DB + Skrzynki pocztowe)
## 2026-03-15 (Phase 13 — DB + Skrzynki pocztowe)
- Dodano 3 migracje email: `000054_create_email_mailboxes_table`, `000055_create_email_templates_table`, `000056_create_email_logs_table`.
- Nowe klasy: `EmailMailboxController` (index, save, delete, toggleStatus, testConnection), `EmailMailboxRepository` (listAll, findById, save, delete, toggleStatus, listActive).
- Test polaczenia SMTP przez natywny `stream_socket_client` z pelnym handshake (EHLO STARTTLS AUTH LOGIN) bez zewnetrznych bibliotek.
- Test polaczenia SMTP przez natywny `stream_socket_client` z pelnym handshake (EHLO → STARTTLS → AUTH LOGIN) — bez zewnetrznych bibliotek.
- Hasla SMTP szyfrowane przez `IntegrationSecretCipher` (AES-256-CBC + HMAC-SHA256).
- Widok `settings/email-mailboxes.php` lista skrzynek + formularz CRUD + AJAX test polaczenia.
- Widok `settings/email-mailboxes.php` — lista skrzynek + formularz CRUD + AJAX test polaczenia.
- Nawigacja: link "Skrzynki pocztowe" w sidebar Settings.
- 5 nowych route'ow: GET/POST `/settings/email-mailboxes/*`.
## 2026-03-14
- Zoptymalizowano zapytanie listy zamowien (`OrdersRepository::buildListSql()`):
- 4 correlated subqueries (items_count, items_qty, shipments_count, documents_count) zastapiono aggregating LEFT JOINami eliminuje N+1 na kazdym wierszu listy.
- `OrdersRepository::canResolveMappedMedia()` zamiana instance property na `static` `information_schema` odpytywany co najwyzej raz na cykl PHP zamiast raz per instancja.
- Dodano migracje `20260314_000048_add_orders_performance_indexes.sql` indeksy na `orders`: `source`, `external_status_id`, `ordered_at`, composite `(source, external_status_id)`.
- Dodano SSL verification (`CURLOPT_SSL_VERIFYPEER => true`, `CURLOPT_SSL_VERIFYHOST => 2`, `CURLOPT_CAINFO`) do 4 klas ApiClient: AllegroApiClient (3 metody), AllegroOAuthClient, ShopproApiClient, ApaczkaApiClient. Fallback: `$_ENV['CURL_CA_BUNDLE_PATH']` XAMPP cacert.pem system CA bundle.
- Cron web throttle (`isWebCronThrottled()`) przeniesiony z `$_SESSION` do `app_settings` (klucz `cron_web_last_run_at`) eliminuje wielokrotne uruchamianie crona przy wielu aktywnych sesjach.
- Deduplikacja migracji `000014` `000014b` (kolizja z `create_product_integration_translations`).
- 4 correlated subqueries (items_count, items_qty, shipments_count, documents_count) zastapiono aggregating LEFT JOINami — eliminuje N+1 na kazdym wierszu listy.
- `OrdersRepository::canResolveMappedMedia()` — zamiana instance property na `static` — `information_schema` odpytywany co najwyzej raz na cykl PHP zamiast raz per instancja.
- Dodano migracje `20260314_000048_add_orders_performance_indexes.sql` — indeksy na `orders`: `source`, `external_status_id`, `ordered_at`, composite `(source, external_status_id)`.
- Dodano SSL verification (`CURLOPT_SSL_VERIFYPEER => true`, `CURLOPT_SSL_VERIFYHOST => 2`, `CURLOPT_CAINFO`) do 4 klas ApiClient: AllegroApiClient (3 metody), AllegroOAuthClient, ShopproApiClient, ApaczkaApiClient. Fallback: `$_ENV['CURL_CA_BUNDLE_PATH']` → XAMPP cacert.pem → system CA bundle.
- Cron web throttle (`isWebCronThrottled()`) przeniesiony z `$_SESSION` do `app_settings` (klucz `cron_web_last_run_at`) — eliminuje wielokrotne uruchamianie crona przy wielu aktywnych sesjach.
- Deduplikacja migracji `000014` → `000014b` (kolizja z `create_product_integration_translations`).
- `AllegroStatusSyncService::sync()` zwraca `ok:false` dla kierunku `orderpro_to_allegro` (wczesniej false-positive `ok:true`). Opcja UI oznaczona jako `disabled` z `(wkrotce)`.
- Lista zamowien: source wyswietlany przed ID z prefixem `ID:`; `sourceLabel()` mapuje shopproshopPRO, allegroAllegro.
- Statusy zamowien na liscie kolorowane kolorem grupy z konfiguracji (`statusColorMap()` inline `background-color`).
- Lista zamowien: source wyswietlany przed ID z prefixem `ID:`; `sourceLabel()` mapuje shoppro→shopPRO, allegro→Allegro.
- Statusy zamowien na liscie kolorowane kolorem grupy z konfiguracji (`statusColorMap()` → inline `background-color`).
- Ciemniejsze obramowanie pol formularzy: `--c-border` zmieniony z `#e2e8f0` na `#b0bec5`.
- Hotfix SSL: `getCaBundlePath()` zwraca `null` gdy zaden CA bundle nie znaleziony `CURLOPT_CAINFO` ustawiany warunkowo, cURL uzywa systemowego CA na serwerze.
- Hotfix SSL: `getCaBundlePath()` zwraca `null` gdy zaden CA bundle nie znaleziony — `CURLOPT_CAINFO` ustawiany warunkowo, cURL uzywa systemowego CA na serwerze.
## 2026-03-08
- Poprawiono date podjazdu kuriera w payloadzie Apaczka:
@@ -128,7 +135,7 @@
- Poprawiono diagnostyke bledow tworzenia przesylki Apaczka:
- `ApaczkaShipmentService` przekazuje teraz `receiver_point_id` do payloadu `receiver.point` (oraz `sender_point_id` do `sender.point`),
- dodano walidacje wymagan uslugi na podstawie `service_structure` (np. wymagany punkt odbioru/nadania),
- dla bledu API `Brak wyceny dla podanych parametrów zamówienia` komunikat zawiera rozszerzona diagnostyke (service_id/nazwa/supplier, punkt odbioru/nadania, gabaryt/waga) i hint o niedopasowaniu uslugi do typu punktu.
- dla bledu API `Brak wyceny dla podanych parametrĂłw zamĂłwienia` komunikat zawiera rozszerzona diagnostyke (service_id/nazwa/supplier, punkt odbioru/nadania, gabaryt/waga) i hint o niedopasowaniu uslugi do typu punktu.
- Poprawiono import danych faktury z shopPRO:
- `ShopproOrdersSyncService` wykrywa fakture nie tylko po `is_invoice`/`invoice.required`, ale takze po danych firmowych (`firm_name`/`firm_nip`),
- `ShopproOrdersSyncService::mapAddresses(...)` zapisuje adres `invoice` (firma, NIP, adres) na podstawie pol `invoice`/`billing*`/`firm_*`,
@@ -142,7 +149,7 @@
- widok `resources/views/shipments/prepare.php` wyswietla ten komunikat bezposrednio pod informacja o metodzie z zamowienia.
- Poprawiono UX wyszukiwania w selectach mapowania form dostawy (zakladki `Formy dostawy`):
- `resources/views/settings/allegro.php` przeszlo z przebudowy opcji `<select>` na tryb bezpieczny (`focus first match` bez modyfikacji listy opcji),
- eliminuje przypadki znikajacych opcji i problem z wyborem uslugi po zmianie przewoznika na `Apaczka`,
- eliminuje przypadki „znikajacych” opcji i problem z wyborem uslugi po zmianie przewoznika na `Apaczka`,
- ujednolicono zachowanie z `resources/views/settings/shoppro.php`.
- Poprawiono inicjalizacje stanu mapowania przewoznika (`allegro.php`, `shoppro.php`):
- dla niezamapowanych form domyslny przewoznik to teraz pusty wybor (zamiast `allegro`),
@@ -188,7 +195,7 @@
- `ShopproOrdersSyncService` mapuje `inpost_paczkomat`/`orlen_point` do adresu `delivery` (punkt, ulica, kod, miasto),
- zapisuje `parcel_external_id` i `parcel_name` dla punktu odbioru,
- `delivery` dziedziczy telefon i e-mail klienta, gdy API nie zwraca osobnych danych odbiorcy,
- etykieta metody dostawy (`external_carrier_id`) zawiera koszt transportu (`transport_cost`), np. `Paczkomaty InPost - przedpłata: 13.5 zł`.
- etykieta metody dostawy (`external_carrier_id`) zawiera koszt transportu (`transport_cost`), np. `Paczkomaty InPost - przedpłata: 13.5 zł`.
- Fix importu shopPRO dla listy zamowien (`Kwoty` + miniatury):
- `ShopproOrdersSyncService` mapuje kwoty zamowienia z `summary` i `paid` (fallback), ceny pozycji z `price_brutto`,
- poprawiono laczenie payloadow `orders/list` i `orders/get|details` (zachowanie kluczowych pol z listy),
@@ -238,7 +245,7 @@
- Dodano migracje `20260308_000041_ensure_shoppro_status_sync_schedule_and_direction.sql`:
- seed/naprawa harmonogramu `shoppro_order_status_sync` (domyslnie 900s, priorytet 100),
- uzupelnienie kolumny `integrations.order_status_sync_direction` jesli brak.
- Rozszerzono `ShopproOrdersSyncService` o opcje uruchomienia filtrowanego po `integration_id` i z pominięciem flagi `orders_fetch_enabled` (wykorzystane przez cron synchronizacji statusow).
- Rozszerzono `ShopproOrdersSyncService` o opcje uruchomienia filtrowanego po `integration_id` i z pominięciem flagi `orders_fetch_enabled` (wykorzystane przez cron synchronizacji statusow).
- Dodano cron importu zamowien z `shopPRO`:
- nowy handler `App\Modules\Cron\ShopproOrdersImportHandler`,
- nowy serwis `App\Modules\Settings\ShopproOrdersSyncService`,
@@ -305,7 +312,7 @@
dla srodowisk, gdzie tabela `integrations` zostala odtworzona pozniej niz pierwotne migracje shopPRO.
- Poprawiono UX ekranu `shopPRO`:
- przy istniejacych instancjach automatycznie wybierana jest pierwsza integracja (bez koniecznosci wracania do zakladki `Integracja`),
- dodano przełącznik instancji nad zakladkami (`Wybrana integracja`) dostepny globalnie dla `Statusy/Ustawienia/Formy dostawy`.
- dodano przełącznik instancji nad zakladkami (`Wybrana integracja`) dostepny globalnie dla `Statusy/Ustawienia/Formy dostawy`.
## 2026-03-06
- Fix: synchronizacja statusow Allegro nie aktualizowala zamowien.
@@ -508,7 +515,7 @@
- zmniejszono paddingi/gapy i wysokosci kontrolek, aby zwiekszyc ilosc danych widocznych bez scrolla.
- Wprowadzono globalna preferencje kompaktowego UI w `AGENTS.md`.
- Poprawiono generowanie `code` dla statusow/grup: polskie znaki sa transliterowane do ASCII
(np. `Nieopłacone` -> `nieoplacone`), zamiast zamiany na `_`.
(np. `Nieopłacone` -> `nieoplacone`), zamiast zamiany na `_`.
- Dodano skrypt serwisowy `bin/fix_status_codes.php`:
- przelicza kody grup/statusow na podstawie aktualnych nazw z transliteracja PL->ASCII,
- zapewnia unikalnosc kodow (`_2`, `_3` przy konfliktach),
@@ -568,7 +575,7 @@
- filtry (fraza, zrodlo, status, status platnosci, zakres dat),
- sortowanie i paginacje,
- kompaktowe komorki (referencje, klient, status+platnosc, pozycje, kwoty, wysylka, daty),
- skrócone statystyki (`wszystkie`, `oplacone`, `wyslane`).
- skrĂłcone statystyki (`wszystkie`, `oplacone`, `wyslane`).
- Rozszerzono liste zamowien o podglad produktow w zamowieniu:
- nazwa produktu,
- miniatura (z `order_items.media_url`, fallback bez obrazu),
@@ -613,3 +620,4 @@
- aktualizuje tez `is_canceled_by_buyer` dla statusu `cancelled`,
- wspiera `--use-remote` i `--dry-run`.
- Wykonano podmiane statusow na bazie zdalnej (`--use-remote`): zaktualizowano 30 zamowien.

View File

@@ -32,7 +32,7 @@
37. [x] Nie działa zapisywanie numer REGON
38. [x] Customowe przyciski paczek
39. [] Zamian głównego koloru przycisków z niebieskiego na inny (bo się z nagłówkami myli)
39. [x] Zmiana głównego koloru przycisków z niebieskiego na inny (bo się z nagłówkami myli)
40. [] Usunąć przycisk "Drukuj etykiety" z widoku https://orderpro.projectpro.pl/orders/list razem z mechanizmem, który to obsługuje
41. [] 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. [] 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.

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -36,8 +36,8 @@
.btn--outline-primary {
background: transparent;
border: 1px solid #4a90d9;
color: #4a90d9;
border: 1px solid var(--c-action-primary);
color: var(--c-action-primary);
cursor: pointer;
border-radius: 3px;
font-size: 0.75rem;
@@ -45,7 +45,7 @@
transition: background-color 0.15s, color 0.15s;
&:hover {
background-color: #4a90d9;
background-color: var(--c-action-primary);
color: #fff;
}

View File

@@ -1,6 +1,8 @@
:root {
--c-primary: #6690f4;
--c-primary-dark: #3164db;
--c-action-primary: #0f766e;
--c-action-primary-dark: #0b5f59;
--c-bg: #f4f6f9;
--c-surface: #ffffff;
--c-text: #4e5e6a;
@@ -9,6 +11,7 @@
--c-border: #b0bec5;
--c-danger: #cc0000;
--focus-ring: 0 0 0 3px rgba(102, 144, 244, 0.15);
--focus-ring-action: 0 0 0 3px rgba(15, 118, 110, 0.18);
--shadow-card: 0 1px 4px rgba(0, 0, 0, 0.06);
}
@@ -29,11 +32,11 @@
.btn--primary {
color: #ffffff;
background: var(--c-primary);
background: var(--c-action-primary);
}
.btn--primary:hover {
background: var(--c-primary-dark);
background: var(--c-action-primary-dark);
}
.btn--secondary {
@@ -80,8 +83,8 @@
.btn:focus-visible {
outline: none;
box-shadow: var(--focus-ring);
border-color: var(--c-primary);
box-shadow: var(--focus-ring-action);
border-color: var(--c-action-primary);
}
.form-control {