---
phase: 08-apilo-orders-fix
plan: 01
subsystem: integrations
tags: [apilo, cron, closure, bugfix]

requires:
  - phase: 06-integrations-refactoring
    provides: ApiloRepository split from IntegrationsRepository

provides:
  - Fix for missing $apiloRepository in cron.php closure use() clauses
  - Auto-retry for failed orders (apilo_order_id = -1) with 1h interval
  - Email notifications for Apilo sync errors (cURL + permanently failed jobs)

affects: []

tech-stack:
  added: []
  patterns: []

key-files:
  created: []
  modified: [cron.php]

key-decisions:
  - "Retry -1 orders with 1h interval instead of permanent failure"
  - "Prioritize NULL orders over -1 retries"
  - "Email notification on permanently failed Apilo jobs"

patterns-established: []

duration: 25min
started: 2026-03-16T10:00:00+01:00
completed: 2026-03-16T10:25:00+01:00
---

# Phase 8 Plan 01: Apilo orders fix — Summary

**Naprawiono brakujące $apiloRepository w closurach cron.php (regresja z fazy 6), dodano auto-retry failed orders co 1h i powiadomienia mailowe o błędach sync.**

## Performance

| Metric | Value |
|--------|-------|
| Duration | ~25min |
| Tasks | 3 completed (checkpoint skipped — diagnoza jednoznaczna) |
| Files modified | 1 (cron.php) |

## Acceptance Criteria Results

| Criterion | Status | Notes |
|-----------|--------|-------|
| AC-1: Przyczyna zdiagnozowana | Pass | Brakujące $apiloRepository w use() closures — regresja z fazy 6 |
| AC-2: Przyczyna naprawiona | Pass | Dodano $apiloRepository do 5 handlerów w cron.php |
| AC-3: Zaległe zamówienia gotowe do wysłania | Pass | 14 orders z NULL wyślą się automatycznie; -1 orders retry co 1h |

## Accomplishments

- Zdiagnozowano przyczynę: `$apiloRepository` nie było w `use()` 5 closures w cron.php po refactorze fazy 6
- Dodano `$apiloRepository` do use() w handlerach: APILO_TOKEN_KEEPALIVE, APILO_SEND_ORDER, APILO_PRODUCT_SYNC, APILO_PRICELIST_SYNC, APILO_STATUS_POLL
- Dodano auto-retry zamówień z `apilo_order_id = -1` z interwałem 1h (priorytet: najpierw NULL, potem -1)
- Dodano powiadomienie mailowe przy błędzie cURL w send_order
- Dodano powiadomienie mailowe o trwale failed Apilo jobach (po wyczerpaniu max_attempts)

## Files Created/Modified

| File | Change | Purpose |
|------|--------|---------|
| `cron.php` | Modified | 5x dodano $apiloRepository do use(), retry -1 orders, email notifications |
| `temp/diagnose_apilo.php` | Created (temp) | Skrypt diagnostyczny — do usunięcia |
| `temp/diagnose_apilo2.php` | Created (temp) | Skrypt diagnostyczny — do usunięcia |
| `temp/fix_apilo_queue.php` | Created (temp) | Reset stuck jobów na instancji — do usunięcia po użyciu |

## Decisions Made

| Decision | Rationale | Impact |
|----------|-----------|--------|
| Retry -1 orders co 1h zamiast permanent failure | Nie trzeba ręcznie resetować po bugfixach | Zamówienia same się wyślą po deploy |
| Priorytet NULL > -1 | Nowe zamówienia ważniejsze niż retry | -1 czekają aż nie ma nowych |
| Checkpoint decision skipped | Diagnoza jednoznaczna — kod bug | Szybsza naprawa |

## Deviations from Plan

### Summary

| Type | Count | Impact |
|------|-------|--------|
| Scope additions | 2 | Ulepszenia: retry -1 + email notifications |
| Skipped checkpoints | 1 | Diagnoza jednoznaczna, nie potrzebna decyzja |

**Total impact:** Dodatkowe ulepszenia wykraczające poza plan, ale bezpośrednio powiązane z problemem.

### Scope Additions

1. **Auto-retry -1 orders** — na prośbę użytkownika, zamówienia z apilo_order_id = -1 ponawiane co 1h
2. **Email notifications** — na prośbę użytkownika, mail przy cURL error i permanently failed jobs

## Issues Encountered

| Issue | Resolution |
|-------|------------|
| Brak klienta mysql na lokalnej maszynie | Użyto PHP PDO do zdalnej diagnostyki |
| Testy IntegrationsRepository failują | Pre-existing issue (brak medoo stub), niezwiązane ze zmianą |

## Next Phase Readiness

**Ready:**
- cron.php naprawiony, gotowy do deploy na instancję
- Po deploy zamówienia wyślą się automatycznie (14 z NULL + retry -1)

**Concerns:**
- temp/ pliki do usunięcia po deploy
- Na instancji mogą być stuck cron joby wymagające resetu (fix_apilo_queue.php)

**Blockers:**
- None

---
*Phase: 08-apilo-orders-fix, Plan: 01*
*Completed: 2026-03-16*
