# Milestones Completed milestone log for this project. | Milestone | Completed | Duration | Stats | |-----------|-----------|----------|-------| | v0.1 Initial Release | 2026-03-13 | 2 days | 6 phases, 15 plans | | v0.2 Pre-Expansion Fixes | 2026-03-15 | 2 days | 1 phase, 5 plans | | v0.3 Moduł Paragonów | 2026-03-15 | 1 day | 5 phases, 5 plans | | v3.0 Mobile Responsive | 2026-04-19 | ~5 tygodni | 52 phases shipped, 55 plans | --- ## ✅ v3.0 Mobile Responsive **Completed:** 2026-04-19 **Duration:** ~5 tygodni (2026-03-15 → 2026-04-19) ### Stats | Metric | Value | |--------|-------| | Phases shipped | 52 (z zakresu 52–105) | | Phases deferred | 1 (Phase 68 Code Deduplication Refactor) | | Phases cancelled | 1 (Phase 99 Order Delivery & Payment Edit) | | Plans completed | 55 | | Files changed | ~250+ | ### Key Accomplishments - **Mobile UI core:** hamburger menu, slide-in sidebar, status panel toggle, image hover zoom, collapsed sidebar fix (Phase 52–55). - **Order payments i automation events:** reczne platnosci + push `set_paid` do shopPRO; `payment.status_changed`, `order.status_changed`, `order.status_aged`, `order.imported`, `shipment.created/status_changed`, warunki statusowe i `payment_method` (Phase 56–61, 84, 95–96, 98). - **Import re-import safety + personalizacja:** ochrona pol lokalnych przy re-imporcie shopPRO, activity log rozroznia import/aktualizacje, custom_fields + message jako personalizacja pozycji (Phase 62–63, 75, 79). - **Receipts:** DATETIME precision, koszt wysylki jako pozycja, bugfix `buildItemsSnapshot`/`delivery_price` (Phase 64, 70, 90). - **PAUL framework:** Delegated Apply + Codex Executor (Phase 65, 67). - **Tracking Allegro i shopPRO:** English statuses, pull mapping, push statusow orderPRO→shopPRO/Allegro, Delivery Tracking (Phase 66, 69, 74–75, 83). - **Przesylki:** preset auto-submit, przekazywanie waybill do Allegro, Apaczka COD bank account, Apaczka long-street truncation, Weekend Delivery (InPost), delete z szczegolow zamowienia, User-Agent header z publiczna /info (Phase 78, 86–89, 102, 104). - **Listowanie i wyszukiwanie:** per_page w localStorage, search po produkcie, tooltipy, AJAX refresh, status group filter, global search w topbarze, aged highlight, popup preview (Phase 72–73, 80–82, 85, 94–95, 101). - **Remember Me login, buyer name copy, info page** (Phase 92–93, 89). - **Print pipeline:** resilient polling 3-layer timeout w OrderPROPrint, preset scope + print UX, auto-click najnowszej etykiety (Phase 91, 100, 103). - **Project generation (PSD):** polautomatyczne generowanie projektow graficznych z zamowien + `external_status_id` → `status_code` rename + flagi statusu projektu (Phase 97). - **Statistics (ostatnia faza):** dzienny raport zamowien `/statistics/orders` z filtrami (daty/kanaly/grupy statusow) i stopka `Podsumowanie`; hotfix collation MySQL; fallback netto 23% VAT (Phase 105). ### Key Decisions | Decision | Rationale | |----------|-----------| | Event `order.imported` tylko przy pierwszym imporcie + backfill statusow | Unikniecie duplikatow reakcji automatyzacji, poprawa starych zamowien w_realizacji→wyslane | | Push waybill do Allegro niekrytyczny dla lokalnej paczki | Blad API Allegro nie blokuje utworzenia przesylki; tylko dla `source=allegro` | | Historia automatyzacji audytowana per rule + retencja 30 dni | Observability bez recznego utrzymania danych | | Preset przesylek nadpisuje tylko wymiary+wage + auto-submit | Spojnosc z polityka single responsibility preseta | | `_token` CSRF field standardized | Eliminacja konfliktu nazw z wczesnego `_csrf_token` | | Statistics channelSql: `CAST(int AS CHAR) COLLATE utf8mb4_unicode_ci` | Unikniecie `1271 Illegal mix of collations`; pattern dla przyszlych raportow per-integration | | Statistics netto fallback `/ 1.23` | shopPRO nie wysyla netto ani w zamowieniu ani w items — tymczasowy fallback; docelowy fix opisany w `.paul/TODO.md` (STAT-NET) | | Phase 68 deferred | Refaktor deduplikacyjny wymaga wiekszego kontekstu — przeniesiony na pozniej | ### Deferred to Next Milestone - **STAT-NET:** netto z shopPRO / `order_items.tax_rate` (unikniecie sztywnego 23% VAT). - **Phase 68 Code Deduplication Refactor** (`0/2`, Planning). - **Mobile Orders List / Mobile Order Details / Mobile Settings** — TBD z tabeli ROADMAP. --- ## ✅ v0.3 Moduł Paragonów **Completed:** 2026-03-15 **Duration:** 1 day (2026-03-15) ### Stats | Metric | Value | |--------|-------| | Phases | 5 (8-12) | | Plans | 5 | | Files changed | ~25 | ### Key Accomplishments - **DB Foundation:** 4 migracje (receipts, receipt_configs, receipt_number_counters, company_settings extended) - **Konfiguracja paragonów:** CRUD w Ustawienia > Księgowość — wielokonfiguracyjne szablony numeracji - **Wystawianie paragonów:** Formularz z zamówienia, snapshoty JSON (seller/buyer/items), atomowe numerowanie INSERT ON DUPLICATE KEY UPDATE - **Podgląd i druk:** HTML preview w layoucie, standalone print z auto window.print(), PDF via dompdf v3.1 - **Sekcja Księgowość:** Lista paragonów z filtrami, paginacją, sortowaniem, zaznaczaniem checkboxami - **Eksport XLSX:** PhpSpreadsheet v5.5 — eksport zaznaczonych lub wszystkich z filtra (POST + CSRF) - **Moduł Accounting:** Osobny namespace App\Modules\Accounting z ReceiptController, AccountingController, ReceiptRepository ### Key Decisions | Decision | Rationale | |----------|-----------| | Snapshot pattern: seller/buyer/items jako JSON | Dane zamrożone w momencie wystawienia — niezależne od zmian źródła | | Atomowe numerowanie: INSERT ON DUPLICATE KEY UPDATE | Bezpieczne kolejne numery paragonów bez race conditions | | Moduł Accounting w osobnym namespace | Separacja od Settings — przyszłe rozszerzenie księgowości | | dompdf v3.1 server-side PDF | Standard PHP, DejaVu Sans dla polskich znaków | | PhpSpreadsheet v5.5 dla XLSX | Lepszy od CSV dla księgowości — formatowanie, polskie znaki | | POST eksport z CSRF + dwa tryby | Bezpieczny; zaznaczone IDs lub wszystkie z filtra | | ftp-kr vendor/ nie ignorowany | Zmiana z /vendor na /vendor/bin — auto-upload zależności na serwer | --- ## ✅ v0.1 Initial Release **Completed:** 2026-03-13 **Duration:** 2 days (2026-03-12 → 2026-03-13) ### Stats | Metric | Value | |--------|-------| | Phases | 6 | | Plans | 15 | | Files changed | ~45 | ### Key Accomplishments - **AllegroTokenManager** wydzielony z 4 klas — usunięto ~85 linii duplikatu logiki OAuth - **StringHelper** centralizuje 19 kopii helperów (nullableString, normalizeDateTime, normalizeColorHex) z 15+ klas - **CronHandlerFactory** jako jedyne miejsce kompozycji crona — naprawiono rozbieżność Application.php / bin/cron.php + 2 bugi w zależnościach - **ZPL label page size** naprawiony — martwy warunek `'ZPL' ? 'A6' : 'A6'` → `'ZPL' ? 'A6' : 'A4'` - **AllegroStatusSyncService** — kursor `last_status_checked_at` eliminuje skanowanie wszystkich zamówień - **ShopproOrderSyncStateRepository** — poprawna zależność (poprzednio używano Allegro repo) - **CSRF standardization** — `_csrf_token` → `_token` w całym projekcie - **5 kompensujących migracji** zaadnotowanych — DB_SCHEMA.md ma sekcję Compensating Migrations - **Flash::set()/Flash::get()** — 10 bezpośrednich `$_SESSION` writes zastąpiono w kontrolerach - **Typowane wyjątki** — hierarchia OrderProException (6 klas) eliminuje 95× RuntimeException - **Stałe IntegrationSources + RedirectPaths** — 40+ powtarzających się literałów zebranych w 2 klasy - **Złożoność kognitywna** — loadDeliveryServices() w 2 kontrolerach spłaszczone z 5 do 2 poziomów zagnieżdżenia - **ShopproOrdersSyncService** podzielony 39→9 metod via ShopproOrderMapper + ShopproProductImageResolver - **AllegroIntegrationController** podzielony 35→25 metod via 2 nowe kontrolery mapowań - **SonarQube S1448** zredukowane 6x → 2x; S112 z 95x do 0; S1192 z 40x do 0 ### Key Decisions | Decision | Rationale | |----------|-----------| | AllegroTokenManager wydzielony z 4 klas | Eliminacja duplikacji logiki odświeżania tokenów | | StringHelper jako final static class | Centralizacja 19 kopii helperów | | CronHandlerFactory — jedyne miejsce kompozycji crona | Synchronizacja Application.php i bin/cron.php | | CSRF pole: `_token` (nie `_csrf_token`) | Standard dla całego projektu | | Flash::set()/Flash::get() zamiast $_SESSION | Jeden mechanizm flash w całej aplikacji | | validateXxxInput(): ?string / validateXxxAccess(): ?Response | Wzorzec helperów walidacji — ≤3 return statements | | God class split via move-method | Czysty podział bez zmiany logiki — ShopproOrdersSyncService 39→9 metod | | AllegroIntegrationController pozostaje przy 25 metodach | Pełny podział wymaga AllegroImportScheduleService — deferred | ---