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


