feat(28-shipment-tracking-ui): badge'e statusow dostawy, linki sledzenia, ustawienia interwalu trackingu

- Kolorowe badge'e statusow dostawy w tabelach paczek (show.php + prepare.php)
- Link sledzenia z carrier detection (InPost, Apaczka, Orlen, Allegro, Google fallback)
- Sekcja Status dostawy w boksie Platnosc i wysylka
- Ustawienie interwalu trackingu crona (5-120 min) w zakladce Ustawienia
- Tekstowe mapowania statusow Apaczka API (NEW, CONFIRMED, etc.)
- Fix: use-statements ApaczkaShipmentService (pre-existing bug)
- Fix: pickup date normalization (next day po 16:00)
- Fix: przycisk Pobierz etykiete (POST zamiast link do prepare)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-23 23:04:05 +01:00
parent 228c0e96cf
commit 98a0077204
17 changed files with 1108 additions and 174 deletions

View File

@@ -0,0 +1,185 @@
---
phase: 28-shipment-tracking-ui
plan: 01
subsystem: ui
tags: [delivery-status, tracking, badges, cron-settings, scss]
requires:
- phase: 27-shipment-tracking-backend
provides: delivery_status columns, DeliveryStatus class, ShipmentTrackingHandler cron
provides:
- Kolorowe badge'e statusów dostawy w UI (show.php + prepare.php)
- Link śledzenia przesyłki z carrier detection + Google fallback
- Sekcja "Status dostawy" w boksie Płatność i wysyłka
- Ustawienie interwału trackingu w UI crona (zakładka Ustawienia)
- Tekstowe mapowania statusów Apaczka API (NEW, CONFIRMED, etc.)
affects: []
tech-stack:
added: []
patterns:
- "content-tabs-nav pattern reused w cron.php (z allegro.php)"
- "Dual text+numeric status mapping w APACZKA_MAP"
key-files:
created:
- resources/scss/modules/_delivery-status.scss
modified:
- src/Modules/Shipments/DeliveryStatus.php
- src/Modules/Shipments/ApaczkaShipmentService.php
- src/Modules/Shipments/ShipmentPackageRepository.php
- src/Modules/Settings/CronSettingsController.php
- src/Modules/Cron/CronRepository.php
- resources/views/orders/show.php
- resources/views/shipments/prepare.php
- resources/views/settings/cron.php
- resources/scss/app.scss
- public/assets/css/app.css
key-decisions:
- "Google search jako fallback tracking URL gdy carrier nieznany"
- "carrier_delivery_method_mappings jako źródło carrier_id (nie pattern matching)"
- "Tekstowe mapowania Apaczka (API zwraca NEW/CONFIRMED, nie 0/1)"
- "Przesunięcie pickup na next day gdy po 16:00 (Apaczka API limit)"
- "Cron settings jako osobna zakładka (content-tabs-nav pattern)"
patterns-established:
- "Dual status mapping: numeryczne + tekstowe klucze w tej samej mapie"
duration: ~3h (z bugfixami)
started: 2026-03-23T19:00:00Z
completed: 2026-03-23T23:30:00Z
---
# Phase 28 Plan 01: Shipment Tracking UI + Settings Summary
**Badge'e statusów dostawy w UI, linki śledzenia z carrier detection, ustawienie interwału trackingu w cronie z zakładkowym layoutem.**
## Performance
| Metric | Value |
|--------|-------|
| Duration | ~3h (z bugfixami) |
| Started | 2026-03-23 19:00 |
| Completed | 2026-03-23 23:30 |
| Tasks | 3 completed + checkpoint |
| Files modified | 12 |
## Acceptance Criteria Results
| Criterion | Status | Notes |
|-----------|--------|-------|
| AC-1: Status dostawy w tabeli paczek (show.php) | Pass | Kolumna z badge + tooltip surowego statusu |
| AC-2: Status dostawy w tabeli paczek (prepare.php) | Pass | Analogicznie jak show.php |
| AC-3: Link śledzenia przesyłki | Pass | InPost, Apaczka, Orlen, Allegro + Google fallback |
| AC-4: Ustawienie interwału trackingu w cronie | Pass | Input 5120 min w zakładce Ustawienia |
| AC-5: Info o śledzeniu w boksie Płatność i wysyłka | Pass | Badge + data ostatniej aktualizacji |
## Accomplishments
- Badge'e statusów dostawy z 10 kolorami, tooltip z surowym statusem API, link śledzenia z auto-detection przewoźnika
- Ustawienia crona przeorganizowane na zakładki (Ustawienia / Harmonogram), interwał trackingu konfigurowalny 5120 min
- Naprawiono 7 bugów wykrytych podczas implementacji i testów
## Files Created/Modified
| File | Change | Purpose |
|------|--------|---------|
| `resources/scss/modules/_delivery-status.scss` | Created | Style badge'ów statusów dostawy (10 wariantów kolorystycznych) |
| `src/Modules/Shipments/DeliveryStatus.php` | Modified | trackingUrl() z carrier detection + Google fallback; tekstowe mapowania Apaczka |
| `src/Modules/Shipments/ApaczkaShipmentService.php` | Modified | Fix use-statements; pickup date normalization (next day po 16:00) |
| `src/Modules/Shipments/ShipmentPackageRepository.php` | Modified | resolveCarrierName() lookup z carrier_delivery_method_mappings |
| `src/Modules/Settings/CronSettingsController.php` | Modified | Przekazuje/zapisuje trackingIntervalMinutes |
| `src/Modules/Cron/CronRepository.php` | Modified | updateScheduleInterval() + getScheduleInterval() |
| `resources/views/orders/show.php` | Modified | Kolumna Status dostawy, badge, link, fix Pobierz etykietę |
| `resources/views/shipments/prepare.php` | Modified | Kolumna Status dostawy, badge, link |
| `resources/views/settings/cron.php` | Modified | Zakładki Ustawienia/Harmonogram; sekcja śledzenia przesyłek |
| `resources/scss/app.scss` | Modified | @use delivery-status |
| `public/assets/css/app.css` | Modified | Rebuilt z nowym SCSS |
| `database/migrations/20260323_000060_*` | Modified | Fix initial status values |
## Decisions Made
| Decision | Rationale | Impact |
|----------|-----------|--------|
| Google search jako fallback tracking URL | Gdy carrier_id nieznany — uniwersalne, zawsze działa | Każda przesyłka ma jakiś link śledzenia |
| carrier_delivery_method_mappings jako źródło carrier_id | API Apaczki nie zwraca usług; tabela mapowań konfigurowana przez usera | Poprawne URL-e dla Orlen, DPD etc. |
| Tekstowe mapowania Apaczka API | API zwraca "NEW"/"CONFIRMED" nie "0"/"1" jak w docs | Statusy mapują się poprawnie |
| Pickup przesunięcie na next day po 16:00 | Apaczka API odrzuca gdy MaxPickupDate < ReadyDate (teraz) | Tworzenie przesyłek działa o każdej porze |
| Cron settings jako osobna zakładka | User request — lepsze oddzielenie ustawień od harmonogramu | Czytelniejszy UI |
## Deviations from Plan
### Summary
| Type | Count | Impact |
|------|-------|--------|
| Auto-fixed | 7 | Niezbędne poprawki wykryte podczas testów |
| Scope additions | 1 | Zakładki w cron (user request) |
| Deferred | 0 | — |
**Total impact:** Niezbędne poprawki + 1 usprawnienie UX na życzenie użytkownika.
### Auto-fixed Issues
**1. Fix: use-statements ApaczkaShipmentService**
- **Found during:** Task 2 (testing)
- **Issue:** `use AppCorexceptionsShipmentException` — brak backslashy (pre-existing bug z fazy 07)
- **Fix:** Poprawiono na `use App\Core\Exceptions\ShipmentException` i `IntegrationConfigException`
**2. Fix: Przycisk Pobierz etykietę w show.php**
- **Found during:** Task 2
- **Issue:** Link do prepare zamiast bezpośredniego downloadu PDF
- **Fix:** Zmieniony na formularz POST z bezpośrednim downloadem
**3. Fix: delivery_status "delivered" → "confirmed"**
- **Found during:** Task 2
- **Issue:** Migracja błędnie ustawiała label_ready jako doręczona
- **Fix:** Naprawiono w DB (3 rows) i w pliku migracji
**4. Fix: carrier_id dla Apaczka**
- **Found during:** Task 2
- **Issue:** Puste carrier_id w shipment_packages
- **Fix:** Uzupełniono z carrier_delivery_method_mappings (13 rows); fallback w ApaczkaShipmentService
**5. Fix: Orlen Paczka URL**
- **Found during:** Task 2
- **Issue:** Niepoprawny URL śledzenia
- **Fix:** Poprawiono na `www.orlenpaczka.pl/sledz-paczke/?numer=`
**6. Fix: Tekstowe mapowania Apaczka API**
- **Found during:** Checkpoint Task 2
- **Issue:** API zwraca "NEW" ale mapa ma klucze "0","1" — status zawsze "unknown"
- **Fix:** Dodano 12 tekstowych kluczy do APACZKA_MAP i APACZKA_DESCRIPTIONS
**7. Fix: Apaczka pickup date/hours**
- **Found during:** Checkpoint Task 2
- **Issue:** Tworzenie przesyłki po 16:00 — Apaczka API error MaxPickupDate < ReadyDate
- **Fix:** Automatyczne przesunięcie na next business day gdy po 16:00
## Sonar Results
- 0 nowych unikalnych issues z kodu fazy 28
- 1x S1448 CronRepository (22 metod > 20) — dodane 2 metody, pre-existing pattern
- Pre-existing: S3776, S1142, S1192 na ApaczkaShipmentService, DeliveryStatus, cron.php
- Skill audit: sonar-scanner ✓
## Next Phase Readiness
**Ready:**
- System śledzenia przesyłek kompletny (backend + UI)
- Badge'e, linki, ustawienia crona działają
- Milestone v1.2 gotowy do zamknięcia
**Concerns:**
- CronRepository zbliża się do limitu metod (22/20) — rozważyć split w przyszłości
- Apaczka API docs vs rzeczywistość (tekst vs numeric) — monitorować
**Blockers:**
- Brak
---
*Phase: 28-shipment-tracking-ui, Plan: 01*
*Completed: 2026-03-23*