Files
orderPRO/.paul/MILESTONES.md
2026-04-19 22:43:02 +02:00

147 lines
8.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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 52105) |
| 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 5255).
- **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 5661, 84, 9596, 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 6263, 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, 7475, 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, 8689, 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 7273, 8082, 85, 9495, 101).
- **Remember Me login, buyer name copy, info page** (Phase 9293, 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 |
---