---
phase: 02-bug-fixes
plan: 04
subsystem: cron
tags: [cron, factory, refactor, dependency-injection]

requires:
  - phase: 02-bug-fixes
    provides: Application.php z AllegroTokenManager (plan 02-03), ShopproPaymentStatusSyncService (plan 02-01)

provides:
  - CronHandlerFactory — jedyne miejsce budujące graf obiektów crona
  - Application::maybeRunCronOnWeb() skrócona z 80+ do ~20 linii logiki
  - bin/cron.php skrócone ze 123 do 26 linii
  - Naprawione dwa błędy w bin/cron.php (AllegroOAuthClient→AllegroTokenManager, AllegroOrderSyncStateRepository→ShopproOrderSyncStateRepository)

affects: [cron, bin/cron, Application, integracje]

tech-stack:
  added: []
  patterns: [Factory pattern dla kompozycji obiektów, Single source of truth dla okablowania crona]

key-files:
  created: [src/Modules/Cron/CronHandlerFactory.php]
  modified: [src/Core/Application.php, bin/cron.php]

key-decisions:
  - "Factory przyjmuje tylko PDO i integrationSecret — bez DI container (odrębny temat)"
  - "ShopproIntegrationsRepository tworzony raz w fabryce i współdzielony między 3 serwisami"

patterns-established:
  - "CronHandlerFactory::build(CronRepository, Logger): CronRunner — standardowy kontrakt fabryki"

duration: ~20min
started: 2026-03-13T00:00:00Z
completed: 2026-03-13T00:00:00Z
---

# Phase 2 Plan 04: CronHandlerFactory Summary

**Wydzielono CronHandlerFactory jako jedyne miejsce budujące graf obiektów crona; naprawiono 2 błędy zależności w bin/cron.php (AllegroOAuthClient→AllegroTokenManager, AllegroOrderSyncStateRepository→ShopproOrderSyncStateRepository).**

## Performance

| Metric | Value |
|--------|-------|
| Duration | ~20 min |
| Started | 2026-03-13 |
| Completed | 2026-03-13 |
| Tasks | 3 completed |
| Files modified | 3 (1 nowy, 2 zmodyfikowane) |

## Acceptance Criteria Results

| Criterion | Status | Notes |
|-----------|--------|-------|
| AC-1: Jeden punkt definicji handlerów crona | Pass | CronHandlerFactory jedynym miejscem `new AllegroIntegrationRepository` / `new ShopproIntegrationsRepository` w kontekście crona |
| AC-2: Web cron działa identycznie jak przed zmianą | Pass | `maybeRunCronOnWeb()` wywołuje fabrykę z tymi samymi handlerami |
| AC-3: bin/cron.php używa poprawnych zależności | Pass | `AllegroTokenManager` zamiast `AllegroOAuthClient`, `ShopproOrderSyncStateRepository` zamiast `AllegroOrderSyncStateRepository` |

## Accomplishments

- Nowy `CronHandlerFactory` (97 linii) — kompletny graf obiektów crona w jednym miejscu
- `Application.php`: usunięto 20+ importów cron; `maybeRunCronOnWeb()` skrócona z 80+ do ~20 linii (3 linie fabryki zamiast ~80 linii ręcznej konstrukcji)
- `bin/cron.php`: skrócone ze 123 do 26 linii; naprawiono 2 istniejące błędy w zależnościach

## Files Created/Modified

| File | Change | Purpose |
|------|--------|---------|
| `src/Modules/Cron/CronHandlerFactory.php` | Created | Jedyne miejsce budujące graf obiektów crona |
| `src/Core/Application.php` | Modified | Zastąpiono 80+ linii ręcznej konstrukcji wywołaniem fabryki; usunięto 20+ zbędnych importów |
| `bin/cron.php` | Modified | Zastąpiono 100+ linii wywołaniem fabryki; naprawiono 2 błędy zależności |

## Decisions Made

| Decision | Rationale | Impact |
|----------|-----------|--------|
| Factory przyjmuje `PDO` + `integrationSecret`, nie `Application` | Unikanie circular dependency i nadmiernego coupling | Fabryka przenośna, testowalność wyższa |
| `ShopproIntegrationsRepository` tworzony raz i współdzielony | Application.php tworzył go 3x niepotrzebnie | Spójność z intencją kodu, mniejsze zużycie zasobów |
| Nie wprowadzamy DI container | Odrębny temat (CONCERNS.md [MEDIUM]) | Brak scope creep |

## Deviations from Plan

### Summary

| Type | Count | Impact |
|------|-------|--------|
| Auto-fixed | 0 | — |
| Scope additions | 0 | — |
| Deferred | 0 | — |

**Total impact:** Brak odchyleń — plan wykonany dokładnie jak napisano.

## Skills

| Skill | Status | Notes |
|-------|--------|-------|
| sonar-scanner | ✓ | ANALYSIS SUCCESSFUL — 0 nowych issues w zmienionych plikach |
| /code-review | ○ | `gh` CLI niedostępne w środowisku; brak PR (praca na main) |

## Issues Encountered

| Issue | Resolution |
|-------|------------|
| `gh` CLI niedostępne — code-review niemożliwy | Pominięto; sonar-scanner jako główna weryfikacja jakości |

## SonarQube — post plan 02-04 (skan 2026-03-13)

Brak nowych issues w `CronHandlerFactory.php` (nowy plik). Pre-existing issues w `Application.php` (S1142, S1448, S4833, S2003) — niezmienione przez nasze modyfikacje.

## Next Phase Readiness

**Ready:**
- Graf obiektów crona w jednym miejscu — gotowe do dalszej pracy z handlerami
- bin/cron.php i Application.php zsynchronizowane — brak ryzyka rozjechania zależności

**Concerns:**
- `Application` ma nadal 22 metody (S1448 pre-existing) — kandydat do podziału w przyszłości

**Blockers:** Brak

---
*Phase: 02-bug-fixes, Plan: 04*
*Completed: 2026-03-13*
