---
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 5–120 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 5–120 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*
