feat: add Shoppro payment status synchronization service

- Implemented ShopproPaymentStatusSyncService to handle payment status synchronization between Shoppro and Orderpro.
- Added methods for resolving watched status codes, finding candidate orders, and syncing individual order payments.
- Introduced ShopproStatusMappingRepository for managing status mappings between Shoppro and Orderpro.
- Created ShopproStatusSyncService to facilitate synchronization of order statuses from Shoppro to Orderpro.
This commit is contained in:
2026-03-08 20:41:10 +01:00
parent 3ba6202770
commit af052e1ff5
50 changed files with 6110 additions and 2602 deletions

View File

@@ -1,5 +1,148 @@
# Tech Changelog
## 2026-03-08
- Dodano zakladke `Formy dostawy` dla integracji `shopPRO` (analogicznie do Allegro):
- nowy endpoint `POST /settings/integrations/shoppro/delivery/save`,
- mapowanie per instancja: forma dostawy shopPRO -> usluga dostawy Allegro/InPost WZA,
- UI z wyborem przewoznika (`allegro`/`inpost`) i wyszukiwaniem uslug Allegro.
- Dodano `ShopproDeliveryMethodMappingRepository` i tabele mapowan per `integration_id`.
- Dodano migracje `20260308_000043_create_shoppro_delivery_method_mappings_table.sql`.
- Dodano synchronizacje platnosci shopPRO oparta o flage `paid`:
- nowy job cron `shoppro_payment_status_sync`,
- nowy handler `App\Modules\Cron\ShopproPaymentStatusSyncHandler`,
- nowy serwis `App\Modules\Settings\ShopproPaymentStatusSyncService`,
- runner podlaczony w `App\Core\Application::maybeRunCronOnWeb(...)` oraz `bin/cron.php`.
- Rozszerzono `Ustawienia > Integracje > shopPRO > Ustawienia`:
- dodano interwal sprawdzania platnosci (minuty) dla joba `shoppro_payment_status_sync`,
- dodano wybor statusow orderPRO, dla ktorych cron ma sprawdzac oplacenie zamowien,
- zapis konfiguracji listy statusow per instancja trafia do `integrations.payment_sync_status_codes_json`.
- Import zamowien shopPRO zapisuje status platnosci numerycznie (`orders.payment_status`) na podstawie flagi `paid`, co unifikuje filtry/statystyki platnosci z Allegro.
- Dodano migracje `20260308_000042_ensure_shoppro_payment_sync_schedule_and_columns.sql`:
- uzupelnienie kolumny `integrations.payment_sync_status_codes_json`,
- seed/naprawa harmonogramu `shoppro_payment_status_sync` (domyslnie 600s, priorytet 105).
- Fix danych wysylki dla zamowien shopPRO (np. `OP000000016`):
- `ShopproOrdersSyncService` mapuje `inpost_paczkomat`/`orlen_point` do adresu `delivery` (punkt, ulica, kod, miasto),
- zapisuje `parcel_external_id` i `parcel_name` dla punktu odbioru,
- `delivery` dziedziczy telefon i e-mail klienta, gdy API nie zwraca osobnych danych odbiorcy,
- etykieta metody dostawy (`external_carrier_id`) zawiera koszt transportu (`transport_cost`), np. `Paczkomaty InPost - przedpłata: 13.5 zł`.
- Fix importu shopPRO dla listy zamowien (`Kwoty` + miniatury):
- `ShopproOrdersSyncService` mapuje kwoty zamowienia z `summary` i `paid` (fallback), ceny pozycji z `price_brutto`,
- poprawiono laczenie payloadow `orders/list` i `orders/get|details` (zachowanie kluczowych pol z listy),
- dodano fallback miniatur pozycji przez API `products/get` po `product_id`,
- dodano dodatkowy fallback miniatur po `parent_product_id` (warianty), gdy obraz nie istnieje na produkcie potomnym.
- `OrdersRepository`:
- resolver miniatur pozycji uwzglednia kod kanalu zgodny ze zrodlem zamowienia (`o.source`) zamiast stalego `allegro`.
- Korekta layoutu sekcji `Ustawienia` dla integracji `shopPRO`:
- wyrownano pola w siatce (`integration-settings-group__grid`) przez `align-items: start`,
- wymuszono spojna wysokosc kontrolek (`.form-control`), w tym pola `date`,
- przebudowano CSS (`public/assets/css/app.css`) dla rownego przebiegu linii i pol w obu kolumnach.
- Fix UX przycisku `Nowa integracja` w `Ustawienia > Integracje > shopPRO`:
- przycisk otwiera teraz tryb wymuszonego tworzenia (`?new=1`),
- `ShopproIntegrationsController::index(...)` nie auto-wybiera wtedy pierwszej istniejacej integracji,
- formularz tworzenia otwiera sie zawsze jako pusty.
- Poprawiono prezentacje dostawy na szczegolach zamowienia (`orders/show`):
- `Platnosc i wysylka` sanitizuje nazwe przewoznika (usuwa tagi HTML typu `<b>...</b>`),
- `Dane wysylki` pokazuja `parcel_name` i `parcel_external_id` (np. punkt/paczkomat Allegro),
- gdy brak adresu `delivery`, sekcja `Dane wysylki` pokazuje fallback z metody dostawy (`external_carrier_id`).
- Poprawiono import shopPRO dla formy dostawy:
- `ShopproOrdersSyncService` sanitizuje `external_carrier_id` i `order_shipments.carrier_provider_id` (usuwanie HTML + dekodowanie encji),
- rozszerzono fallbacki mapowania przewoznika (`transport`, `transport_description`, `transport_id`).
- Fix mapowania formy dostawy z shopPRO:
- `ShopproOrdersSyncService` mapuje teraz `orders.external_carrier_id` z fallbackiem na pola `transport` i `transport_description`,
- `orders.external_carrier_account_id` mapowane z `transport_id`,
- `order_shipments.carrier_provider_id` rozszerzone o fallback `transport`/`transport_description`.
- Fix importu adresow shopPRO na realnym payloadzie zamowien (`client_name`, `client_surname`, `client_email`, `client_phone`):
- `ShopproOrdersSyncService::mapAddresses(...)` mapuje teraz pola klienta w formacie flat (bez zagniezdzenia),
- usunieto przypadek tworzenia pustego adresu `delivery` tylko na bazie fallbacku e-mail,
- po wymuszonym re-sync zamowienia #13 dane zamawiajacego zapisaly sie jako `Jacek Pyziak`, `pyziak84@gmail.com`, `530755774`.
- Poprawiono mapowanie danych adresowych w imporcie zamowien `shopPRO`:
- `ShopproOrdersSyncService::mapAddresses(...)` obsluguje rozszerzony zestaw aliasow pol klienta i dostawy (`buyer/customer/client`, `billing_address`, `shipping_address`, `delivery_address`, `receiver`, warianty `first_name/last_name`, `postcode` itd.),
- adres dostawy jest zapisywany takze wtedy, gdy brak pelnej nazwy, ale istnieja inne dane adresowe,
- rozszerzono mapowanie `orders.customer_login` i `orders.external_carrier_id` o dodatkowe fallbacki z payloadu shopPRO.
- Poprawiono UX zakladki `Ustawienia` integracji `shopPRO`:
- ustawienia sa pogrupowane w sekcje `Pobieranie zamowien` oraz `Synchronizacja statusow`,
- dodano naglowki sekcji i opisy kontekstu, aby pola nie zlewaly sie wizualnie,
- dodano dedykowane style SCSS (`integration-settings-group*`) i przebudowano `public/assets/css/app.css`.
- Dodano cron synchronizacji statusow `shopPRO`:
- nowy handler `App\Modules\Cron\ShopproStatusSyncHandler`,
- nowy serwis `App\Modules\Settings\ShopproStatusSyncService`,
- nowy job `shoppro_order_status_sync` podlaczony do runnera w `App\Core\Application::maybeRunCronOnWeb(...)` i `bin/cron.php`.
- Rozszerzono `Ustawienia > Integracje > shopPRO > Ustawienia`:
- dodano wybor kierunku synchronizacji statusow (`shopPRO -> orderPRO`, `orderPRO -> shopPRO`),
- dodano pole interwalu synchronizacji statusow (minuty),
- zapis aktualizuje `integrations.order_status_sync_direction` i harmonogram `cron_schedules` dla `shoppro_order_status_sync`.
- Dodano migracje `20260308_000041_ensure_shoppro_status_sync_schedule_and_direction.sql`:
- seed/naprawa harmonogramu `shoppro_order_status_sync` (domyslnie 900s, priorytet 100),
- uzupelnienie kolumny `integrations.order_status_sync_direction` jesli brak.
- Rozszerzono `ShopproOrdersSyncService` o opcje uruchomienia filtrowanego po `integration_id` i z pominięciem flagi `orders_fetch_enabled` (wykorzystane przez cron synchronizacji statusow).
- Dodano cron importu zamowien z `shopPRO`:
- nowy handler `App\Modules\Cron\ShopproOrdersImportHandler`,
- nowy serwis `App\Modules\Settings\ShopproOrdersSyncService`,
- nowy klient API `App\Modules\Settings\ShopproApiClient`,
- job `shoppro_orders_import` jest podlaczony do wykonania zarowno w `App\Core\Application::maybeRunCronOnWeb(...)`, jak i w `bin/cron.php`.
- Rozszerzono `Ustawienia > Integracje > shopPRO > Ustawienia`:
- dodano pole interwalu pobierania zamowien (minuty),
- zapis aktualizuje harmonogram `cron_schedules` dla joba `shoppro_orders_import`.
- Dodano migracje `20260308_000040_ensure_shoppro_orders_import_schedule.sql`:
- seed/naprawa harmonogramu `shoppro_orders_import` (domyslnie 300s, priorytet 90).
- Zadanie #13 z `DOCS/todo.md`: dodano stronicowanie historii w `Ustawienia > Cron`:
- `CronSettingsController` pobiera `past_page` z query i przekazuje metadane paginacji do widoku,
- `CronRepository` rozszerzono o `countPastJobs()` oraz `listPastJobs(limit, offset)`,
- widok `settings/cron.php` renderuje kontrolki paginacji dla sekcji `Historia jobow (przeszle)`.
- Rozpoczeto ujednolicanie modelu integracji na baze `integrations`:
- dodano klasy wspolne `App\Modules\Settings\IntegrationsRepository` oraz `App\Modules\Settings\IntegrationSecretCipher`,
- ograniczono duplikacje szyfrowania sekretow integracji (wspolny cipher dla repozytoriow integracji).
- Migracja `20260308_000037_unify_integrations_base_links.sql`:
- dodaje `integration_id` do `allegro_integration_settings`, `apaczka_integration_settings`, `inpost_integration_settings`,
- podpina relacje 1:1 FK do `integrations`,
- seeduje bazowe rekordy providerow (`allegro`, `apaczka`, `inpost`) i backfilluje powiazania.
- `ApaczkaIntegrationRepository`:
- klucz API zapisuje/odczytuje z `integrations.api_key_encrypted` (`type=apaczka`).
- `InpostIntegrationRepository`:
- token API zapisuje/odczytuje z `integrations.api_key_encrypted` (`type=inpost`),
- ustawienia specyficzne przewoznika pozostaja w `inpost_integration_settings`.
- `AllegroIntegrationRepository`:
- zapewnia powiazanie aktywnego srodowiska OAuth z rekordem bazowym `integrations`,
- dodana metoda `getActiveIntegrationId()` pod spojnosc domeny zamowien/sync.
- `AllegroOrderImportService` i `AllegroOrdersSyncService`:
- przestaly uzywac stalej/`null` dla `integration_id`,
- korzystaja z aktywnego `integration_id` Allegro, co eliminuje sztywne zalozenie `integration_id=1`.
- Dodano wspolny ekran `Ustawienia > Integracje`:
- nowa route `GET /settings/integrations`,
- nowa klasa `App\Modules\Settings\IntegrationsHubController`,
- nawigacja boczna prowadzi do jednego huba integracji.
- Hub integracji zawiera tabele podsumowania oraz akcje per instancja:
- przycisk `Ustawienia` w kazdym wierszu prowadzi do dedykowanego ekranu zaawansowanego providera.
- Fix UI: rozciaganie przyciskow w formularzach (`.form-actions`) przy ukladzie grid:
- ustawiono `align-items: flex-start` oraz `align-self: flex-start` dla `.form-actions .btn`,
- eliminuje pionowe rozciaganie przyciskow do wysokosci sasiednich pol formularza.
- Dodano wieloinstancyjna konfiguracje integracji `shopPRO`:
- nowe endpointy: `GET /settings/integrations/shoppro`, `POST /settings/integrations/shoppro/save`, `POST /settings/integrations/shoppro/test`,
- nowa klasa `App\Modules\Settings\ShopproIntegrationsController`,
- nowy widok `resources/views/settings/shoppro.php` (lista instancji, formularz dodawania/edycji, test polaczenia),
- hub integracji (`/settings/integrations`) zawiera wiersz `shopPRO` z przejsciem do ekranu ustawien,
- dodano pomocnicze style `.table-row-actions` dla kompaktowych akcji w tabelach.
- Ekran `shopPRO` rozbudowano o zakladki analogiczne do Allegro:
- `Integracja`, `Statusy`, `Ustawienia`, `Formy dostawy`,
- `Ustawienia` zawiera pola `Pobieraj zamowienia` i `Data startu pobierania`,
- zapis/odczyt tych pol jest realizowany przez tabele bazowa `integrations` (`orders_fetch_enabled`, `orders_fetch_start_date`).
- Wdrozone mapowanie statusow shopPRO (zakladka `Statusy`):
- nowe endpointy: `POST /settings/integrations/shoppro/statuses/sync` oraz `POST /settings/integrations/shoppro/statuses/save`,
- dodana klasa `App\Modules\Settings\ShopproStatusMappingRepository`,
- synchronizacja statusow pobiera slownik `dictionaries/statuses` z API shopPRO,
- zapis mapowan trafia do `order_status_mappings` per `integration_id` (wieloinstancyjnie).
- Poprawiono parser statusow shopPRO:
- obsluguje odpowiedzi zagniezdzone w `data`,
- obsluguje rowniez format mapy `kod => nazwa` oraz dodatkowe aliasy pol (`status_code`, `status_name`, `symbol`, `slug`).
- Dodano migracje naprawcza `20260308_000038_ensure_order_status_mappings_table.sql`:
- tworzy `order_status_mappings` jesli tabela nie istnieje (scenariusz niepelnej historii migracji na srodowisku).
- Dodano migracje naprawcza `20260308_000039_ensure_integrations_fetch_columns.sql`:
- uzupelnia w `integrations` brakujace kolumny `orders_fetch_enabled` i `orders_fetch_start_date`
dla srodowisk, gdzie tabela `integrations` zostala odtworzona pozniej niz pierwotne migracje shopPRO.
- Poprawiono UX ekranu `shopPRO`:
- przy istniejacych instancjach automatycznie wybierana jest pierwsza integracja (bez koniecznosci wracania do zakladki `Integracja`),
- dodano przełącznik instancji nad zakladkami (`Wybrana integracja`) dostepny globalnie dla `Statusy/Ustawienia/Formy dostawy`.
## 2026-03-06
- Fix: synchronizacja statusow Allegro nie aktualizowala zamowien.
- Przyczyna: Allegro API nie zmienia `updatedAt` przy zmianie `fulfillment.status`.