# 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. ## 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 State | Attribute | Value | |-----------|-------| | Version | 1.0.0 | | Status | v2.3 Complete | | Last Updated | 2026-03-28 | ## Requirements ### Validated (Shipped) - [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] 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 - [x] Usuniecie bulk print "Drukuj etykiety" z listy zamowien (`/orders/list`) wraz z endpointem bulk - Phase 40 - [x] Ograniczenie szumu logow importu Allegro i deduplikacja wpisow activity log - Phase 41 - [x] Automatyzacja: event `shipment.status_changed` + warunki statusowe przesylki - Phase 42 - [x] Usuwanie wpisu z kolejki druku etykiet z panelu ustawien - Phase 43 - [x] Szybka zmiana statusu zamowienia z listy zamowien (inline dropdown + AJAX) - Phase 44 - [x] Synchronizacja statusow orderPRO -> shopPRO (cron push, reverse mapping, PUT API) — Phase 45 - [x] Synchronizacja statusow orderPRO -> Allegro (cron push, reverse mapping, fulfillment status update API) - Phase 46 - [x] Automatyzacja przesylek: natychmiastowy event `shipment.created` + akcja `update_shipment_status` - Phase 47 - [x] Szablony e-mail: zmienne `przesylka.numer` i `przesylka.link_sledzenia` z provider-aware linkiem sledzenia - Phase 48 - [x] Automatyzacja: tab Historia z filtrowaniem/paginacja + retencja 30 dni + akcja update_order_status - Phase 49 - [x] Allegro: automatyczne przekazywanie numeru przesylki do checkout form po utworzeniu paczki (tylko source=allegro) - Phase 50 - [x] Email HTML Layout: header/footer HTML per skrzynka pocztowa, dual-mode edytor (Quill + HTML source), kompozycja header+body+footer, podglad — Phase 51 - [x] Mobile Main Menu: hamburger, slide-in overlay sidebar, backdrop na mobile <=768px — Phase 52 - [x] Mobile Status Panel Toggle: zwijany/rozwijany panel statusow na /orders/list — Phase 53 - [x] Order Detail Image Hover: hover zoom na miniaturkach produktow w /orders/{id} — Phase 54 - [x] Desktop Collapsed Sidebar Fix: ukrycie etykiet, centrowanie ikon w zwiniętym sidebarze — Phase 55 - [x] Dodawanie płatności ręcznych + push set_paid do shopPRO — Phase 56 - [x] Automatyzacja: event `payment.status_changed` + warunek `payment_status` (0/1/2) — Phase 57 - [x] Zachowanie danych formularza automatyzacji po bledzie walidacji — Phase 58 - [x] Automatyzacja: event `order.status_changed` + warunek `order_status` — Phase 59 - [x] Automatyzacja: event `order.status_aged` (cron) + warunek `days_in_status` — Phase 60 - [x] Aktywacja przycisku Platnosc w headerze zamowienia + poprawa odstepu w formularzu platnosci — Phase 61 - [x] Ochrona danych lokalnych przy re-imporcie + rozroznienie import/aktualizacja w activity log shopPRO — Phase 62 - [x] Import i wyswietlanie personalizacji produktow z shopPRO (custom_fields) + naprawa daty zamowienia — Phase 63 - [x] Data wystawienia paragonu z dokladnoscia do godziny i minuty (DATE -> DATETIME) — Phase 64 - [x] Koszt wysylki jako pozycja paragonu (bugfix buildItemsSnapshot + delivery_price) — Phase 70 - [ ] Eliminacja zduplikowanego kodu: SslCertificateResolver, ToggleableRepositoryTrait, RedirectPathResolver, ReceiptService — Phase 68 ### Active (In Progress) - [ ] Wersja mobilna — modul po module (v3.0) ### Planned (Next) - [ ] ZarzÄ…dzanie produktami - [ ] ZarzÄ…dzanie stanami magazynowymi ### Out of Scope - [Do zdefiniowania podczas planowania] ## 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ĹĽÄ… ## 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. **Technical Context:** 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 - 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) - Pole CSRF w formularzach HTTP: zawsze `_token` (nie `_csrf_token`) ### Business Constraints - [Do zdefiniowania podczas planowania] ## Key Decisions | 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 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 | | Event automatyzacji `shipment.created` uruchamiany natychmiast po utworzeniu paczki | Reakcje automatyzacji nie czekaja na cron tracking; przeplyw jest natychmiastowy | 2026-03-28 | Active | | Akcja `update_shipment_status` emituje `shipment.status_changed` tylko przy realnej zmianie | Brak petli automatyzacji i brak falszywych triggerow | 2026-03-28 | Active | | Zmienne e-mail przesylki bazuja na najnowszej paczce `shipment_packages` i `DeliveryStatus::trackingUrl` | Jeden spojny kontrakt dla numeru i linku sledzenia w szablonach | 2026-03-28 | Active | | Historia automatyzacji zapisywana per regula (success/failed) i czyszczona cronem po 30 dniach | Audyt wykonywania regul bez recznego utrzymania danych | 2026-03-28 | Active | | Akcja update_order_status korzysta z OrdersRepository::updateOrderStatus | Spojnosc z historia statusow i activity log bez duplikowania logiki | 2026-03-28 | Active | | Push waybilla do Allegro checkout forms wykonywany tylko dla zamowien source=allegro i jest niekrytyczny dla lokalnego tworzenia paczki | Eliminacja recznego kroku po stronie Allegro bez ryzyka utraty lokalnie utworzonej przesylki przy bledzie API | 2026-03-28 | 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 | ## Tech Stack | Layer | Technology | Notes | |-------|------------|-------| | Framework | PHP (custom/Laravel) | XAMPP lokalnie | | 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 | | Testing | PHPUnit 11.5 + dg/bypass-finals | Unit tests w tests/Unit/ | ## Specialized Flows 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) --- *PROJECT.md — Updated when requirements or context change* *Last updated: 2026-03-28 after Phase 51 completion (Email HTML Layout)*