Regresja z ver. 0.339 (split IntegrationsRepository → ApiloRepository): $apiloRepository nie było w use() 5 handlerów cron.php. Dodano retry zamówień z apilo_order_id=-1 co 1h. Dodano powiadomienia mailowe o błędach sync Apilo. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
7.7 KiB
7.7 KiB
phase, plan, type, wave, depends_on, files_modified, autonomous
| phase | plan | type | wave | depends_on | files_modified | autonomous | ||
|---|---|---|---|---|---|---|---|---|
| 08-apilo-orders-fix | 01 | execute | 1 |
|
false |
Purpose
Zamówienia nie trafiają do systemu realizacji (Apilo) — blokuje to obsługę klientów i wysyłkę paczek. Krytyczny bugfix produkcyjny.
Output
- Zidentyfikowana i naprawiona przyczyna braku wysyłki zamówień
- Zaległe zamówienia (apilo_order_id = NULL lub -1) gotowe do wysłania przez cron
Source Files
@cron.php (linie 197-521 — handler APILO_SEND_ORDER) @autoload/Domain/Integrations/ApiloRepository.php (token management, API calls) @autoload/Domain/Integrations/IntegrationsRepository.php (getSettings) @autoload/Domain/Integrations/ApiloLogger.php (logging) @autoload/Domain/Order/OrderAdminService.php (sendOrderToApilo, sync methods)
Technical Context — Apilo Order Flow
- Cron pobiera zamówienia z
apilo_order_id = NULLidate_order >= sync_orders_date_start - Warunki wysyłki (linia 200): enabled=1, sync_orders=1, access-token exists, sync_orders_date_start <= now
- Jeden order per cron run (LIMIT 1)
- Failure markers: -1 = permanent HTTP error, -2 = zerowe ceny (oba NIE są retried automatycznie)
- Token keepalive: co 5min, refresh 300s przed wygaśnięciem
- Config: pp_shop_apilo_settings (key-value, provider='apilo')
User Context
Użytkownik dodał dostępy do bazy danych w config.php. Zamówienia nie wysyłają się do apilo.com — potrzebna diagnoza i naprawa.
## Required Skills (from SPECIAL-FLOWS.md)No specialized flows required for hotfix debugging.
<acceptance_criteria>
AC-1: Przyczyna zdiagnozowana
Given zamówienia przestały się wysyłać do Apilo
When przeanalizuję logi (pp_log), ustawienia Apilo (pp_shop_apilo_settings), i konfigurację crona
Then zidentyfikuję konkretną przyczynę problemu (np. wygasły token, wyłączona sync, błąd API)
AC-2: Przyczyna naprawiona
Given znana przyczyna braku wysyłki
When zastosuję poprawkę (kod lub konfiguracja)
Then nowe zamówienia będą się poprawnie wysyłać przez cron do Apilo
AC-3: Zaległe zamówienia gotowe do wysłania
Given istnieją zamówienia z apilo_order_id = NULL lub -1 które powinny być w Apilo
When zresetuję failed orders (apilo_order_id = -1 → NULL) i sprawdzę że cron je przetworzy
Then zaległe zamówienia wyślą się do Apilo przy kolejnych uruchomieniach crona
</acceptance_criteria>
Task 1: Diagnoza — sprawdzenie logów i konfiguracji Apilo cron.php, autoload/Domain/Integrations/ApiloRepository.php, autoload/Domain/Integrations/IntegrationsRepository.php Sprawdzić przyczynę problemu analizując:1. **Logi Apilo na serwerze** — pobrać logs/apilo.txt z FTP (zgodnie z CLAUDE.md: "Za każdym razem jak próbujesz sprawdzić jakiś plik z logami spróbuj go najpierw pobrać z serwera FTP")
2. **Logi w bazie** — sprawdzić ostatnie wpisy w pp_log (action LIKE '%apilo%' lub '%send_order%') — kiedy ostatni sukces, czy są errory
3. **Ustawienia Apilo** — sprawdzić pp_shop_apilo_settings:
- enabled = 1?
- sync_orders = 1?
- access-token istnieje i nie wygasł? (access-token-expire-at vs now)
- refresh-token istnieje i nie wygasł?
- sync_orders_date_start — jaka data?
- token-keepalive-at — kiedy ostatni keepalive?
4. **Zaległe zamówienia** — ile jest zamówień z apilo_order_id = NULL i z -1?
5. **Cron execution** — czy cron.php jest w ogóle wywoływany? (sprawdzić pp_cron_jobs — czy są scheduled/processed joby)
Na podstawie diagnozy określić przyczynę i plan naprawy.
Przyczyna zidentyfikowana i udokumentowana
AC-1 satisfied: Znana przyczyna braku wysyłki zamówień
Wybór strategii naprawy na podstawie diagnozy
Bez diagnozy nie wiemy co dokładnie naprawić. Przyczyna może być: wygasły token OAuth, wyłączona synchronizacja, błąd w kodzie, problem z cronem, lub inna przyczyna.
Naprawa tokenu OAuth
Jeśli token wygasł — refresh lub re-autoryzacja naprawi problem
Wymaga dostępu do panelu admina lub bezpośredniej zmiany w DB
Naprawa konfiguracji (settings)
Proste — zmiana wartości w pp_shop_apilo_settings
Może nie być jedyną przyczyną
Naprawa kodu (bug w cron.php lub ApiloRepository)
Trwała naprawa jeśli problem jest w logice
Wymaga deployu nowego kodu na serwer
Inna przyczyna (cron nie działa, serwer, API Apilo)
Identyfikacja zewnętrznego problemu
Może wymagać działań poza kodem
Po diagnozie — wybierz strategię naprawy lub opisz co znalazłeś
Task 3: Naprawa i reset zaległych zamówień
cron.php, autoload/Domain/Integrations/ApiloRepository.php
Na podstawie wybranej strategii:
1. **Zastosować poprawkę** (kod, konfiguracja, lub token refresh)
2. **Reset failed orders** — zamówienia z apilo_order_id = -1 które powinny być wysłane:
- Przygotować query: UPDATE pp_shop_orders SET apilo_order_id = NULL WHERE apilo_order_id = -1 AND date_order >= '{sync_start_date}'
- LUB użyć sendOrderToApilo() z panelu admina dla poszczególnych zamówień
3. **Weryfikacja** — uruchomić cron.php ręcznie i sprawdzić czy zamówienie się wysyła
Unikać: resetowania zamówień z apilo_order_id = -2 (zerowe ceny — świadomy skip)
Ręczne uruchomienie cron.php wysyła zamówienie do Apilo (sprawdzić pp_log i response)
AC-2 + AC-3 satisfied: Przyczyna naprawiona, zaległe zamówienia gotowe do wysłania
DO NOT CHANGE
- autoload/Domain/Order/OrderRepository.php (order creation logic)
- autoload/Domain/CronJob/ (cron job infrastructure)
- Logika obsługi płatności i statusów w cron.php (handlers 3-11)
SCOPE LIMITS
- Tylko diagnoza i naprawa problemu wysyłki zamówień do Apilo
- Nie refaktoryzować kodu cron.php ani ApiloRepository
- Nie zmieniać flow tworzenia zamówień
- Nie dodawać nowych funkcji (np. auto-retry)
<success_criteria>
- Przyczyna zdiagnozowana i udokumentowana
- Nowe zamówienia wysyłają się poprawnie przez cron
- Zaległe zamówienia z apilo_order_id = NULL/-1 zresetowane i gotowe do wysłania
- Brak regresji w istniejącej funkcjonalności </success_criteria>