diff --git a/.paul/PROJECT.md b/.paul/PROJECT.md index a004c7f..1c1af37 100644 --- a/.paul/PROJECT.md +++ b/.paul/PROJECT.md @@ -133,7 +133,7 @@ Sprzedawca moĹĽe obsĹ‚ugiwać zamĂłwienia ze wszystkich kanałów - [x] Tracking i automatyzacje Erli: lokalny provider tracking jak w Allegro, retry niekrytycznej rejestracji paczki zewnetrznej Erli z `shipment_tracking_sync`, wspolny kontekst `shipment.created`/`shipment.status_changed` dla regul e-mail/SMS/statystyk — Phase 131 - [x] Hardening Erli: spojna diagnostyka importu/ACK w `integration_order_sync_state.last_error`, brak ACK po blednym batchu, testy jednostkowe import/status sync i dokumentacja obserwowalnosci bez nowej migracji — Phase 132 - [x] Parytet Erli w powierzchniach wspolnych: filtr zrodla zamowien, kanaly statystyk dziennych/podsumowania, warunek integracji automatyzacji, menu integracji i etykiety `zrodlo` uzywaja wspolnego rejestru zrodel — Phase 133 -- [x] Backlog Reality Check: `.paul/codebase/todo.md` i `.paul/codebase/concerns.md` sklasyfikowane przeciw aktualnemu kodowi/docs, z dowodami w `BACKLOG-AUDIT.md` i pierwotnym routingiem do kolejnych faz dlugu; nieaktualne fazy 140+ usuniete 2026-05-18 decyzja operatora — Phase 134 +- [x] Backlog Reality Check: reczne wpisy z `.paul/codebase/todo.md` i dawny raport ryzyk sklasyfikowane przeciw aktualnemu kodowi/docs, z dowodami w `BACKLOG-AUDIT.md` i pierwotnym routingiem do kolejnych faz dlugu; nieaktualne fazy 140+ usuniete 2026-05-18 decyzja operatora — Phase 134 - [x] Accounting Net Correctness: nowe paragony zapisuja VAT-aware `receipts.total_net`, a statystyki dzienne preferuja source-level net, potem `order_items` VAT fallback, z gross `/1.23` tylko jako legacy fallback — Phase 135 - [x] Fakturownia Invoice Idempotency: delegowane faktury uzywaja stabilnego `oid=orders.internal_order_number`, lookup-first `GET /invoices.json?oid=...`, lokalnego stanu `pending_external`/`failed_retryable` i auto-attach po timeoutach — Phase 136 - [x] Delivery Status Backlog Verification: `DELIVERY-STATUS-MGMT` zamkniete jako wdrozone; runtime korzysta z DB-driven statusow, a read-only DB check nie wykazal starych ani niepoprawnych kluczy automatyzacji — Phase 137 @@ -325,9 +325,10 @@ Quick Reference: - /code-review → PrzeglÄ…d kodu przed UNIFY (optional) - /frontend-design → Komponenty UI i widoki (optional) - /simplify → Refaktoryzacja po implementacji (optional) +- SonarQube / `sonar-scanner` → reczny skan na zadanie operatora; nie jest wymagany w PLAN/APPLY/UNIFY --- *PROJECT.md — Updated when requirements or context change* -*Last updated: 2026-05-18 after Phase 145 closure* +*Last updated: 2026-05-18 after Sonar workflow policy update* diff --git a/.paul/ROADMAP.md b/.paul/ROADMAP.md deleted file mode 100644 index 77312d9..0000000 --- a/.paul/ROADMAP.md +++ /dev/null @@ -1,707 +0,0 @@ -# Roadmap: orderPRO - -## Overview - -orderPRO to narzedzie do wielokanalowego zarzadzania sprzedaza. Projekt przechodzi od podstawowych integracji z marketplace'ami i generowania etykiet, przez rozbudowe o nowe zrodla zamowien i przewoznikow, az do pelnego zarzadzania produktami i stanami magazynowymi. - -## Current Milestone - -v3.14 Polkurier COD Return Time Hotfix - Complete - -Pilny hotfix tworzenia przesylek pobraniowych Polkurier: API odrzuca `create_order`, bo payload wysyla bledna wartosc czasu zwrotu pobrania. `codtype` ma uzywac kodu terminu (`S`, `1D`, `4D`, `16D`), a `return_cod` kodu sposobu zwrotu (`BA`, `PO`, `MB`). - -Progress: 1 of 1 phases complete (100%). - -| Phase | Name | Plans | Status | -|-------|------|-------|--------| -| 145 | Polkurier COD Return Time Hotfix | 1/1 | Complete (2026-05-18; PHPUnit/Sonar/live smoke follow-up pending) | - -### Phase 145: Polkurier COD Return Time Hotfix - -Focus: Naprawic payload COD w `PolkurierShipmentService`, aby przesylki pobraniowe wysylaly `codtype='S'` jako standardowy termin zwrotu pobrania oraz `return_cod='BA'` jako przelew na konto bankowe. Brak zmian DB i brak UI konfiguracji terminow w tym hotfixie. -Plans: 145-01 (complete; `.paul/phases/145-polkurier-cod-return-time-hotfix/145-01-SUMMARY.md`) - -## Previous Milestone - -v3.13 Imported Notes Badge Count Hotfix - Complete - -Pilny hotfix dla listy zamowien: notatki zaimportowane ze zrodla, np. shopPRO, maja byc zliczane razem z notatkami autorskimi w badge `[N]` przy numerze zamowienia. - -Progress: 1 of 1 phases complete (100%). - -| Phase | Name | Plans | Status | -|-------|------|-------|--------| -| 144 | Imported Notes Badge Count Hotfix | 1/1 | Complete (2026-05-18; PHPUnit/Sonar env gaps documented) | - -### Phase 144: Imported Notes Badge Count Hotfix - -Focus: Zmienic licznik badge notatek na `/orders/list`, aby uzywal wszystkich rekordow `order_notes` dla zamowienia, a nie tylko `note_type='user'`. Zamowienie `1034` z importowana notatka shopPRO powinno pokazac cyfre na liscie. -Plans: 144-01 (complete; `.paul/phases/144-imported-notes-badge-count/144-01-SUMMARY.md`) - -## Earlier Milestone - -v3.12 Orders List Sidebar UI Hotfix - Complete - -Maly hotfix UX dla ekranu operacyjnego: usuniecie opisowego boksu z listy zamowien oraz likwidacja widocznego "pokaz i schowaj" przy odswiezaniu strony ze zwinietym sidebarem. - -Progress: 1 of 1 phases complete (100%). - -| Phase | Name | Plans | Status | -|-------|------|-------|--------| -| 143 | Orders List Sidebar UI Hotfix | 1/1 | Complete (2026-05-18; manual UI/Sonar follow-up pending) | - -### Phase 143: Orders List Sidebar UI Hotfix - -Focus: Usunac boks "Zamowienia / Kompaktowa lista zamowien oparta o lokalna baze orderPRO." z `/orders/list` i zastosowac zapisany stan zwinietego sidebaru przed pierwszym renderem strony. -Plans: 143-01 (complete; `.paul/phases/143-orders-list-sidebar-ui-hotfix/143-01-SUMMARY.md`) - -## Earlier Milestone - -v3.11 Polkurier Shipment Prepare Hotfix - Complete - -Pilny hotfix po Phase 140: mapowanie shopPRO -> Polkurier zapisuje sie poprawnie, ale formularz `/orders/{id}/shipment/prepare` nie podstawia providera i uslugi Polkuriera. - -Progress: 1 of 1 phases complete (100%). - -| Phase | Name | Plans | Status | -|-------|------|-------|--------| -| 142 | Polkurier Shipment Prepare Prefill | 1/1 | Complete (2026-05-18; PHPUnit/Sonar/manual live smoke follow-up pending) | - -### Phase 142: Polkurier Shipment Prepare Prefill - -Focus: Naprawic preselect w formularzu przygotowania przesylki, aby `carrier_delivery_method_mappings.provider='polkurier'` wybieral przewoznika Polkurier, zaznaczal zapisana usluge i ustawial hidden fields wymagane przez `PolkurierShipmentService`. -Plans: 142-01 (complete; `.paul/phases/142-polkurier-shipment-prepare-prefill/142-01-SUMMARY.md`) - -## Earlier Milestone - -v3.10 Integrations UI Polish - Complete - -Maly milestone porzadkujacy ekran `/settings/integrations`, aby rosnaca liczba integracji byla latwiejsza do skanowania bez zmiany backendowych kontraktow providerow. - -Progress: 1 of 1 phases complete (100%). - -| Phase | Name | Plans | Status | -|-------|------|-------|--------| -| 141 | Integrations Hub Grouped Sections | 1/1 | Complete (2026-05-18; manual UI/Sonar follow-up pending) | - -### Phase 141: Integrations Hub Grouped Sections - -Focus: Podzielic `/settings/integrations` na lekkie sekcje/kafelki: marketplace (Allegro Sandbox, Allegro Production, shopPRO, Erli), kurierzy (InPost, Apaczka, polkurier.pl) i pozostale (Fakturownia, HostedSMS, SMSPLANET), usuwajac niepotrzebny naglowek/opis "Wspolny panel konfiguracji wszystkich providerow." -Plans: 141-01 (complete; `.paul/phases/141-integrations-hub-grouped-sections/141-01-SUMMARY.md`) - -## Earlier Milestone - -v3.9 Stabilizacja i splata dlugu technicznego - Complete - -Milestone porzadkujacy zbudowany z `.paul/codebase/todo.md` i `.paul/codebase/concerns.md`: poprawa znanych bugow, weryfikacja stalych ryzyk, domkniecie security/performance oraz ograniczenie dlugu technicznego, ktory utrudnia kolejne wdrozenia. - -Progress: 7 of 7 phases complete (100%). - -| Phase | Name | Plans | Status | -|-------|------|-------|--------| -| 134 | Backlog Reality Check | 1/1 | Complete (2026-05-16; documentation-only audit, Sonar CLI gap documented) | -| 135 | Accounting Net Correctness | 1/1 | Complete (2026-05-16; VAT-aware receipt/stat net, PHPUnit/Sonar env gaps documented) | -| 136 | Fakturownia Invoice Idempotency | 1/1 | Complete (2026-05-17; Fakturownia oid idempotency, migration/PHPUnit/Sonar env gaps documented) | -| 137 | Delivery Status Backlog Verification | 1/1 | Complete (2026-05-17; verification-only closure, no stale automation keys found) | -| 138 | Security and Legacy Hardening | 1/1 | Complete (2026-05-17; SMTP TLS/template/session/view hardening, PHPUnit/Sonar env gaps documented) | -| 139 | Sonar Critical/Major Cleanup | 2/2 | Complete (2026-05-17; Sonar BLOCKER/CRITICAL/MAJOR reduced 648 -> 495 across two cleanup slices) | -| 140 | shopPRO Polkurier Delivery Mapping | 1/1 | Complete (2026-05-18; shopPRO delivery mapping supports Polkurier, manual UI/Sonar follow-up pending) | - -### Phase 134: Backlog Reality Check - -Focus: Zweryfikowac wszystkie wpisy z `.paul/codebase/todo.md` i `.paul/codebase/concerns.md` przeciw aktualnemu kodowi oraz dokumentacji. Dla kazdego wpisu oznaczyc: nadal aktywne, juz wdrozone, nieaktualne albo wymaga decyzji operatora. Wynik ma stac sie wejsciem do planow kolejnych faz. -Plans: 134-01 (complete; `.paul/phases/134-backlog-reality-check/134-01-SUMMARY.md`) - -### Phase 135: Accounting Net Correctness - -Focus: Poprawic znane rozbieznosci kwot netto: `RECEIPT-NET-FIX` dla `receipts.total_net` oraz `STAT-NET` dla statystyk zamowien bez stalego zalozenia 23% VAT. Zakres obejmuje ustalenie zrodla prawdy, ewentualny backfill i testy eksportow/statystyk. -Plans: 135-01 (complete; `.paul/phases/135-accounting-net-correctness/135-01-SUMMARY.md`) - -### Phase 136: Fakturownia Invoice Idempotency - -Focus: Domknac `INVOICE-IDEMP-115`: zabezpieczyc delegowane wystawianie faktur przed podwojnym POST do Fakturowni po timeoutach lub utracie odpowiedzi, z weryfikacja mozliwosci `Idempotency-Key` albo deduplikacji po referencji. -Plans: 136-01 (complete; `.paul/phases/136-fakturownia-invoice-idempotency/136-01-SUMMARY.md`) - -### Phase 137: Delivery Status Backlog Verification - -Focus: Zweryfikowac wpis `DELIVERY-STATUS-MGMT` z todo oraz breaking changes po Phase 108: statusy DB-driven, stare klucze grup statusow, usuniecie `SHIPMENT_STATUS_OPTION_MAP` i realny wplyw na reguly automatyzacji. Jezeli funkcjonalnosc jest juz wdrozona, zamknac/oczyscic backlog i zostawic tylko potwierdzone luki. -Plans: 137-01 (complete; `.paul/phases/137-delivery-status-backlog-verification/137-01-SUMMARY.md`) - -### Phase 138: Security and Legacy Hardening - -Focus: Sprawdzic i naprawic po potwierdzeniu: szyfrowanie `print_api_keys.api_key`, `fsockopen('ssl://...')` w tescie skrzynki e-mail, injection przez zmienne szablonow, brakujacy import `RuntimeException`, stare `require` w widokach, raw `$_SESSION` i pozostale legacy patterns wskazane w concerns. -Plans: 138-01 (complete; `.paul/phases/138-security-and-legacy-hardening/138-01-SUMMARY.md`) - -### Phase 139: Sonar Critical/Major Cleanup - -Focus: Zmniejszyc potwierdzone problemy SonarQube z `concerns.md`: generic exceptions, zbyt wiele returnow, powtarzajace sie literaly, cognitive complexity, unused parameters, use-namespace-import oraz accessibility (`aria-label`, ``). Przed kazda grupa zmian odswiezyc stan skanu albo lokalnie potwierdzic wystepowanie problemu. -Plans: 139-01 (complete; `.paul/phases/139-sonar-critical-major-cleanup/139-01-SUMMARY.md`); 139-02 (complete; `.paul/phases/139-sonar-critical-major-cleanup/139-02-SUMMARY.md`) - -### Phase 140: shopPRO Polkurier Delivery Mapping - -Focus: Dodac Polkurier do zakladki Dostawy w ustawieniach integracji shopPRO, aby formy dostawy z zamowien shopPRO mogly byc mapowane na lokalna usluge Polkurier i pozniej automatycznie preselectowane przy przygotowaniu przesylki. -Plans: 140-01 (complete; `.paul/phases/140-shoppro-polkurier-delivery-mapping/140-01-SUMMARY.md`) - -## Earlier Milestone - -v3.8 Erli Marketplace Integration - Complete in code - -Pelna integracja z erli.pl wzorowana na istniejacej integracji Allegro: konfiguracja konta/API, pobieranie zamowien, mapowanie i synchronizacja statusow, generowanie etykiet, tracking oraz wlaczenie Erli w istniejace przeplywy automatyzacji, statystyk i obslugi zamowien. - -Progress: 7 of 7 phases complete (100%). - -| Phase | Name | Plans | Status | -|-------|------|-------|--------| -| 127 | Erli Integration Foundation | 1/1 | Complete (2026-05-15; migration/manual Erli API smoke pending operator) | -| 128 | Erli Orders Import | 1/1 | Complete (2026-05-15; migration/manual Erli import smoke pending operator) | -| 129 | Erli Status Mapping + Sync | 1/1 | Complete (2026-05-16; migration/manual Erli status smoke pending operator) | -| 130 | Erli Shipments + Labels | 1/1 | Complete (2026-05-16; migration/manual Erli shipping smoke pending operator) | -| 131 | Erli Tracking + Automation Hooks | 1/1 | Complete (2026-05-16; manual Erli tracking/automation smoke pending operator) | -| 132 | Erli Hardening, Observability + Docs | 1/1 | Complete (2026-05-16; PHPUnit/Sonar env gaps documented) | -| 133 | Erli Cross-Surface Parity | 1/1 | Complete (2026-05-16; PHPUnit/Sonar env gaps documented) | - -### Phase 127: Erli Integration Foundation - -Focus: Dodac podstawowy typ integracji Erli: migracje konfiguracji, szyfrowanie sekretow, klient API, test polaczenia, karta w hubie integracji i routing/settings zgodne z wzorcami Allegro/shopPRO. -Plans: 127-01 (complete) - -### Phase 128: Erli Orders Import - -Focus: Pobieranie nowych zamowien Erli przez cron i import reczny, mapper do wspolnego modelu orderPRO, state cursor, delta-only re-import, adresy/pozycje/platnosci/notatki oraz flaga faktury/NIP tam, gdzie API Erli daje dane firmowe. -Plans: 128-01 (complete) - -### Phase 129: Erli Status Mapping + Sync - -Focus: Osobne mapowanie pull/push statusow Erli, auto-discovery nieznanych statusow, cron synchronizacji orderPRO -> Erli i ochrona lokalnych statusow przy re-imporcie analogicznie do Allegro/shopPRO. -Plans: 129-01 (complete) - -### Phase 130: Erli Shipments + Labels - -Focus: Generowanie etykiet dla zamowien Erli, mapowanie metod dostawy Erli na dostepne providery, zapis paczek w `shipment_packages`, pobieranie labeli i integracja z kolejka zdalnego druku. -Plans: 130-01 (complete) - -### Phase 131: Erli Tracking + Automation Hooks - -Focus: Tracking przesylek Erli, aktualizacja delivery statusow, zdarzenia automatyzacji (`order.imported`, `shipment.created`, `shipment.status_changed`) i zachowanie kompatybilnosci z szablonami e-mail/SMS oraz statystykami. -Plans: 131-01 (complete) - -### Phase 132: Erli Hardening, Observability + Docs - -Focus: Testy jednostkowe mapperow/klientow, logi integracji i bledow API, retry/idempotencja, manual smoke checklist na zywej konfiguracji oraz aktualizacja `DOCS/DB_SCHEMA.md`, `DOCS/ARCHITECTURE.md` i `DOCS/TECH_CHANGELOG.md`. -Plans: 132-01 (complete) - -### Phase 133: Erli Cross-Surface Parity - -Focus: Domknac Erli jako pelnoprawny kanal w istniejacych wspolnych powierzchniach: filtr `Zrodlo` na liscie zamowien, kanaly sprzedazy w `/statistics/orders` i `/statistics/summary`, warunki integracji w automatyzacjach oraz aktywne menu integracji. Wprowadzic maly wspolny rejestr zrodel, zeby ograniczyc kolejne lokalne pominiecia Erli. -Plans: 133-01 (complete) - -## Earlier Recent Milestone (transition pending) - -v3.7 Invoices (Fakturownia integration) — Complete in code, transition/follow-ups pending - -Wystawianie faktur dla klientow z NIP poprzez integracje z Fakturownia (app.fakturownia.pl). Numeracja lokalna z opcja delegacji do Fakturowni, rozdzielenie przyciskow "Wystaw paragon" / "Wystaw fakture", osobne podstrony edycji konfiguracji paragonow i faktur. - -| Phase | Name | Plans | Status | -|-------|------|-------|--------| -| 113 | Fakturownia Integration Foundation | 1/1 | Complete (2026-05-10) | -| 114 | Accounting Configs Refactor (hub + osobne podstrony receipts/invoices) | 1/1 | Complete (2026-05-10) | -| 115 | Wystawianie faktury z zamowienia (lokalne + delegacja Fakturownia + NIP lookup MF Biala Lista) | 1/1 | Complete (2026-05-10) | -| 116 | HostedSMS Integration Settings + Test SMS | 1/1 | Complete (2026-05-12) | -| 117 | SMSPLANET Integration Settings + Test SMS | 1/1 | Complete (2026-05-12; migration/manual SMS verification pending) | -| 118 | Fakturownia Single Instance | 1/1 | Complete (2026-05-12; migration/manual Fakturownia verification pending) | -| 119 | Re-import total_paid Protection | 1/1 | Complete (2026-05-12; phpunit run + manual shoppro smoke pending env) | -| 120 | Alert Component Unification | 1/1 | Complete (2026-05-12; CSS rebuilt; smoke tests pending operator) | -| 121 | SMSPLANET Conversation + Notifications | 1/1 | Complete (2026-05-12; live SMS/browser smoke pending operator) | -| 122 | SMSPLANET Default SMS Footer | 1/1 | Complete (2026-05-12; live SMS smoke + over-limit UI test pending operator) | -| 123 | Receipts Export VAT Breakdown | 1/1 | Complete (2026-05-12; manual XLSX smoke pending operator) | -| 124 | SMS Templates | 1/1 | Complete (2026-05-13; migration + manual SMS smoke pending operator) | -| 125 | invoice_requested Import Fix (shopPRO+Allegro NIP detection, drop legacy is_invoice column) | 1/1 | Complete (2026-05-13; migration + manual smoke pending operator) | -| 126 | Invoice GUS Field Mapping Fix (KRS-based heuristic: JDG → name do "Imię i nazwisko", spółka → "Nazwa firmy") | 1/1 | Complete (2026-05-13; manual smoke pending operator) | -| 127 | polkurier Integration Foundation (single-instance settings + Token API + realny test polaczenia; obok Apaczki) | 1/1 | Complete (2026-05-14; live API verified — `Autoryzacja: 1`) | -| 128 | polkurier ShipmentService + TrackingService + UI prepare panel + delivery_status_mappings seed (live test na #114/#115) | 1/1 | Complete (2026-05-14; live test passed po 4 iteracjach; migracja + cron tracking weryfikacja pending) | -| 129 | Order User Notes module (extend `order_notes` o user_id/author_name/note_type='user' + pelen CRUD restricted to author + badge `[N]` na liscie zamowien) | 1/1 | Complete (2026-05-14; migracja + manualny smoke pending operator) | -| 130 | polkurier delivery status mappings UI (hardcoded POLKURIER_MAP/DESCRIPTIONS + dropdown w `/settings/delivery-statuses?tab=mapping` + badge counter) | 1/1 | Complete (2026-05-14; manualny smoke pending operator) | - -Planowane kolejne fazy v3.7 (kandydaci, do rozplanowania): -- polkurier TrackingService + `delivery_status_mappings` (provider='polkurier') -- polkurier paczkomaty (`InpostParcelMachines` / `PocztexPostOffices` / `Kurier48PostOffices` z SDK polkuriera) -- Eksport XLSX listy wystawionych faktur (analogicznie do paragonow) -- Event automatyzacji `invoice.created` (jezeli operator chce wysylac faktury mailem) -- Automatyzacje SMS / odbior odpowiedzi SMS po aktywacji HostedSMS -- SMSPLANET conversation mode: wybor nadpis/numer 2WAY, odbior odpowiedzi, historia SMS w zamowieniu i notification center - Phase 121 planning -- Manualne potwierdzenie SMSPLANET na zywej bazie i danych produkcyjnych -- Backfill `curl_close()` w `ShopproIntegrationsRepository` (PHP 8.5 compat, poza zakresem 115) - -## Next Milestone - -Kandydaci w kolejce (po v3.8): -- Mobile Orders List / Mobile Order Details / Mobile Settings -- Zarzadzanie produktami -- Zarzadzanie stanami magazynowymi -- Historical receipt net backfill, only if operator later wants old `receipts.total_net` corrected -- Phase 68 — Code Deduplication Refactor - -## Completed Milestones - -
-v3.6 Re-import Data Protection - 2026-05-07 (1 phase, 1 plan) - -Re-import istniejacego zamowienia (Allegro + shopPRO) jest delta-only: `replaceAddresses/Items/Notes` wywolywane wylacznie przy pierwszym imporcie, nowy `updateOrderDelta()` aktualizuje tylko pola realnie zmieniajace sie ze zrodla. Stabilne `order_items.id` chronia `project_generated` (Phase 97) i flow generowania PSD. Dodatkowo: propagacja anulowania ze zrodla (override niezalezny od statusOverwriteAllowed) i identical-payload no-op guard. Naprawa case #882 (znikajaca flaga "Projekt" po re-imporcie wymuszanym przez `payment.status_changed` z Phase 111). - -| Phase | Name | Plans | Status | -|-------|------|-------|--------| -| 112 | Re-import Data Protection | 1/1 | Complete | - -Archive: `.paul/phases/112-reimport-data-protection/` - -
- -
-v3.5 Payment Transition Event - 2026-05-05 (1 phase, 1 plan) - -Naprawa luki w re-imporcie zamowien Allegro/shopPRO: po potwierdzeniu platnosci re-import emituje `payment.status_changed`, co przez chain reguly #7 zmienia status na `w_realizacji`. Eliminuje przypadki zamowien zaimportowanych przed potwierdzeniem platnosci utykajacych w `nieoplacone` (case #864). - -| Phase | Name | Plans | Status | -|-------|------|-------|--------| -| 111 | Payment Transition Event | 1/1 | Complete | - -Archive: `.paul/phases/111-payment-transition-event/` - -
- -
-v3.4 Statistics Summary - 2026-04-28 (1 phase, 1 plan) - -Dodano pierwsza pozycje `Statystyki -> Podsumowanie` z miesiecznymi wykresami liczby i wartosci zamowien. Kazda integracja ma osobna serie, a dodatkowa seria `Razem` sumuje miesiac. Domyslny start historii to `04-2026`. - -| Phase | Name | Plans | Status | -|-------|------|-------|--------| -| 110 | Statistics Summary | 1/1 | Complete | - -Archive: `.paul/phases/110-statistics-summary/` - -
- -
-v3.3 UI Filters - 2026-04-28 (1 phase, 1 plan) - -Usprawnienie wielokrotnego wyboru w filtrach: natywne selecty multiple na `/statistics/orders` zostaly zastapione kompaktowym dropdownem z checkboxami, bez zmiany kontraktu GET i backendu statystyk. - -| Phase | Name | Plans | Status | -|-------|------|-------|--------| -| 109 | Checkbox Multiselect Filters | 1/1 | Complete | - -Archive: `.paul/phases/109-checkbox-multiselect-filters/` - -
- -
-v3.2 Delivery Status Management - 2026-04-27 (1 phase, 2 plans) - -Wyniesienie znormalizowanych statusow przesylek do tabeli DB z CRUD panelem oraz pelna integracja DB-driven w dropdownach automatyzacji. - -| Phase | Name | Plans | Status | -|-------|------|-------|--------| -| 108 | Delivery Status Management | 2/2 | Complete | - -Archive: `.paul/phases/108-delivery-status-management/` - -
- -
-v3.1 Operational Enhancements - 2026-04-27 (2 phases, 2 plans) - -Usprawnienia operacyjne: alert o kliencie z historia zwrotow oraz idempotentna jednorazowa wysylka e-mail per zamowienie. - -| Phase | Name | Plans | Status | -|-------|------|-------|--------| -| 106 | Customer Return Alert | 1/1 | Complete | -| 107 | Automation Email Send Once | 1/1 | Complete | - -Archive: `.paul/phases/106-customer-return-alert/`, `.paul/phases/107-automation-email-send-once/` - -
- -
-v3.0 Mobile Responsive - 2026-04-19 (52 phases shipped, 55 plans) - -Wersja mobilna aplikacji plus pelny zestaw usprawnien operacyjnych: automation events, tracking push/pull, personalizacja pozycji, resilient print pipeline, project generation PSD oraz raport statystyk zamowien. - -| Phase | Name | Plans | Status | -|-------|------|-------|--------| -| 52 | Mobile Main Menu | 1/1 | Complete | -| 53 | Mobile Status Panel Toggle | 1/1 | Complete | -| 54 | Order Detail Image Hover | 1/1 | Complete | -| 55 | Desktop Collapsed Sidebar Fix | 1/1 | Complete | -| 56 | Order Payments | 1/1 | Complete | -| 57 | Payment Automation Event | 1/1 | Complete | -| 58 | Automation Form Preserve | 1/1 | Complete | -| 59 | Order Status Automation Event | 1/1 | Complete | -| 60 | Order Status Aged Event | 1/1 | Complete | -| 61 | Payment Button Activation | 1/1 | Complete | -| 62 | Import Re-import Safety | 1/1 | Complete | -| 63 | Order Item Personalization | 1/1 | Complete | -| 64 | Receipt Datetime Precision | 1/1 | Complete | -| 65 | PAUL Delegated Apply | 1/1 | Complete | -| 66 | Allegro Delivery Tracking | 2/2 | Complete | -| 67 | PAUL Codex Executor | 1/1 | Complete | -| 68 | Code Deduplication Refactor | 0/2 | Deferred | -| 69 | Allegro Tracking English Statuses | 1/1 | Complete | -| 70 | Receipt Shipping Cost | 1/1 | Complete | -| 71 | Attributes Import | 1/1 | Complete | -| 72 | Per Page Persistence | 1/1 | Complete | -| 73 | Search by Product | 1/1 | Complete | -| 74 | Reverse Status Mapping | 1/1 | Complete | -| 75 | Pull Status Mapping | 1/1 | Complete | -| 76 | Shipment Receiver Fallback | 1/1 | Complete | -| 77 | COD Amount Fix | 1/1 | Complete | -| 78 | Preset Auto Submit | 1/1 | Complete | -| 79 | Personalization Message Field | 1/1 | Complete | -| 80 | Status Change Reload | 1/1 | Complete | -| 81 | Global Search Bar | 1/1 | Complete | -| 82 | Product Title Tooltip | 1/1 | Complete | -| 83 | Allegro Pull Status Mapping | 1/1 | Complete | -| 84 | Order Imported Automation Event | 1/1 | Complete | -| 85 | Status Group Filter | 1/1 | Complete | -| 86 | Apaczka COD Bank Account | 1/1 | Complete | -| 87 | Shipment Delete | 1/1 | Complete | -| 88 | Allegro User-Agent | 1/1 | Complete | -| 89 | Allegro Info Page | 1/1 | Complete | -| 90 | Delivery Price Import Fix | 1/1 | Complete | -| 91 | Print Client Timeout Resilience | 1/1 | Complete | -| 92 | Buyer Name Copy | 1/1 | Complete | -| 93 | Remember Me Login | 1/1 | Complete | -| 94 | Order Preview Popup | 1/1 | Complete | -| 95 | AJAX Table Refresh | 1/1 | Complete | -| 96 | Automation Payment Method Condition | 1/1 | Complete | -| 97 | Project Generation | 1/1 | Complete | -| 98 | Order Imported First Only | 1/1 | Complete | -| 99 | Order Delivery & Payment Edit | 0/1 | Cancelled | -| 100 | Preset Scope & Print UX | 1/1 | Complete | -| 101 | Aged Orders Row Highlight | 1/1 | Complete | -| 102 | Apaczka Receiver Street Length | 1/1 | Complete | -| 103 | Print Autoclick Fix | 1/1 | Complete | -| 104 | Apaczka Weekend Delivery | 1/1 | Complete | -| 105 | Orders Statistics | 1/1 | Complete | - -Archive: `.paul/milestones/v3.0-ROADMAP.md` - -
- -
-v2.3 Email HTML Layout - 2026-03-28 (1 phase, 1 plan) - -HTML header/footer per skrzynka pocztowa z dual-mode edytorem (Quill WYSIWYG + HTML source) i kompozycja email header+body+footer. - -| Phase | Name | Plans | Completed | -|-------|------|-------|-----------| -| 51 | Email HTML Layout | 1/1 | 2026-03-28 | - -Archive: `.paul/phases/51-email-html-layout/` - -
- -
-v2.2 Allegro Shipment Waybill Push - 2026-03-28 (1 phase, 1 plan) - -Automatyczne przekazywanie waybilla do Allegro checkout forms przy tworzeniu przesylki, ograniczone do zamowien `source=allegro` i odporne na bledy API Allegro. - -| Phase | Name | Plans | Completed | -|-------|------|-------|-----------| -| 50 | Allegro Shipment Waybill Push | 1/1 | 2026-03-28 | - -Archive: `.paul/phases/50-allegro-shipment-waybill-push/` - -
- -
-v2.1 Automation History & Observability - 2026-03-28 (1 phase, 1 plan) - -Rozdzielenie Ustawienia > Zadania automatyczne na taby Ustawienia i Historia, wdrozenie audytu wykonan regul (filtry + paginacja), retencja 30 dni oraz akcja update_order_status. - -| Phase | Name | Plans | Completed | -|-------|------|-------|-----------| -| 49 | Automation History Tab | 1/1 | 2026-03-28 | - -Archive: .paul/phases/49-automation-history-tab/ - -
- - -
-v2.0 Email Template Shipment Variables - 2026-03-28 (1 phase, 1 plan) - -Rozszerzenie szablonow e-mail o zmienne przesylki (`przesylka.numer`, `przesylka.link_sledzenia`) oraz provider-aware budowanie linku sledzenia. - -| Phase | Name | Plans | Completed | -|-------|------|-------|-----------| -| 48 | Email Template Shipment Variables | 1/1 | 2026-03-28 | - -Archive: `.paul/phases/48-email-template-shipment-variables/` - -
- -
-v1.9 Shipment Automation Immediate Trigger - 2026-03-28 (1 phase, 1 plan) - -Wdrozenie natychmiastowego eventu automatyzacji po utworzeniu przesylki oraz nowej akcji automatyzacji do zmiany statusu przesylki. - -| Phase | Name | Plans | Completed | -|-------|------|-------|-----------| -| 47 | Shipment Creation Automation | 1/1 | 2026-03-28 | - -Archive: `.paul/phases/47-shipment-created-automation/` - -
- -
-v1.8 Allegro Status Push - 2026-03-28 (1 phase, 1 plan) - -Wdrozenie synchronizacji statusow zamowien w kierunku orderPRO -> Allegro oraz aktywacja opcji kierunku w ustawieniach integracji Allegro. - -| Phase | Name | Plans | Completed | -|-------|------|-------|-----------| -| 46 | Allegro Status Push | 1/1 | 2026-03-28 | - -Archive: `.paul/phases/46-allegro-status-push/` - -
- -
-v1.7 ShopPRO Status Push - 2026-03-27 (1 phase, 1 plan) - -Implementacja synchronizacji statusow zamowien w kierunku orderPRO -> shopPRO. Cron pushuje zmiany statusow do shopPRO API (PUT /api.php?endpoint=orders&action=change_status). - -| Phase | Name | Plans | Completed | -|-------|------|-------|-----------| -| 45 | ShopPRO Status Push | 1/1 | 2026-03-27 | - -Archive: `.paul/phases/45-shoppro-status-push/` - -
- -
-v1.6 Quick Status Change - 2026-03-27 (1 phase, 1 plan) - -Szybka zmiana statusu zamówienia bezpośrednio z listy zamówień — klikalny dropdown w kolumnie statusu, zmiana przez AJAX bez przeładowania strony. - -| Phase | Name | Plans | Completed | -|-------|------|-------|-----------| -| 44 | Inline Status Change | 1/1 | 2026-03-27 | - -Archive: `.paul/phases/44-inline-status-change/` - -
- -
-v1.5 Operational Workflow Cleanup - 2026-03-25 (4 phases, 4 plans) - -Usprawnienia operacyjne: usunięcie bulk print, ograniczenie szumu logów importu Allegro, automatyzacja shipment.status_changed, usuwanie wpisów z kolejki druku. - -| Phase | Name | Plans | Completed | -|-------|------|-------|-----------| -| 40 | Remove Order List Bulk Print | 1/1 | 2026-03-25 | -| 41 | Allegro Import Log Rationalization | 1/1 | 2026-03-25 | -| 42 | Automation Shipment Status Event | 1/1 | 2026-03-25 | -| 43 | Print Queue Entry Removal | 1/1 | 2026-03-25 | - -Archive: `.paul/phases/40-*`, `.paul/phases/41-*`, `.paul/phases/42-*`, `.paul/phases/43-*` - -
- -
-v1.4 UI Readability Tweaks - 2026-03-25 (1 phase, 1 plan) - -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/` - -
- -
-v1.3 Konfiguracja śledzenia przesyłek — 2026-03-23 (1 phase, 1 plan) - -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 | -|-------|------|-------|-----------| -| 29 | Delivery Status Mapping UI | 1/1 | 2026-03-23 | - -Archive: `.paul/phases/29-delivery-status-mapping-ui/` - -
- -
-v1.2 Śledzenie przesyłek — 2026-03-23 (2 phases, 2 plans) - -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 | -|-------|------|-------|-----------| -| 27 | Shipment Tracking Backend | 1/1 | 2026-03-23 | -| 28 | Shipment Tracking UI + Settings | 1/1 | 2026-03-23 | - -Archive: `.paul/phases/27-shipment-tracking-backend/`, `.paul/phases/28-shipment-tracking-ui/` - -
- -
-v1.1 Ręczny numer przesyłki — 2026-03-23 (1 phase, 1 plan) - -Możliwość ręcznego dodania numeru śledzenia przesyłki do zamówienia (bez tworzenia przesyłki przez API przewoźnika). - -| Phase | Name | Plans | Completed | -|-------|------|-------|-----------| -| 26 | Manual Tracking Number | 1/1 | 2026-03-23 | - -Archive: `.paul/phases/26-manual-tracking-number/` - -
- -
-v1.0 Presety przesyłek — 2026-03-22 (3 phases, 3 plans) - -Customowe przyciski szybkiego wypełniania formularza przygotowania przesyłki. Presety globalne z nazwą i kolorem — tworzenie, autofill, edycja, usuwanie. - -| Phase | Name | Plans | Completed | -|-------|------|-------|-----------| -| 23 | Shipment Presets Backend | 1/1 | 2026-03-22 | -| 24 | Shipment Presets UI | 1/1 | 2026-03-22 | -| 25 | Shipment Presets Management | 1/1 | 2026-03-22 | - -Archive: `.paul/phases/23-shipment-presets-backend/`, `.paul/phases/24-shipment-presets-ui/`, `.paul/phases/25-shipment-presets-management/` - -
- -
-v0.9 Poprawki ustawień firmy — 2026-03-22 (1 phase, 1 plan) - -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 | -|-------|------|-------|-----------| -| 22 | REGON Save Fix | 1/1 | 2026-03-22 | - -Archive: `.paul/phases/22-regon-save-fix/` - -
- -
-v0.8 Poprawki wyświetlania źródła zamówień — 2026-03-22 (1 phase, 1 plan) - -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 | -|-------|------|-------|-----------| -| 21 | Order Source Display | 1/1 | 2026-03-22 | - -Archive: `.paul/phases/21-order-source-display/` - -
- -
-v0.7 Zdalne drukowanie etykiet — 2026-03-22 (3 phases, 3 plans) - -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 | -|-------|------|-------|-----------| -| 18 | Print Queue Backend | 1/1 | 2026-03-22 | -| 19 | UI Integration | 1/1 | 2026-03-22 | -| 20 | Windows Client (C# WinForms) | 1/1 | 2026-03-22 | - -Archive: `.paul/phases/18-print-queue-backend/`, `.paul/phases/19-ui-integration/`, `.paul/phases/20-windows-client/` - -
- -
-v0.6 Poprawki UX — 2026-03-22 (1 phase, 1 plan) - -| Phase | Name | Plans | Completed | -|-------|------|-------|-----------| -| 17 | Receipt duplicate guard | 1/1 | 2026-03-22 | - -Archive: `.paul/phases/17-receipt-duplicate-guard/` - -
- -
-v0.5 Moduł Automatyzacji — 2026-03-18 (1 phase, 2 plans) - -| Phase | Name | Plans | Completed | -|-------|------|-------|-----------| -| 16 | Zadania automatyczne | 2/2 | 2026-03-18 | - -Archive: `.paul/phases/16-automated-tasks/` - -
- -
-v0.4 Moduł E-mail — 2026-03-17 (3 phases, 4 plans) - -| 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 | - -Archive: `.paul/milestones/v0.4-ROADMAP.md` - -
- -
-v0.3 Moduł Paragonów — 2026-03-15 (5 phases, 5 plans) - -| 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 | - -Archive: `.paul/milestones/v0.3-ROADMAP.md` - -
- -
-v0.2 Pre-Expansion Fixes — 2026-03-15 (1 phase, 5 plans) - -| Phase | Name | Plans | Completed | -|-------|------|-------|-----------| -| 7 | Pre-Expansion Fixes | 5/5 | 2026-03-15 | - -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-05: InPost ShipmentProviderInterface (natywne ShipX API) - -Archive: `.paul/phases/07-pre-expansion-fixes/` - -
- -
-v0.1 Initial Release — 2026-03-13 (6 phases, 15 plans) - -| Phase | Name | Plans | Completed | -|-------|------|-------|-----------| -| 1 | Tech Debt | 2/2 | 2026-03-12 | -| 2 | Bug Fixes | 4/4 | 2026-03-13 | -| 3 | Tech Debt 2 | 1/1 | 2026-03-13 | -| 4 | Schema Docs | 1/1 | 2026-03-13 | -| 5 | Tech Debt 3 | 1/1 | 2026-03-13 | -| 6 | SonarQube Quality | 6/6 | 2026-03-13 | - -Archive: `.paul/milestones/v0.1-ROADMAP.md` - -
- ---- -*Roadmap created: 2026-03-12* -*Last updated: 2026-05-18 - Phase 145 complete; v3.14 Polkurier COD Return Time Hotfix complete* diff --git a/.paul/SPECIAL-FLOWS.md b/.paul/SPECIAL-FLOWS.md index 07cbe8a..0e2345c 100644 --- a/.paul/SPECIAL-FLOWS.md +++ b/.paul/SPECIAL-FLOWS.md @@ -4,28 +4,28 @@ | Typ pracy | Skill/Komenda | Priorytet | Kiedy | |-----------|---------------|-----------|-------| -| Nowe funkcjonalności (integracje marketplace, przewoźnicy, moduły) | /feature-dev | optional | Przed implementacją każdej nowej funkcji lub integracji | -| Przegląd kodu przed zamknięciem planu (bezpieczeństwo, jakość, SQL) | /code-review | optional | Po implementacji, przed UNIFY | -| Skanowanie jakości kodu po każdym zakończonym planie | `sonar-scanner` (CLI w katalogu projektu) | required | Po APPLY, przed UNIFY — wyniki na https://sonar.project-pro.pl/dashboard?id=orderPRO | +| Nowe funkcjonalnosci (integracje marketplace, przewoznicy, moduly) | /feature-dev | optional | Przed implementacja kazdej nowej funkcji lub integracji | +| Przeglad kodu przed zamknieciem planu (bezpieczenstwo, jakosc, SQL) | /code-review | optional | Po implementacji, przed UNIFY | +| Komponenty UI (listy zamowien, dashboard, formularze, modale) | /frontend-design | optional | Przy tworzeniu nowych widokow lub redesignie istniejacych | +| Refaktoryzacja i upraszczanie kodu po implementacji | /simplify | optional | Po zakonczeniu APPLY, gdy kod wymaga porzadkowania | +| Skanowanie jakosci SonarQube | `sonar-scanner` / `$paul-quality-gate` | manual | Tylko na wyrazne zadanie operatora | -## SonarQube — procedura po skanowaniu +## SonarQube - tryb reczny -Po każdym uruchomieniu `sonar-scanner`: -1. Odpytaj nowe issues przez MCP (`mcp__sonarqube__issues`, project_key: `orderPRO`, tylko `issueStatuses: OPEN`) -2. Porównaj z tym co już jest w `DOCS/todo.md` — dopisz tylko **nowe** issues (których jeszcze nie ma na liście) -3. Format wpisu w `DOCS/todo.md`: `[] [Sonar {data}] {rule} — {opis problemu} ({liczba wystąpień}x)` -4. Grupuj pod nagłówkiem `## SonarQube — {data skanu}` -| Komponenty UI (listy zamówień, dashboard, formularze, modale) | /frontend-design | optional | Przy tworzeniu nowych widoków lub redesignie istniejących | -| Refaktoryzacja i upraszczanie kodu po implementacji | /simplify | optional | Po zakończeniu APPLY, gdy kod wymaga porządkowania | +SonarQube nie jest czescia automatycznego workflow PAUL dla orderPRO. + +- Nie uruchamiaj `sonar-scanner` automatycznie po APPLY ani przed UNIFY. +- Nie oznaczaj braku `sonar-scanner` jako gap w SUMMARY/STATE. +- Uruchamiaj SonarQube tylko po wyraznym poleceniu operatora, np. `uruchom Sonar`, `$paul-quality-gate` albo recznie wskazane `sonar-scanner`. +- Jezeli Sonar zostanie uruchomiony recznie, wyniki mozna dopisac do `DOCS/todo.md` albo `.paul/codebase/quality_risks.md` zgodnie z celem danego skanu. ## Phase Overrides -Brak — domyślne skille wystarczają dla wszystkich faz. +Brak - domyslne skille wystarczaja dla wszystkich nowych planow. ## Templates & Assets -Brak — cały projekt dostępny bezpośrednio w środowisku. +Brak - caly projekt dostepny bezposrednio w srodowisku. --- -*SPECIAL-FLOWS.md — Created: 2026-03-12* -*Updated: 2026-03-12* +*SPECIAL-FLOWS.md - Updated: 2026-05-18* diff --git a/.paul/STATE.md b/.paul/STATE.md index b7528d9..7333538 100644 --- a/.paul/STATE.md +++ b/.paul/STATE.md @@ -5,15 +5,17 @@ See: .paul/PROJECT.md (updated 2026-05-18) **Core value:** Sprzedawca moze obslugiwac zamowienia ze wszystkich kanalow sprzedazy i nadawac przesylki bez przelaczania sie miedzy platformami. -**Current focus:** v3.14 Polkurier COD Return Time Hotfix complete; Phase 145 unified. +**Current focus:** Polish UI Copy plan unified; ready for next PLAN. ## Current Position -Milestone: v3.14 Polkurier COD Return Time Hotfix -Phase: 145 of 145 (Polkurier COD Return Time Hotfix) - Complete -Plan: 145-01 complete -Status: Milestone complete, ready for next milestone or release decision -Last activity: 2026-05-18 13:28 - Unified .paul/phases/145-polkurier-cod-return-time-hotfix/145-01-PLAN.md +Current plan: 20260518-2305-polskie-tlumaczenia - Poprawne polskie tlumaczenia UI - complete +Status: Ready for next PLAN +Last activity: 2026-05-18 23:40 - Unified .paul/plans/20260518-2305-polskie-tlumaczenia/PLAN.md + +Previous milestone: v3.14 Polkurier COD Return Time Hotfix +Previous phase: 145 of 145 (Polkurier COD Return Time Hotfix) - Complete +Previous plan: 145-01 complete Progress: - Milestone v3.14: [##########] 100% (1 of 1 phases complete) @@ -23,16 +25,16 @@ Progress: Current loop state: ``` -PLAN -> APPLY -> UNIFY - done done done [Loop complete - milestone complete] +PLAN --> APPLY --> UNIFY + x x x [Loop complete - ready for next PLAN] ``` ## Session Continuity -Last session: 2026-05-18 13:28 -Stopped at: Phase 145 complete; v3.14 milestone complete -Next action: Run $paul-complete-milestone or start next milestone planning -Resume file: .paul/phases/145-polkurier-cod-return-time-hotfix/145-01-SUMMARY.md +Last session: 2026-05-18 23:40 +Stopped at: Plan 20260518-2305-polskie-tlumaczenia UNIFY complete +Next action: `$paul-plan [next work]` or `$paul-verify .paul/plans/20260518-2305-polskie-tlumaczenia/SUMMARY.md` +Resume file: .paul/plans/20260518-2305-polskie-tlumaczenia/SUMMARY.md ## Pending parallel work - None — Phase 118, 121, 122 wszystkie zacommitowane (8f14851, 360eef1). @@ -87,6 +89,13 @@ Branch: main |----------|---------|-------| | `sonar-scanner` | gap documented | Attempted after APPLY with `sonar-scanner --version`; CLI is not available in PATH. | +### Skill Audit (20260518-2305 Polish UI Copy) + +| Expected | Invoked | Notes | +|----------|---------|-------| +| `sonar-scanner` | gap documented | Attempted after APPLY with `sonar-scanner --version`; CLI is not available in PATH. | +| `jscpd` | invoked | `npx --yes jscpd` succeeded for the targeted UI-copy scope and wrote `.paul/codebase/radar/jscpd-i18n-post-apply/jscpd-report.json`. | + ### Skill Audit (Phase 129) | Expected | Invoked | Notes | @@ -166,6 +175,7 @@ Branch: main ### Blockers / Concerns +- Polish UI Copy APPLY: `sonar-scanner` is unavailable in PATH and manual browser smoke was not run in this session. PHP lint, translation array load check, residual placeholder/mojibake scans, targeted `jscpd`, and `git diff --check` passed. - Phase 145 APPLY: `vendor/bin/phpunit` is missing, so `tests/Unit/PolkurierShipmentServiceTest.php` was linted and covered by an ad-hoc runtime smoke instead of PHPUnit; `sonar-scanner` is unavailable in PATH. - Phase 144 APPLY: `vendor/bin/phpunit` is missing, so `tests/Unit/OrdersRepositoryNotesCountTest.php` was linted and covered by an ad-hoc SQLite runtime smoke instead of PHPUnit; `sonar-scanner` is unavailable in PATH. - Phase 134: `sonar-scanner` is still unavailable in PATH. @@ -185,22 +195,18 @@ Branch: main ## Pending Actions +- Polish UI Copy follow-up: manual smoke main pages with changed copy (`/orders/list`, order detail, settings integrations/templates, accounting, shipments prepare). Sonar is now manual on-demand only. - Phase 145 follow-up: after restoring `vendor/`, run `vendor/bin/phpunit tests/Unit/PolkurierShipmentServiceTest.php`. -- Phase 145 follow-up: run SonarQube scan after restoring `sonar-scanner` in PATH. - Phase 145 follow-up: with explicit operator intent, create one live Polkurier COD shipment and confirm API accepts `codtype='S'` / `return_cod='BA'` without the previous return-time error. - Phase 138 follow-up: run `vendor/bin/phpunit tests/Unit/SmtpSecurityContextFactoryTest.php tests/Unit/TemplateVariableCatalogTest.php` after dependencies are installed. - Phase 139 follow-up: split `OrdersStatisticsRepository` (`php:S1448`, 43 methods) in a future god-class refactor if still relevant. - Phase 139 follow-up: continue with confirmed groups `php:S1142`, `php:S3776`, `php:S1172`, `php:S1192`, `php:S112`, plus Web table/accessibility issues. `php:S4833` is now only 3 core framework require issues. - Phase 140 follow-up: manual smoke `/settings/integrations/shoppro?tab=delivery` -> wybierz Polkurier -> zapisz -> odswiez -> mapowanie pozostaje; potem przygotuj przesylke shopPRO i potwierdz preselect `provider='polkurier'`. -- Phase 140 follow-up: uruchom SonarQube scan po przywroceniu `sonar-scanner` w PATH albo ponownym pobraniu oficjalnego scanner fallback. - Phase 141 follow-up: manual smoke `/settings/integrations` -> potwierdz sekcje marketplace/kurierzy/pozostale, osobne wiersze Allegro Sandbox/Production i poprawne linki Ustawienia. -- Phase 141 follow-up: uruchom SonarQube scan po przywroceniu `sonar-scanner` w PATH albo ponownym pobraniu oficjalnego scanner fallback. - Phase 142 follow-up: manual smoke `/orders/1164/shipment/prepare` -> potwierdz, ze mapowanie shopPRO -> Polkurier preselectuje przewoznika i usluge. - Phase 142 follow-up: `composer install` / przywroc `vendor/`, potem uruchom `vendor/bin/phpunit tests/Unit/ShipmentPreparePolkurierMappingTest.php`. -- Phase 142 follow-up: uruchom SonarQube scan po przywroceniu `sonar-scanner` w PATH albo ponownym pobraniu oficjalnego scanner fallback. - Phase 143 follow-up: manual smoke `/orders/list` -> potwierdz brak boksu "Zamowienia / Kompaktowa lista..." oraz status panel/table layout. - Phase 143 follow-up: manual smoke desktop sidebar -> ustaw `localStorage.sidebarCollapsed='1'`, odswiez strone i potwierdz brak widocznego expanded-to-collapsed flash. -- Phase 143 follow-up: uruchom SonarQube scan po przywroceniu `sonar-scanner` w PATH albo ponownym pobraniu oficjalnego scanner fallback. - Phase 138 manual smoke: test a real SMTP SSL/STARTTLS mailbox in strict mode; test invalid and valid e-mail/SMS template saves in UI. - Manualne testy AC-1..AC-7 dla Phase 112 na zywej bazie (XAMPP online). - Backfill zamowienia #882 - operator robi recznie po wdrozeniu (poza zakresem planu). @@ -260,4 +266,11 @@ Branch: main ## Skill Requirements -- `sonar-scanner` required after APPLY; Phase 139 used the official Windows x64 scanner from `%TEMP%` because the CLI is still not available in PATH. Earlier Phase 116, 117, 121, 122, 128, 129, 130, 131, 132, 133, 134, 135, 136 and 138 gaps remain historical. +- SonarQube / `sonar-scanner` is no longer part of the automatic PAUL PLAN/APPLY/UNIFY workflow for orderPRO. Use it only on explicit operator request via `$paul-quality-gate`, `uruchom Sonar`, or a manually provided `sonar-scanner` command. +- Historical Sonar gaps in older phase summaries remain archival context and should not be carried into new plans as required checks. + +### Codebase Mapped + +Date: 2026-05-18 +Documents: `.paul/codebase/` +Quality Radar: partial (`jscpd` ok through `npx`; `codebase-memory-mcp` installed globally at 0.6.1, enabled in Codex MCP config, and initial index completed in a fresh Codex process: 8165 nodes / 13610 edges; `ast-grep` installed globally and working after Windows wrapper repair) diff --git a/.paul/changelog/2026-05-18.md b/.paul/changelog/2026-05-18.md index 142badb..f00c250 100644 --- a/.paul/changelog/2026-05-18.md +++ b/.paul/changelog/2026-05-18.md @@ -2,6 +2,16 @@ ## Co zrobiono +- [Policy] Dodano opcje autokompresji `.paul/STATE.md` dla PAUL w Codex i Claude Code. +- Nowa preferencja `.paul/config.md`: `state_autocompress: true` oraz `state_autocompress_max_lines: 500`. +- Workflowy PAUL po aktualizacji `STATE.md` maja teraz sprawdzac liczbe linii i kompresowac tylko historyczne/narastajace sekcje, zachowujac biezaca pozycje, `Next action`, `Resume file`, aktywne blokery i aktywne pending actions. +- [Policy] Oznaczono `.paul/ROADMAP.md` jako opcjonalny legacy/release context; `map-codebase` w Codex i Claude Code nie ma go tworzyc ani odswiezac. +- [Plan 20260518-2305-polskie-tlumaczenia] Znormalizowano polskie teksty UI do UTF-8 z polskimi znakami. +- Poprawiono centralny słownik `resources/lang/pl.php`, widoczne hardcoded teksty w widokach, modułach JS i wybranych komunikatach backendu. +- Zachowano techniczne kontrakty: placeholdery `{{zamowienie.*}}` / `{{przesylka.*}}`, routy, form field names, CSS/JS selectors, provider/status codes i API payload keys. +- Quality Radar: `codebase-memory-mcp` i `npx jscpd` działały; globalne `jscpd`, `ast-grep`/`sg` oraz `sonar-scanner` są niedostępne w PATH. jscpd targeted: 226 plików, 397 klonów, 4754 zduplikowane linie. +- Gap: manualny smoke UI Polish UI Copy pozostaje do wykonania po uruchomieniu app/browser session. +- [Policy] Usunieto SonarQube z automatycznego workflow PAUL dla orderPRO. `sonar-scanner` / `$paul-quality-gate` sa teraz reczne, tylko na wyrazne zadanie operatora; brak Sonara nie ma byc raportowany jako gap w nowych PLAN/APPLY/UNIFY. - [Phase 140, Plan 01] Dodano mapowanie form dostawy shopPRO na uslugi Polkurier. - Rozszerzono zakladke `Dostawy` integracji shopPRO o przewoznika Polkurier i wyszukiwalna liste uslug. - Zapis mapowan shopPRO obsluguje `provider='polkurier'` oraz zapis service code i nazwy uslugi w `carrier_delivery_method_mappings`. @@ -34,7 +44,15 @@ - `.paul/PROJECT.md` - `.paul/ROADMAP.md` - `.paul/STATE.md` +- `.paul/config.md` - `.paul/changelog/2026-05-18.md` +- `.paul/plans/20260518-2305-polskie-tlumaczenia/PLAN.md` +- `.paul/plans/20260518-2305-polskie-tlumaczenia/SUMMARY.md` +- `.paul/plans/20260518-2305-polskie-tlumaczenia/translation-audit.txt` +- `.paul/plans/20260518-2305-polskie-tlumaczenia/hardcoded-ui-files.txt` +- `.paul/plans/20260518-2305-polskie-tlumaczenia/residual-ui-scan.txt` +- `.paul/codebase/radar/jscpd-i18n-post-apply/jscpd-report.json` +- `.paul/codebase/radar/codebase-memory-post-apply-polish-ui-copy.txt` - `.paul/phases/140-shoppro-polkurier-delivery-mapping/140-01-PLAN.md` - `.paul/phases/140-shoppro-polkurier-delivery-mapping/140-01-SUMMARY.md` - `DOCS/ARCHITECTURE.md` diff --git a/.paul/changelog/2026-05-19.md b/.paul/changelog/2026-05-19.md new file mode 100644 index 0000000..411cdbb --- /dev/null +++ b/.paul/changelog/2026-05-19.md @@ -0,0 +1,14 @@ +# 2026-05-19 + +## Co zrobiono + +- [Policy] Dodano cleanup handoffow po `$paul-unify` w PAUL dla Codex i Claude Code. +- Po udanym UNIFY usuwane sa tylko aktywne pliki `.paul/handoffs/*-handoff.md` / `*-pause.md` zwiazane z wlasnie zamknietym planem albo wskazane w pre-UNIFY `Resume file`. +- `.paul/handoffs/archive/` pozostaje nietkniety. +- [Policy] Przestawiono PAUL Quality Radar na lekki tryb automatyczny: `codebase-memory-mcp` zostaje wlaczony, a `jscpd` i `ast-grep` sa manual/on-demand. +- Zaktualizowano konfiguracje orderPRO oraz frameworki PAUL dla Codex i Claude Code, aby `jscpd`/`ast-grep` nie byly sprawdzane, instalowane ani uruchamiane automatycznie. +- [Policy] Odchudzono generowany zestaw `.paul/codebase/*.md`: usunieto `index.md`, `structure.md`, `concerns.md`, `domain_duplicates.md` i `tech_changelog.md`. +- `todo.md` pozostaje recznym plikiem operatora i nie bedzie nadpisywany przez `$paul-init` ani `$paul-map-codebase`. +- Zaktualizowano workflowy PAUL dla Codex i Claude Code, zeby nowe mapowanie tworzylo 9 generowanych dokumentow oraz przenosilo ryzyka duplikacji/source-of-truth do `quality_risks.md`. +- [Policy] Dodano globalna zasade, ze tresc dokumentow Markdown generowanych przez PAUL ma byc pisana po polsku; sciezki, komendy, klucze konfiguracji i identyfikatory kodu pozostaja bez tlumaczenia. +- [Maintenance] Przejrzano komendy PAUL dla Codex i Claude Code: dodano lokalny `language_policy` do wszystkich komend, spolszczono `$paul-help` i `$paul-config`, usunieto artefakty starego `CONCERNS.md` / `13 documents`, oraz potwierdzono zgodnosc wrapperow Claude z frameworkiem. diff --git a/.paul/codebase/architecture.md b/.paul/codebase/architecture.md index 0b0c208..7db2ec6 100644 --- a/.paul/codebase/architecture.md +++ b/.paul/codebase/architecture.md @@ -1,616 +1,59 @@ # Architecture +Last refresh: 2026-05-18. + +orderPRO is a PHP 8.4 custom MVC-style application with manual routing and manual dependency wiring. + +## Entry Points + +- HTTP: `public/index.php`. +- Root forwarder: `index.php`. +- Bootstrap: `bootstrap/app.php`. +- CLI migrations: `bin/migrate.php`. +- CLI cron: `bin/cron.php`. + ## Request Flow -``` -HTTP Request - → public/index.php - → bootstrap/app.php (loads config, registers PDO, services) - → Application::boot() (loads routes/web.php) - → Router::dispatch(Request) (matches URL, runs middleware pipeline) - → [Middleware] (AuthMiddleware, ApiKeyMiddleware) - → Controller::method() (parse input → call repository/service → render) - → Template::render() (PHP native, layout composition) - → Response::send() -``` - -## Layer Map - -| Layer | Location | Responsibility | -|-------|----------|----------------| -| Entry | `public/index.php` | Bootstrap only | -| Routes | `routes/web.php` (581 lines) | All ~80 routes; manual DI wiring | -| Core | `src/Core/` (25 files) | Framework infrastructure | -| Controllers | `src/Modules/*/Controller.php` | Request parsing → response | -| Services | `src/Modules/*/Service.php` | Business logic | -| Repositories | `src/Modules/*/Repository.php` | PDO data access (34+ repos) | -| Views | `resources/views/` | PHP templates with `$e()` / `$t()` | -| Components | `resources/views/components/` | Reusable UI blocks | -| Frontend modules | `public/assets/js/modules/` | Small vanilla JS enhancements loaded by layout | - -## Module Inventory (`src/Modules/`) - -| Module | Files | Key Classes | Purpose | -|--------|-------|-------------|---------| -| **Auth** | 3 | `AuthController`, `AuthMiddleware`, `AuthService` | Login/logout, session | -| **Users** | 2 | `UserController`, `UserRepository` | User CRUD | -| **Orders** | 3 | `OrdersController` (1187 LOC), `OrdersRepository` (1221 LOC) | Order list, detail, status, payment, correlated subquery for return-risk | -| **Shipments** | 17 | `ShipmentController`, provider services + tracking services | Shipment creation, label download, tracking polling | -| **Accounting** | 5 | `AccountingController`, `ReceiptService`, `ReceiptRepository` | Receipts, invoices, PDF, Excel export | -| **Email** | 3 | `EmailSendingService`, `VariableResolver`, `AttachmentGenerator` | Template-based email with PDF attachments | -| **Automation** | 6 | `AutomationService` (834 LOC), `AutomationRepository`, `AutomationExecutionLogRepository` | Event→condition→action rules, email triggers | -| **Settings** | 54+ | Integration controllers, OAuth clients, API clients (Fakturownia incl.), mappers | Allegro/shopPRO/Apaczka/InPost/Fakturownia config, status mappings | -| **Sms** | 3 | `SmsMessageRepository`, `SmsConversationService`, `SmsplanetWebhookController` | SMSPLANET outbound order SMS, inbound webhook parsing, order matching | -| **Notifications** | 3 | `NotificationRepository`, `NotificationController`, `NotificationApiController` | Global notification history, unread polling API, mark-read actions | -| **Cron** | 12 | `CronRepository`, `CronHandlerFactory`, handler classes | Scheduled imports, syncs, token refresh | -| **Printing** | 4 | `PrintApiController`, `PrintJobRepository`, `ApiKeyMiddleware` | REST API for Windows print client | -| **Statistics** | 3 | `OrdersStatisticsController`, `OrdersStatisticsRepository`, `statistics-summary-charts.js` | Daily order statistics and monthly summary charts | -| **Info** | 1 | `InfoController` | Health check | - -## Frontend Enhancement Modules - -### Checkbox Multiselect (`public/assets/js/modules/checkbox-multiselect.js`) -- Loaded globally from `resources/views/layouts/app.php`. -- Enhances native `` (lista uslug z `available_carriers`). -- `` synchronizowany z polkurier select przez `syncPolkurierFields()`. -- Brak dedykowanego selektora punktu odbioru — operator wpisuje `receiver_point_id` w istniejacy text input w sekcji Adres odbiorcy (np. `POP-RZE54`). Format string `POP-RZE54 | Lukasiewicza 78, 35-604 Rzeszow` z importu zamowienia nie jest parsowany — operator skraca recznie. -- JS toggle widocznosci paneli rozszerzony o polkurier; `clearHiddenFields()` czysci `service_code`; `showPanel('polkurier')` ustawia `provider_code='polkurier'`. - -### Rozmiar etykiety A4 vs A6 -- API polkurier nie udostepnia parametru sterowania rozmiarem etykiety w `get_label` ani `create_order` (zweryfikowane w PDF v1.11). -- Domyslny rozmiar ustawiany jest w **panelu klienta polkurier.pl → Ustawienia konta → Preferencje etykiet** (per-konto, globalnie dla wszystkich `get_label` calli). -- `polkurier_integration_settings.default_label_format` (PDF/ZPL/EPL) sluzy tylko typowi pliku, NIE rozmiarowi. - -### Seed delivery_status_mappings (`20260514_000115_seed_polkurier_delivery_status_mappings.sql`) -- 7 wpisow `provider='polkurier'` (kody z oficjalnej tabeli ORDER_STATUS w PDF v1.11): - - `O` → `created` (Oczekuje na platnosc) - - `P` → `confirmed` (Potwierdzone, list wygenerowany) - - `A` → `cancelled` (Anulowane) - - `WP` → `in_transit` (W przewozie) - - `D` → `delivered` (Dostarczona) - - `Z` → `returned` (Zwrot do nadawcy) - - `W` → `problem` (Wyjatek) -- Idempotentne: `ON DUPLICATE KEY UPDATE normalized_status / description / updated_at`. - -### Boundaries / co NIE zostalo zmienione -- Apaczka (`ApaczkaShipmentService`, `ApaczkaTrackingService`, `apaczka_integration_settings`) niezalezna, dziala obok polkuriera. -- `ShipmentProviderInterface` i `ShipmentTrackingInterface` kontrakty niezmienione. -- `getInpostParcelMachines`/`getCourierPoints` w API client zaimplementowane ale nieuzywane przez UI w Phase 128 (operator wpisuje punkt recznie). -- `cancelOrder` zaimplementowane w API client ale nie wywolywane z UI/cron — operator anuluje w panelu polkuriera. -- Brak presetow przesylek dla polkuriera (`shipment_presets.provider_code='polkurier'`) — kolejna faza. - -## Phase 121 - SMSPLANET Conversation + Notifications - -### SmsConversationService (`src/Modules/Sms/SmsConversationService.php`) -- Wysyla SMS z poziomu zamowienia przez `SmsplanetApiClient`, dopisuje `default_footer` gdy jest skonfigurowana, zapisuje finalna tresc w `sms_messages` i uzywa `sender_mode` do wyboru nadpisu albo numeru 2WAY. -- Parsuje publiczny webhook `/webhooks/smsplanet/inbound`, normalizuje telefony i dopasowuje przychodzacy SMS do najnowszego zamowienia po telefonie klienta/adresu. -- Endpoint inbound akceptuje POST i GET; format 2WAY `message=` jest dekodowany, sukces zwraca plain `OK`, a dopasowanie zamowienia korzysta z `order_addresses.phone`. -- Tworzy `notifications.type='sms_inbound'` z linkiem do `/orders/{id}?tab=sms`. - -### Notifications module -- `/notifications` pokazuje historie powiadomien i pozwala oznaczac wpisy jako przeczytane. -- `/api/notifications/unread` zasila topbar badge oraz `public/assets/js/modules/notifications.js`. -- Browser Notification API jest progresywne: brak zgody nie blokuje strony ani pollingu. - -## Phase 123 — Receipts Export VAT Breakdown - -### ReceiptService::buildItemsSnapshot (`src/Modules/Accounting/ReceiptService.php`) -- Snapshot pozycji w `receipts.items_json` ma teraz pole `vat` (procent jako float). Zrodlo: `order_items.tax_rate` (fallback `item.vat`, ostatecznie 23.0). -- Pozycja "Koszt wysylki" (gdy `delivery_price > 0`) dostaje `vat = 23.0`. -- Stary kontrakt (`name`, `quantity`, `price`, `total`, `sku`, `ean`) zachowany — tylko dodatek pola `vat`. Widoki paragonu (print/preview) nie wymagaja zmian. - -### AccountingController::export (`src/Modules/Accounting/AccountingController.php`) -- Naglowki XLSX: `Numer | Data wystawienia | Kwota brutto | Kwota netto | Stawka VAT | Kwota VAT`. Usunieto: Data sprzedazy, Konfiguracja, Nr zamowienia, Nr referencyjny. -- `buildVatBreakdown(itemsJson, totalNet, totalGross)` grupuje pozycje `items_json` po `vat`, oblicza per-grupa `net = round(gross / (1 + rate/100), 2)` i `vat = gross - net`. Zwraca liste `[{rate_label, net, vat}, ...]` posortowana malejaco po stawce. -- Legacy fallback: gdy zaden item nie ma klucza `vat`, zwraca pojedynczy wiersz `[{rate_label: '23%', net: total_net, vat: total_gross - total_net}]`. -- Multi-rate paragon = wiele wierszy w XLSX (ten sam Numer, Data wystawienia i Kwota brutto powtarzane). -- Helper `formatVatRate()` formatuje stawke (23.0 -> "23%", 7.5 -> "7.5%"). - -## Phase 135 — Accounting Net Correctness - -### ReceiptService::buildItemsSnapshot (`src/Modules/Accounting/ReceiptService.php`) -- Dla nowych paragonow snapshot nadal zachowuje kontrakt `name`, `quantity`, `price`, `total`, `vat`, `sku`, `ean`. -- Metoda zwraca teraz takze `total_net`; `ReceiptService::issue()` zapisuje `receipts.total_net` z sumy netto per linia zamiast kopiowac brutto. -- Netto pozycji: `lineGross / (1 + vat/100)` z VAT z `tax_rate`/`vat`; brak stawki oznacza fallback 23.0. -- Koszt wysylki pozostaje osobna pozycja "Koszt wysylki" z VAT 23.0; operator zdecydowal, ze historyczne paragony nie sa backfillowane. - -### OrdersStatisticsRepository::netAmountSql (`src/Modules/Statistics/OrdersStatisticsRepository.php`) -- Statystyki dzienne preferuja `orders.total_without_tax`, potem `orders.total_net`, jezeli wartosc jest dodatnia. -- Gdy net z zamowienia jest pusty, repozytorium liczy fallback z `order_items`: najpierw `original_price_without_tax * quantity`, potem `original_price_with_tax * quantity / (1 + tax_rate/100)`. -- Dla pozycji bez VAT fallback stawki wynosi 23.0; dostawa bez osobnej stawki jest doliczana jako `delivery_price / 1.23`. -- Stare `gross / 1.23` pozostaje tylko jako ostatni fallback dla legacy zamowien bez uzywalnych pozycji. - -## Phase 120 — Alert Component Unification - -### Alert component (`resources/views/components/alert.php`) -- Reusable alert renderer with params: `$type` (info|success|warning|danger; fallback 'info'), `$message` (escaped) lub `$messageHtml` (trusted), `$dismissible` (default true), `$role` ('alert'|'status'). -- Renders inline SVG icon per type + body + optional dismiss button. Markup: `
...
`. -- Used via `include __DIR__ . '/../components/alert.php'` po ustawieniu lokalnych `$type/$message/$dismissible`. - -### SCSS — `.alert` w `resources/scss/shared/_ui-components.scss` -- `.alert` jest teraz flex (icon + body + dismiss). Dodane: `.alert__icon`, `.alert__body`, `.alert__dismiss`. -- Nowy wariant `.alert--info` (blue: border #bfdbfe, bg #eff6ff, color #1e3a8a) — wczesniej brakowal i renderowal sie jako czarny tekst na bialym tle. -- Wariantow `--success/--warning/--danger` nie zmieniono kolorystycznie. -- Wrapper `.alerts-stack` (gap 8px) do stackowania wielu alertow z layoutu. - -### JS — `public/assets/js/modules/alert-dismiss.js` -- Vanilla JS, idempotent guard (`window.__alertDismissBound`). -- Delegated click handler na `[data-alert-dismiss]` — usuwa najblizszy `[data-alert]` z DOM bez przeladowania. -- Ladowany globalnie w `layouts/app.php`, `layouts/auth.php`, `layouts/public.php`. - -### Flash — `App\Core\Support\Flash` rozszerzenie -- Nowa kolejka typowana `$_SESSION['_flash_queue']` z entries `{type, message}`. -- `Flash::push(string $type, string $message): void` — append do kolejki (whitelist info/success/warning/danger, fallback info). -- `Flash::all(): array` — zwraca i czysci kolejke + skanuje legacy `_flash` (heurystyka klucza: `error/fail/danger` → danger, `warning` → warning, `success/.save/.created/.deleted/.toggled` → success, reszta → info). BC zachowany: `Flash::set/get` dziala bez zmian. - -### Centralny renderer flash w layoutach -- `layouts/app.php`, `layouts/auth.php`, `layouts/public.php` na poczatku glownego content area iteruja `Flash::all()` i wlaczaja komponent `alert.php` per wpis (wrap `.alerts-stack`). -- Kontrolery NIE wymagaly zmian — pre-fetched `Flash::get('module.key', '')` przekazany do widoku jako lokalna zmienna jest dalej renderowany inline przez widok (przez ten sam komponent). Centralny renderer przejmuje wpisy `Flash::push(...)` oraz nieskonsumowane legacy entries. - -### Migracja widokow -- Wszystkie inline `
...
` w widokach (36 plikow razem ze `shipments/prepare.php` i `orders/show.php`) zastapione przez ``. -- `.flash--error` / `.flash--success` w `orders/show.php` i `shipments/prepare.php` zastapione komponentem (klasa `.flash--*` w SCSS pozostaje bez uzycia, deferred cleanup). -- Wyjatek: `settings/email-mailboxes.php` ma JS-generowane alerty (`resultDiv.className = 'mt-12 alert alert--success'`) z dynamicznej odpowiedzi AJAX test polaczenia SMTP — uzywaja klas SCSS bez markupu komponentu (out of scope dla tej fazy). - -## Phase 114 — Accounting Configs Refactor - -### Sekcja Ksiegowosc — struktura URL -- `/settings/accounting` — hub-rozdroze z 2 kartami: "Paragony" i "Faktury". `ReceiptConfigController::hub()`. -- `/settings/accounting/receipts` — lista konfiguracji paragonow. `ReceiptConfigController::list()`. -- `/settings/accounting/receipts/new`, `/edit?id=N` — formularz na osobnej podstronie. `ReceiptConfigController::edit()`. -- `/settings/accounting/receipts/save|toggle|delete` — POST actions. -- **Legacy aliasy:** `/settings/accounting/save|toggle|delete` (POST) zostaja jako duplicate routes (wsteczna kompatybilnosc z `
` w starszych szablonach/bookmarkach). -- `/settings/accounting/invoices` + `/new`, `/edit`, `/save`, `/toggle`, `/delete` — analogicznie dla `invoice_configs`. `InvoiceConfigController`. - -### InvoiceConfigRepository (`src/Modules/Settings/InvoiceConfigRepository.php`) -- `listAll()` JOIN `invoice_configs LEFT JOIN integrations` (`type='fakturownia'`) — zwraca `integration_name` gdy `is_delegated=1`. -- `save(array $data): int` — walidacja serwerowa wszystkich pol. Krytyczna regula: gdy `is_delegated=1` musi byc `integration_id > 0` wskazujacy na `integrations.type='fakturownia'`, inaczej rzuca `IntegrationConfigException`. Gdy `is_delegated=0`, ignoruje `integration_id` (NULL). -- `toggleStatus(int $id)` przez `ToggleableRepositoryTrait::toggleActive()`. -- `delete(int $id)` — pre-check `SELECT 1 FROM invoices WHERE config_id` zeby zwrocic czytelny PL komunikat zamiast brzydkiego SQLSTATE z FK RESTRICT. - -### Seed -- Migracja `20260511_000107_seed_default_invoice_config.sql` — idempotentny insert `Domyslny VAT` (NOT EXISTS guard, `invoice_configs.name` nie jest UNIQUE). - -### invoice-config-form.js (`public/assets/js/modules/invoice-config-form.js`) -- Vanilla JS modul ladowany globalnie przez `layouts/app.php`. -- Toggle widocznosci `[data-invoice-delegation]` wrappera w zaleznosci od stanu `[data-invoice-delegated]` checkboxa. -- Ustawia `select[name=integration_id].required` zgodnie ze stanem checkboxa; przy unchecked czysci `value`. - -### Ujednolicony wyglad list paragonow/faktur -- Tabela `table.table` w `table-wrap`, badge `badge--{success,muted}` na statusy. -- Edycja przez ``, toggle/delete przez `` z `_token` i `js-confirm-delete`. -- Wspolny pattern miedzy `accounting-receipts.php` i `accounting-invoices.php` (faktury maja dodatkowe kolumny: Tryb, Konto Fakturowni). - - -## Phase 124 — SMS Templates - -### SmsTemplateRepository (`src/Modules/Sms/SmsTemplateRepository.php`) -- CRUD na `sms_templates` (PDO prepared statements, ToggleableRepositoryTrait). -- `listAll()` (cala lista alfabetycznie po `name`), `listActive()` (tylko is_active=1, kolumny `id|name|body` do dropdownu w UI). -- `save(array): int` waliduje wymagane `name` + `body` (rzuca `RuntimeException` gdy puste); wykonuje INSERT albo UPDATE wg obecnosci `id` w payloadzie; zwraca id rekordu. -- `delete(int)`, `toggleStatus(int)` przez `toggleActive('sms_templates', $id)`. - -### SmsVariableResolver (`src/Modules/Sms/SmsVariableResolver.php`) -- Wydzielony z `Email\VariableResolver` — wspolna logika zmiennych dla Email i SMS. -- `buildVariableMap(order, addresses, companySettings)` zwraca mape placeholderow: `zamowienie.*`, `kupujacy.*`, `adres.*`, `firma.*`, `przesylka.*` (`przesylka.numer`/`przesylka.link_sledzenia` z najnowszej paczki przez `ShipmentPackageRepository::findLatestByOrderId` + `DeliveryStatus::trackingUrl`). -- `resolve(template, variableMap)` zastepuje `{{group.var}}` wartoscia z mapy (puste gdy brak klucza). - -### Email\VariableResolver (refaktor) -- Pozostaje final class z tym samym API publicznym (`buildVariableMap`/`resolve`) — `EmailSendingService` niezmieniony. -- Konstruktor: `(ShipmentPackageRepository $repo, ?SmsVariableResolver $inner = null)`. Gdy `$inner` nie podany, sam tworzy SmsVariableResolver — backward compat dla starego wiringu. -- Metody publiczne deleguja do `$this->inner` — zero duplikacji logiki zmiennych. - -### SmsTemplateController (`src/Modules/Settings/SmsTemplateController.php`) -- Mirror `EmailTemplateController` bez Quill/skrzynki/zalacznika/duplikacji. -- Akcje: `index` (lista), `create`/`edit`/`save` (form CRUD), `delete`, `toggleStatus` (AJAX JSON), `getVariables` (JSON paleta dla ewentualnego dynamic palette). -- `VARIABLE_GROUPS` jako stala klasy — pelne 5 grup (zamowienie/kupujacy/adres/firma/przesylka) zgodnie ze wspolnym SmsVariableResolver. -- Routy: `/settings/sms-templates`, `/create`, `/edit`, `/save`, `/delete`, `/toggle`, `/variables`. CSRF `_token` na POST. Flash `settings.sms_templates.success|error`. - -### OrdersController (rozszerzenie) -- Dodane optional params konstruktora: `?SmsTemplateRepository $smsTemplates`, `?SmsVariableResolver $smsVariableResolver`, `?CompanySettingsRepository $companySettingsRepo` (po istniejacych SMS params; default null = backward compat). -- `show()` przekazuje `$smsTemplates` (list active) do widoku jako `smsTemplates`. -- Nowa metoda `smsTemplate(Request)` -> `GET /orders/{id}/sms/template?template_id=N` -> JSON `{ok, body, name}` z rozwinietymi zmiennymi. 400/404/500 dla nieprawidlowych parametrow/braku rekordu. - -### Widok `orders/show.php` -- Nad textarea `name="message"` (`#js-sms-message`) dodany conditional ` - -// Validate (in controller) -if (!Csrf::validate((string) $request->input('_token', ''))) { ... } -``` - -Field name is always `_token`. Uses `hash_equals()` for timing-safe comparison. - -### XSS Escaping - -All user-controlled output escaped with `$e()` helper (available in all views): - -```php -$e = fn(mixed $v): string => htmlspecialchars((string)$v, ENT_QUOTES, 'UTF-8'); - -// Usage - - -``` - -**Never** output raw variables without `$e()`. - -### Session - -Configured with: `cookie_httponly=true`, `cookie_secure=true`, `cookie_samesite=Lax`, `use_strict_mode=true`. -Access via `Session::get()` / `Session::set()` helpers — not raw `$_SESSION` in business logic. - -## Controller Pattern - -```php -final class OrdersController { - public function __construct( - private readonly Template $template, - private readonly Translator $translator, - private readonly OrdersRepository $orders, - // ... - ) {} - - public function index(Request $request): Response { - // 1. Parse & validate input - $filters = ['search' => trim((string) $request->input('search', ''))]; - - // 2. Call repository - $result = $this->orders->paginate($filters); - - // 3. Prepare view data - $rows = array_map(fn($row) => $this->toTableRow($row), $result['items']); - - // 4. Render - return Response::html( - $this->template->render('orders/index', ['rows' => $rows], 'layouts/app') - ); - } -} -``` - -## View Pattern - -Views use two magic helpers injected by `Template::renderFile()`: -- `$e($value)` — HTML-escape -- `$t($key, $replace)` — translate - -Layout composition: -```php -$this->template->render('orders/index', $data, 'layouts/app') -// renders views/orders/index.php, wraps in views/layouts/app.php via $content -``` - -## UI Rules - -### Alerts & Confirmations -- **Always** use `window.OrderProAlerts.confirm({message, onConfirm})` from `jquery-alerts.js` -- **Never** use native `alert()` or `confirm()` - -### CSS / SCSS -- All styles go in `resources/scss/` — never inline `