---
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*
