8.7 KiB
8.7 KiB
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_paiddo shopPRO;payment.status_changed,order.status_changed,order.status_aged,order.imported,shipment.created/status_changed, warunki statusowe ipayment_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_coderename + flagi statusu projektu (Phase 97). - Statistics (ostatnia faza): dzienny raport zamowien
/statistics/ordersz filtrami (daty/kanaly/grupy statusow) i stopkaPodsumowanie; 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_ateliminuje skanowanie wszystkich zamówień - ShopproOrderSyncStateRepository — poprawna zależność (poprzednio używano Allegro repo)
- CSRF standardization —
_csrf_token→_tokenw całym projekcie - 5 kompensujących migracji zaadnotowanych — DB_SCHEMA.md ma sekcję Compensating Migrations
- Flash::set()/Flash::get() — 10 bezpośrednich
$_SESSIONwrites 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 |