Archive milestone, evolve PROJECT.md, reorganize ROADMAP.md. 5 phases, 5 plans: DB foundation, config, issuing, preview/print/PDF, list+XLSX. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
95 lines
4.8 KiB
Markdown
95 lines
4.8 KiB
Markdown
# 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 |
|
||
|
||
---
|
||
|
||
## ✅ 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 |
|
||
|
||
---
|