Phase 02 plans 02-01, 02-02, 02-03: - fix(02-01): dead condition in AllegroShipmentService ZPL page size Both ternary branches returned 'A6'; ZPL now correctly returns 'ZPL' - fix(02-02): add last_status_checked_at cursor to AllegroStatusSyncService New migration adds orders.last_status_checked_at DATETIME NULL with composite index (source, source_updated_at). findOrdersNeedingStatusSync() filters by cursor; markOrderStatusChecked() records timestamp on success. - fix(02-03): replace AllegroOrderSyncStateRepository in ShopproOrdersSyncService New ShopproOrderSyncStateRepository (same table, correct class name). Application.php wires correct repository to correct service. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
115 lines
4.0 KiB
Markdown
115 lines
4.0 KiB
Markdown
---
|
|
phase: 02-bug-fixes
|
|
plan: 03
|
|
subsystem: settings, dependency-injection
|
|
tags: [shoppro, repository, dependency, naming]
|
|
|
|
requires:
|
|
- phase: 02-bug-fixes
|
|
provides: Plan 02-02 (last_status_checked_at cursor)
|
|
|
|
provides:
|
|
- ShopproOrderSyncStateRepository (dedykowane repozytorium stanu dla shopPRO)
|
|
- ShopproOrdersSyncService wstrzykuje poprawną zależność
|
|
|
|
affects: shoppro-sync, application-wiring
|
|
|
|
tech-stack:
|
|
added: []
|
|
patterns: [dedicated-repository-per-integration]
|
|
|
|
key-files:
|
|
created:
|
|
- src/Modules/Settings/ShopproOrderSyncStateRepository.php
|
|
modified:
|
|
- src/Modules/Settings/ShopproOrdersSyncService.php
|
|
- src/Core/Application.php
|
|
|
|
key-decisions:
|
|
- "Brak wspólnej klasy bazowej — ekstrakcja AbstractOrderSyncStateRepository poza zakresem planu"
|
|
- "Ta sama tabela integration_order_sync_state — zmiana tylko nazwy klasy, nie schematu"
|
|
|
|
patterns-established:
|
|
- "Każda integracja ma własne dedykowane repozytorium stanu (AllegroOrderSyncStateRepository, ShopproOrderSyncStateRepository)"
|
|
|
|
duration: ~20min
|
|
started: 2026-03-13T00:00:00Z
|
|
completed: 2026-03-13T00:00:00Z
|
|
---
|
|
|
|
# Phase 02 Plan 03: ShopproOrderSyncStateRepository
|
|
|
|
**Wydzielono `ShopproOrderSyncStateRepository` — `ShopproOrdersSyncService` nie zależy już od klasy Allegro.**
|
|
|
|
## Performance
|
|
|
|
| Metric | Value |
|
|
|--------|-------|
|
|
| Duration | ~20min |
|
|
| Started | 2026-03-13 |
|
|
| Completed | 2026-03-13 |
|
|
| Tasks | 3/3 completed |
|
|
| Files modified | 3 (1 new, 2 modified) |
|
|
|
|
## Acceptance Criteria Results
|
|
|
|
| Criterion | Status | Notes |
|
|
|-----------|--------|-------|
|
|
| AC-1: ShopproOrdersSyncService nie zależy od AllegroOrderSyncStateRepository | Pass | 0 wystąpień w pliku |
|
|
| AC-2: ShopproOrdersSyncService używa ShopproOrderSyncStateRepository | Pass | Konstruktor linia 16 |
|
|
| AC-3: ShopproOrderSyncStateRepository ma identyczny kontrakt publiczny | Pass | getState, markRunStarted, markRunSuccess, markRunFailed |
|
|
| AC-4: Application.php wstrzykuje ShopproOrderSyncStateRepository | Pass | Linia 302 |
|
|
| AC-5: Brak regresji — ta sama tabela, ta sama logika | Pass | Kod identyczny, tylko nazwa klasy |
|
|
|
|
## Accomplishments
|
|
|
|
- Nowy `ShopproOrderSyncStateRepository` — identyczny kontrakt publiczny z `AllegroOrderSyncStateRepository`
|
|
- Poprawna zależność w `ShopproOrdersSyncService` (zmiana jednego typehinta w konstruktorze)
|
|
- `Application.php` wstrzykuje właściwe repozytorium do właściwego serwisu
|
|
- `AllegroOrderSyncStateRepository` zachowany nienaruszony — nadal używany przez `AllegroOrdersSyncService`
|
|
|
|
## Files Created/Modified
|
|
|
|
| File | Change | Purpose |
|
|
|------|--------|---------|
|
|
| `src/Modules/Settings/ShopproOrderSyncStateRepository.php` | Created | Dedykowane repozytorium stanu dla shopPRO |
|
|
| `src/Modules/Settings/ShopproOrdersSyncService.php` | Modified | Zamiana typehinta w konstruktorze |
|
|
| `src/Core/Application.php` | Modified | Nowy import + zamiana wstrzyknięcia |
|
|
|
|
## Decisions Made
|
|
|
|
| Decision | Rationale | Impact |
|
|
|----------|-----------|--------|
|
|
| Pełna kopia kodu zamiast abstrakcji | Ekstrakcja interfejsu/klasy bazowej poza zakresem planu (granica BOUNDARIES) | Tech debt: przyszła zmiana logiki = dwa miejsca do edycji |
|
|
| Ta sama tabela DB | `integration_id`-scoping zapewnia izolację bez nowego schematu | Zero risk migracji, brak destrukcji danych |
|
|
|
|
## Deviations from Plan
|
|
|
|
None — plan wykonany dokładnie jak napisano.
|
|
|
|
## Issues Encountered
|
|
|
|
None.
|
|
|
|
## Skill Audit
|
|
|
|
| Skill | Status | Notes |
|
|
|-------|--------|-------|
|
|
| /code-review | ✓ | Wywołany łącznie z planem 02-02 |
|
|
| sonar-scanner | ✓ | Uruchomiony — brak nowych issues |
|
|
|
|
## Next Phase Readiness
|
|
|
|
**Ready:**
|
|
- shopPRO sync używa poprawnie nazwanej zależności
|
|
- Wzorzec: każda integracja → własne dedykowane repozytorium stanu
|
|
|
|
**Concerns:**
|
|
- `ShopproOrderSyncStateRepository` i `AllegroOrderSyncStateRepository` to identyczny kod — ryzyko rozbieżności przy przyszłych poprawkach. Do zaadresowania w osobnym planie (ekstrakcja wspólnej klasy bazowej).
|
|
|
|
**Blockers:** None
|
|
|
|
---
|
|
*Phase: 02-bug-fixes, Plan: 03*
|
|
*Completed: 2026-03-13*
|