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:
@@ -32,6 +32,7 @@
|
||||
- `POST /settings/statuses/reorder`
|
||||
- `GET /settings/cron`
|
||||
- `POST /settings/cron`
|
||||
- `GET /settings/integrations`
|
||||
- `GET /settings/integrations/allegro`
|
||||
- `POST /settings/integrations/allegro/save`
|
||||
- `POST /settings/integrations/allegro/oauth/start`
|
||||
@@ -45,6 +46,12 @@
|
||||
- `POST /settings/integrations/apaczka/save`
|
||||
- `GET /settings/integrations/inpost`
|
||||
- `POST /settings/integrations/inpost/save`
|
||||
- `GET /settings/integrations/shoppro`
|
||||
- `POST /settings/integrations/shoppro/save`
|
||||
- `POST /settings/integrations/shoppro/test`
|
||||
- `POST /settings/integrations/shoppro/statuses/save`
|
||||
- `POST /settings/integrations/shoppro/statuses/sync`
|
||||
- `POST /settings/integrations/shoppro/delivery/save`
|
||||
- `GET /health`
|
||||
- `GET /` (redirect)
|
||||
|
||||
@@ -69,6 +76,8 @@
|
||||
- `App\Modules\Settings\AllegroOrderImportService`
|
||||
- `App\Modules\Settings\AllegroStatusMappingRepository`
|
||||
- `App\Modules\Settings\AllegroStatusDiscoveryService`
|
||||
- `App\Modules\Settings\IntegrationsRepository`
|
||||
- `App\Modules\Settings\IntegrationSecretCipher`
|
||||
- `App\Modules\Orders\OrderImportRepository`
|
||||
- `App\Modules\Settings\CronSettingsController`
|
||||
- `App\Modules\Cron\CronRepository`
|
||||
@@ -76,12 +85,24 @@
|
||||
- `App\Modules\Cron\AllegroTokenRefreshHandler`
|
||||
- `App\Modules\Cron\AllegroOrdersImportHandler`
|
||||
- `App\Modules\Cron\AllegroStatusSyncHandler`
|
||||
- `App\Modules\Cron\ShopproOrdersImportHandler`
|
||||
- `App\Modules\Cron\ShopproStatusSyncHandler`
|
||||
- `App\Modules\Cron\ShopproPaymentStatusSyncHandler`
|
||||
- `App\Modules\Users\UsersController`
|
||||
- `App\Modules\Users\UserRepository`
|
||||
- `App\Modules\Settings\ApaczkaIntegrationController`
|
||||
- `App\Modules\Settings\ApaczkaIntegrationRepository`
|
||||
- `App\Modules\Settings\InpostIntegrationController`
|
||||
- `App\Modules\Settings\InpostIntegrationRepository`
|
||||
- `App\Modules\Settings\IntegrationsHubController`
|
||||
- `App\Modules\Settings\ShopproIntegrationsController`
|
||||
- `App\Modules\Settings\ShopproIntegrationsRepository`
|
||||
- `App\Modules\Settings\ShopproStatusMappingRepository`
|
||||
- `App\Modules\Settings\ShopproDeliveryMethodMappingRepository`
|
||||
- `App\Modules\Settings\ShopproApiClient`
|
||||
- `App\Modules\Settings\ShopproOrdersSyncService`
|
||||
- `App\Modules\Settings\ShopproStatusSyncService`
|
||||
- `App\Modules\Settings\ShopproPaymentStatusSyncService`
|
||||
- `App\Modules\Settings\AllegroOrdersSyncService`
|
||||
- `App\Modules\Settings\AllegroOrderSyncStateRepository`
|
||||
- `App\Modules\Settings\AllegroStatusSyncService`
|
||||
@@ -167,15 +188,14 @@
|
||||
- Sidebar (`resources/views/layouts/app.php`) ma nowy podlink:
|
||||
- `Statusy` (`/settings/statuses`).
|
||||
- `Cron` (`/settings/cron`).
|
||||
- `Integracje Allegro` (`/settings/integrations/allegro`).
|
||||
- `Integracja Apaczka` (`/settings/integrations/apaczka`).
|
||||
- `Integracja InPost` (`/settings/integrations/inpost`).
|
||||
- `Integracje` (`/settings/integrations`) - wspolny hub konfiguracji providerow.
|
||||
|
||||
## Przeplyw Ustawienia > Cron
|
||||
- `GET /settings/cron`:
|
||||
- `CronSettingsController::index(Request): Response`
|
||||
- pobiera ustawienia `cron_run_on_web`, `cron_web_limit`,
|
||||
- renderuje harmonogramy (`cron_schedules`) oraz kolejke/historie (`cron_jobs`).
|
||||
- renderuje harmonogramy (`cron_schedules`) oraz kolejke/historie (`cron_jobs`),
|
||||
- historia (`past_jobs`) ma stronicowanie po parametrze query `past_page` (25 rekordow na strone).
|
||||
- `POST /settings/cron`:
|
||||
- `CronSettingsController::save(Request): Response`
|
||||
- waliduje CSRF,
|
||||
@@ -196,6 +216,9 @@
|
||||
- Dodatkowy handler:
|
||||
- `allegro_orders_import` -> `AllegroOrdersImportHandler::handle(...)` (automatyczny import zamowien Allegro).
|
||||
- `allegro_status_sync` -> `AllegroStatusSyncHandler::handle(...)` (synchronizacja statusow wg kierunku z ustawien integracji Allegro).
|
||||
- `shoppro_orders_import` -> `ShopproOrdersImportHandler::handle(...)` (automatyczny import zamowien z aktywnych integracji `shopPRO` z wlaczonym pobieraniem).
|
||||
- `shoppro_order_status_sync` -> `ShopproStatusSyncHandler::handle(...)` (synchronizacja statusow shopPRO wg kierunku ustawionego per instancja).
|
||||
- `shoppro_payment_status_sync` -> `ShopproPaymentStatusSyncHandler::handle(...)` (odswiezanie statusu platnosci zamowien shopPRO na podstawie flagi `paid`).
|
||||
|
||||
## Przeplyw Ustawienia > Integracje > Allegro
|
||||
- `GET /settings/integrations/allegro`:
|
||||
@@ -248,10 +271,11 @@
|
||||
- mapuje terminy wysylki z `delivery.time.dispatch` do `send_date_min` / `send_date_max`,
|
||||
- buduje diagnostyke importu miniatur (statystyki + przyczyny brakow),
|
||||
- mapuje status Allegro na status orderPRO na podstawie `allegro_order_status_mappings`,
|
||||
- mapuje payload Allegro na neutralny model tabel zamowien,
|
||||
- mapuje payload Allegro na neutralny model tabel zamowien (z `integration_id` aktywnej instancji Allegro),
|
||||
- zapisuje aggregate przez `OrderImportRepository::upsertOrderAggregate(...)`.
|
||||
- `AllegroOrdersSyncService`:
|
||||
- uruchamiany z crona (`allegro_orders_import`),
|
||||
- korzysta z dynamicznego `integration_id` aktywnego srodowiska Allegro (zamiast stalej),
|
||||
- respektuje ustawienia integracji (`orders_fetch_enabled`, `orders_fetch_start_date`),
|
||||
- pobiera listy checkout forms (`GET /order/checkout-forms?sort=-updatedAt`) i importuje nowe/zmienione zamowienia,
|
||||
- utrzymuje kursor sync i status ostatniego wykonania w `integration_order_sync_state`.
|
||||
@@ -286,7 +310,7 @@
|
||||
- `POST /settings/integrations/apaczka/save`:
|
||||
- `ApaczkaIntegrationController::save(Request): Response`
|
||||
- waliduje CSRF i klucz API,
|
||||
- zapisuje zaszyfrowany klucz API przez `ApaczkaIntegrationRepository::saveSettings(...)`.
|
||||
- zapisuje zaszyfrowany klucz API przez `ApaczkaIntegrationRepository::saveSettings(...)` do tabeli bazowej `integrations` (`type=apaczka`).
|
||||
|
||||
## Przeplyw Ustawienia > Integracja InPost
|
||||
- `GET /settings/integrations/inpost`:
|
||||
@@ -296,7 +320,9 @@
|
||||
- `POST /settings/integrations/inpost/save`:
|
||||
- `InpostIntegrationController::save(Request): Response`
|
||||
- waliduje CSRF,
|
||||
- zapisuje ustawienia (token API szyfrowany AES-256-CBC, parametry domyslne przesylek) przez `InpostIntegrationRepository::saveSettings(...)`.
|
||||
- zapisuje ustawienia przez `InpostIntegrationRepository::saveSettings(...)`:
|
||||
- token API w `integrations.api_key_encrypted` (`type=inpost`),
|
||||
- parametry specyficzne przewoznika w `inpost_integration_settings`.
|
||||
|
||||
## Przeplyw Ustawienia > Baza danych
|
||||
- `GET /settings/database`:
|
||||
@@ -323,3 +349,66 @@
|
||||
- nowe klasy i metody (sygnatury + odpowiedzialnosc),
|
||||
- zmiany przeplywu request -> controller -> repository,
|
||||
- kontrakty wejscia/wyjscia istotnych metod.
|
||||
## Przeplyw Ustawienia > Integracje (hub)
|
||||
- `GET /settings/integrations`:
|
||||
- `IntegrationsHubController::index(Request): Response`
|
||||
- buduje liste instancji providerow (Allegro sandbox/production, Apaczka, InPost, shopPRO),
|
||||
- pokazuje tabele podsumowania i przycisk `Ustawienia` w kazdym wierszu,
|
||||
- przycisk `Ustawienia` prowadzi do dedykowanego ekranu providera (`/settings/integrations/allegro|apaczka|inpost|shoppro`),
|
||||
- renderuje `resources/views/settings/integrations.php`.
|
||||
|
||||
## Przeplyw Ustawienia > Integracje > shopPRO
|
||||
- `GET /settings/integrations/shoppro`:
|
||||
- `ShopproIntegrationsController::index(Request): Response`
|
||||
- pobiera liste instancji przez `ShopproIntegrationsRepository::listIntegrations()`,
|
||||
- opcjonalnie laduje wskazana instancje (`?id=`) przez `findIntegration(...)`,
|
||||
- renderuje `resources/views/settings/shoppro.php` z zakladkami: `Integracja`, `Statusy`, `Ustawienia`, `Formy dostawy`.
|
||||
- `POST /settings/integrations/shoppro/save`:
|
||||
- `ShopproIntegrationsController::save(Request): Response`
|
||||
- waliduje CSRF, nazwe, URL (`http|https`), klucz API (wymagany przy nowej konfiguracji) oraz format daty `orders_fetch_start_date` (`Y-m-d`),
|
||||
- zapisuje konfiguracje przez `ShopproIntegrationsRepository::saveIntegration(...)` do tabeli bazowej `integrations` (`type=shoppro`),
|
||||
- zapisuje interwal joba `shoppro_orders_import` (minuty) do `cron_schedules.interval_seconds`,
|
||||
- zapisuje kierunek synchronizacji statusow per instancja (`integrations.order_status_sync_direction`),
|
||||
- zapisuje interwal joba `shoppro_order_status_sync` (minuty) do `cron_schedules.interval_seconds`,
|
||||
- zapisuje interwal joba `shoppro_payment_status_sync` (minuty) do `cron_schedules.interval_seconds`,
|
||||
- zapisuje liste statusow orderPRO (per instancja) dla kontroli platnosci (`integrations.payment_sync_status_codes_json`).
|
||||
- `POST /settings/integrations/shoppro/test`:
|
||||
- `ShopproIntegrationsController::test(Request): Response`
|
||||
- waliduje CSRF i `integration_id`,
|
||||
- wykonuje test API przez `ShopproIntegrationsRepository::testConnection(...)`,
|
||||
- zapisuje wynik testu w `integrations.last_test_*` i `integration_test_logs`.
|
||||
- `POST /settings/integrations/shoppro/statuses/sync`:
|
||||
- `ShopproIntegrationsController::syncStatuses(Request): Response`
|
||||
- pobiera slownik statusow z API (`dictionaries/statuses`) przez `ShopproIntegrationsRepository::fetchOrderStatuses(...)`,
|
||||
- przekazuje odkryte statusy do widoku zakladki `Statusy` (flash/sesja).
|
||||
- `POST /settings/integrations/shoppro/statuses/save`:
|
||||
- `ShopproIntegrationsController::saveStatusMappings(Request): Response`
|
||||
- waliduje CSRF, `integration_id` i kody statusow orderPRO,
|
||||
- zapisuje mapowania per instancja shopPRO przez `ShopproStatusMappingRepository::replaceForIntegration(...)` do `order_status_mappings`.
|
||||
- `POST /settings/integrations/shoppro/delivery/save`:
|
||||
- `ShopproIntegrationsController::saveDeliveryMappings(Request): Response`
|
||||
- waliduje CSRF i `integration_id`,
|
||||
- zapisuje mapowania form dostawy przez `ShopproDeliveryMethodMappingRepository::saveMappings(...)` (per instancja).
|
||||
- `ShopproOrdersSyncService`:
|
||||
- uruchamiany z crona (`shoppro_orders_import`),
|
||||
- pobiera liste zamowien i (opcjonalnie) szczegoly zamowienia z API shopPRO,
|
||||
- mapuje kwoty z fallbackami (`summary`, `paid`, `transport_cost`) oraz ceny pozycji (`price_brutto`),
|
||||
- uzupelnia `order_items.media_url` przez pobranie `products/get` po `product_id`, gdy zamowienie nie zawiera obrazu.
|
||||
- mapuje punkty odbioru (`inpost_paczkomat` / `orlen_point`) do adresu `delivery` (`parcel_external_id`, `parcel_name`, ulica/kod/miasto),
|
||||
- uzupelnia `delivery` o telefon/e-mail klienta i etykiete metody dostawy z kosztem (`transport_cost`).
|
||||
- `ShopproStatusSyncService`:
|
||||
- uruchamiany z crona (`shoppro_order_status_sync`),
|
||||
- filtruje aktywne instancje `shopPRO` po kierunku synchronizacji statusow (`shoppro_to_orderpro`),
|
||||
- dla wspieranego kierunku wykorzystuje `ShopproOrdersSyncService` do odswiezenia statusow/importu danych,
|
||||
- dla kierunku `orderpro_to_shoppro` pomija instancje i zwraca wynik informacyjny (tryb przygotowany pod kolejny etap).
|
||||
- `ShopproPaymentStatusSyncService`:
|
||||
- uruchamiany z crona (`shoppro_payment_status_sync`),
|
||||
- pobiera zamowienia shopPRO nieoznaczone jako oplacone (`orders.payment_status != 2`) i nie-finalne,
|
||||
- dla kazdego zamowienia odpytuje API `orders/get|details` i odczytuje flage `paid`,
|
||||
- aktualizuje `orders.payment_status`, `orders.total_paid` i `order_payments`,
|
||||
- zapisuje log `payment` do `order_activity_log`,
|
||||
- respektuje liste statusow z `integrations.payment_sync_status_codes_json` (gdy pusta: fallback na pomijanie statusow finalnych).
|
||||
- Zakladka `Formy dostawy` (shopPRO):
|
||||
- laduje formy dostawy wykryte w zamowieniach danej instancji (`orders.source=shoppro` + `orders.integration_id`),
|
||||
- laduje uslugi dostawy z Allegro API (`delivery-services`) z fallbackiem na odswiezenie tokenu OAuth,
|
||||
- zapisuje mapowanie: forma dostawy shopPRO -> usluga Allegro/InPost WZA.
|
||||
|
||||
@@ -27,6 +27,24 @@
|
||||
- 2026-03-06: Dodano kolumne `carrier` do tabeli `allegro_delivery_method_mappings` (default 'allegro') - umozliwia mapowanie na roznych przewoznikow (Allegro, InPost).
|
||||
- 2026-03-06: Wdrozono migracje `20260302_000019_add_internal_order_number_to_orders.sql` - kolumna `internal_order_number` VARCHAR(11) UNIQUE w tabeli `orders`, format `OPXXXXXXXXX` (np. `OP000000001`); backfill istniejacych rekordow; UI: lista i szczegoly zamowien wyswietlaja numer wewnetrzny jako glowny identyfikator.
|
||||
- 2026-03-04: Poprawiono prezentacje daty zamowienia na liscie (`fallback ordered_at -> source_created_at -> source_updated_at -> fetched_at`) - bez zmian schematu.
|
||||
- 2026-03-08: Rozpoczeto ujednolicanie integracji - migracja `20260308_000037_unify_integrations_base_links.sql`:
|
||||
- dodano `integration_id` do tabel `allegro_integration_settings`, `apaczka_integration_settings`, `inpost_integration_settings`,
|
||||
- dodano FK/UNIQUE 1:1 z tabela `integrations`,
|
||||
- dodano/uzupelniono rekordy bazowe providerow (`allegro`, `apaczka`, `inpost`) w `integrations`.
|
||||
- 2026-03-08: Dodano UI i endpointy konfiguracji `shopPRO` (wieloinstancyjnie) w oparciu o istniejaca tabele `integrations` (`type=shoppro`) - bez zmian schematu.
|
||||
- 2026-03-08: Dodano mapowanie statusow dla `shopPRO` (zakladka `Statusy`) z zapisem do istniejacej tabeli `order_status_mappings` per `integration_id` - bez zmian schematu.
|
||||
- 2026-03-08: Dodano migracje naprawcza `20260308_000038_ensure_order_status_mappings_table.sql` (uzupelnia brakujaca tabele `order_status_mappings` w srodowiskach z niepelna historia migracji).
|
||||
- 2026-03-08: Dodano migracje naprawcza `20260308_000039_ensure_integrations_fetch_columns.sql` (uzupelnia brakujace kolumny `orders_fetch_enabled` i `orders_fetch_start_date` w `integrations`).
|
||||
- 2026-03-08: Dodano migracje `20260308_000040_ensure_shoppro_orders_import_schedule.sql` (seed/naprawa harmonogramu `cron_schedules` dla joba `shoppro_orders_import`) - bez zmian schematu tabel.
|
||||
- 2026-03-08: Dodano migracje `20260308_000041_ensure_shoppro_status_sync_schedule_and_direction.sql` (seed/naprawa harmonogramu `cron_schedules` dla joba `shoppro_order_status_sync` oraz uzupelnienie kolumny `integrations.order_status_sync_direction` w srodowiskach niezgodnych).
|
||||
- 2026-03-08: Dodano migracje `20260308_000042_ensure_shoppro_payment_sync_schedule_and_columns.sql`:
|
||||
- uzupelnienie kolumny `integrations.payment_sync_status_codes_json` (JSON) dla konfiguracji statusow objetych kontrola platnosci,
|
||||
- seed/naprawa harmonogramu `cron_schedules` dla joba `shoppro_payment_status_sync` (domyslnie 600s, priorytet 105).
|
||||
- 2026-03-08: Dodano migracje `20260308_000043_create_shoppro_delivery_method_mappings_table.sql`:
|
||||
- nowa tabela `shoppro_delivery_method_mappings` (mapowanie form dostawy per `integration_id`),
|
||||
- tabela przechowuje mapowanie formy shopPRO na usluge Allegro WZA/InPost (`allegro_delivery_method_id`, `allegro_credentials_id`, `allegro_carrier_id`, `allegro_service_name`, `carrier`).
|
||||
- 2026-03-08: Poprawiono mapowanie importu zamowien shopPRO (kwoty i miniatury pozycji) - bez zmian schematu bazy.
|
||||
- 2026-03-08: Poprawiono mapowanie danych wysylki shopPRO (paczkomat/punkt odbioru + kontakt klienta + koszt transportu) - bez zmian schematu bazy.
|
||||
|
||||
## Tabele
|
||||
|
||||
@@ -94,10 +112,27 @@
|
||||
- `last_error` (varchar 500),
|
||||
- `created_at`, `updated_at`.
|
||||
|
||||
### `order_status_mappings`
|
||||
- Mapowanie statusow zamowien shopPRO na statusy orderPRO per instancja integracji.
|
||||
- Kolumny:
|
||||
- `id` (PK, int unsigned, AI),
|
||||
- `integration_id` (int unsigned, FK -> `integrations.id`),
|
||||
- `shoppro_status_code` (varchar 64),
|
||||
- `shoppro_status_name` (varchar 128, nullable),
|
||||
- `orderpro_status_code` (varchar 64),
|
||||
- `created_at`, `updated_at`.
|
||||
- Indeksy:
|
||||
- `order_status_mappings_integration_shoppro_unique` (UNIQUE: `integration_id`, `shoppro_status_code`),
|
||||
- `order_status_mappings_integration_idx` (`integration_id`),
|
||||
- `order_status_mappings_orderpro_idx` (`orderpro_status_code`).
|
||||
- Klucze obce:
|
||||
- `order_status_mappings_integration_fk`: `integration_id` -> `integrations.id` (`ON DELETE CASCADE`, `ON UPDATE CASCADE`).
|
||||
|
||||
### `allegro_integration_settings`
|
||||
- Konfiguracja pojedynczej integracji Allegro (`id = 1`) zarzadzanej z `Ustawienia > Integracje > Allegro`.
|
||||
- Konfiguracja OAuth i sync dla integracji Allegro per srodowisko (`sandbox|production`) zarzadzana z `Ustawienia > Integracje > Allegro`.
|
||||
- Kolumny:
|
||||
- `id` (PK, tinyint unsigned),
|
||||
- `integration_id` (int unsigned, UNIQUE, FK -> `integrations.id`),
|
||||
- `environment` (varchar 16, `sandbox|production`),
|
||||
- `client_id` (varchar 128),
|
||||
- `client_secret_encrypted` (text),
|
||||
@@ -113,7 +148,8 @@
|
||||
- `created_at`, `updated_at`.
|
||||
- Indeksy:
|
||||
- `allegro_integration_settings_environment_idx` (`environment`),
|
||||
- `allegro_integration_settings_token_expires_at_idx` (`token_expires_at`).
|
||||
- `allegro_integration_settings_token_expires_at_idx` (`token_expires_at`),
|
||||
- `allegro_integration_settings_integration_unique` (`integration_id`, UNIQUE).
|
||||
|
||||
### `allegro_order_status_mappings`
|
||||
- Mapowanie kodow statusow Allegro na kody statusow orderPRO.
|
||||
@@ -142,17 +178,54 @@
|
||||
- `order_activity_log_order_created_idx` (`order_id`, `created_at`),
|
||||
- `order_activity_log_event_type_idx` (`event_type`).
|
||||
|
||||
### `integrations`
|
||||
- Bazowa tabela wszystkich instancji integracji (model docelowy pod wielu providerow i wiele kont per provider).
|
||||
- Kolumny:
|
||||
- `id` (PK, int unsigned, AI),
|
||||
- `type` (varchar 32, np. `allegro`, `apaczka`, `inpost`, `shoppro`),
|
||||
- `name` (varchar 128, unikalne w obrebie `type`),
|
||||
- `base_url` (varchar 255),
|
||||
- `api_key_encrypted` (text, nullable),
|
||||
- `timeout_seconds` (smallint unsigned),
|
||||
- `is_active` (tinyint(1)),
|
||||
- `orders_fetch_enabled` (tinyint(1)),
|
||||
- `orders_fetch_start_date` (date, nullable),
|
||||
- `order_status_sync_direction` (varchar 32),
|
||||
- `payment_sync_status_codes_json` (json, nullable; lista kodow statusow orderPRO, dla ktorych cron ma sprawdzac oplacenie zamowien),
|
||||
- pola diagnostyki testu (`last_test_status`, `last_test_http_code`, `last_test_message`, `last_test_at`),
|
||||
- `created_at`, `updated_at`.
|
||||
|
||||
### `shoppro_delivery_method_mappings`
|
||||
- Mapowanie form dostawy shopPRO na uslugi dostawy Allegro WZA/InPost per instancja integracji.
|
||||
- Kolumny:
|
||||
- `id` (PK, int unsigned, AI),
|
||||
- `integration_id` (int unsigned, FK -> `integrations.id`),
|
||||
- `order_delivery_method` (varchar 200),
|
||||
- `carrier` (varchar 50; np. `allegro`, `inpost`),
|
||||
- `allegro_delivery_method_id` (varchar 128),
|
||||
- `allegro_credentials_id` (varchar 128, nullable),
|
||||
- `allegro_carrier_id` (varchar 128, nullable),
|
||||
- `allegro_service_name` (varchar 255, nullable),
|
||||
- `created_at`, `updated_at`.
|
||||
- Indeksy:
|
||||
- `shoppro_dm_mapping_unique` (UNIQUE: `integration_id`, `order_delivery_method`),
|
||||
- `shoppro_dm_mapping_integration_idx` (`integration_id`).
|
||||
- Klucze obce:
|
||||
- `shoppro_dm_mapping_integration_fk`: `integration_id` -> `integrations.id` (`ON DELETE CASCADE`, `ON UPDATE CASCADE`).
|
||||
|
||||
### `apaczka_integration_settings`
|
||||
- Konfiguracja pojedynczej integracji Apaczka (`id = 1`) zarzadzanej z `Ustawienia > Integracja Apaczka`.
|
||||
- Tabela kompatybilnosci dla integracji Apaczka (`id = 1`); sekret API jest utrzymywany bazowo w `integrations.api_key_encrypted`.
|
||||
- Kolumny:
|
||||
- `id` (PK, tinyint unsigned),
|
||||
- `integration_id` (int unsigned, UNIQUE, FK -> `integrations.id`),
|
||||
- `api_key_encrypted` (text, nullable),
|
||||
- `created_at`, `updated_at`.
|
||||
|
||||
### `inpost_integration_settings`
|
||||
- Konfiguracja pojedynczej integracji InPost ShipX (`id = 1`) zarzadzanej z `Ustawienia > Integracja InPost`.
|
||||
- Tabela ustawien specyficznych InPost ShipX (`id = 1`); token API utrzymywany bazowo w `integrations.api_key_encrypted`.
|
||||
- Kolumny:
|
||||
- `id` (PK, tinyint unsigned),
|
||||
- `integration_id` (int unsigned, UNIQUE, FK -> `integrations.id`),
|
||||
- `api_token_encrypted` (text, nullable),
|
||||
- `organization_id` (varchar 50, nullable),
|
||||
- `environment` (enum: sandbox, production),
|
||||
|
||||
@@ -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`.
|
||||
|
||||
32
DOCS/todo.md
32
DOCS/todo.md
@@ -1,15 +1,17 @@
|
||||
1. [x] Na liście zamówień powiększenie zdjęcia produktu na hover nie na onclick, wtedy to nie może być modal zamykany X
|
||||
2. [x] Dodać rejestrację historii zamówień, i zmiana statusu rejestrowana w Historii zmian zamĂłwienia
|
||||
3. [x] Pobranie zamĂłwienia rejestrowane w histori zmian zamĂłwienia
|
||||
4. [x] Przy imporcie zamówień musi być pobierania forma wysyłki.
|
||||
5. [x] W szczególach zamówienia dorobić opcję zmiany statusu.
|
||||
6. [x] W szczególach zamówienia 2 razy wyświetla się ID zamówienai z allegro, np: 008d3d60-1743-11f1-b15c-fdb4f87ccfc6
|
||||
7. [x] Przy imporcie z allegro liczba przesyłek jest 0.
|
||||
8. [x] Kolumna LP w szczególach zamówienia jest zbyt szeroka.
|
||||
9. [x] Na lisćie zamówień pole po którym jest domyślnie sortowana czyli data zamówienia jest puste.
|
||||
10. [x] Na liście zamówień ukryć kolumnę ostatnia zmiana.
|
||||
11. [x] W ustawieniach dodać zakładkę Integracja Apaczka. Dodać tam pierwsze ustawienie, czyli klucz API.
|
||||
12. [] synchronizować ręczną zmianę statusu z allegro
|
||||
13. [] W ustawieniach cron https://orderpro.projectpro.pl/settings/cron historia powinna mieć stronicowanie
|
||||
14. [] border inputów, select, textarea, itd zrób troszkę ciemniejszy
|
||||
|
||||
1. [x] Na liście zamówień powiększenie zdjęcia produktu na hover nie na onclick, wtedy to nie może być modal zamykany X
|
||||
2. [x] Doda<EFBFBD> rejestracj<EFBFBD> historii zam<EFBFBD>wie<EFBFBD>, i zmiana statusu rejestrowana w Historii zmian zamówienia
|
||||
3. [x] Pobranie zamówienia rejestrowane w histori zmian zamówienia
|
||||
4. [x] Przy imporcie zamówień musi być pobierania forma wysyłki.
|
||||
5. [x] W szczególach zamówienia dorobić opcję zmiany statusu.
|
||||
6. [x] W szczeg<EFBFBD>lach zam<EFBFBD>wienia 2 razy wy<EFBFBD>wietla si<EFBFBD> ID zam<EFBFBD>wienai z allegro, np: 008d3d60-1743-11f1-b15c-fdb4f87ccfc6
|
||||
7. [x] Przy imporcie z allegro liczba przesy<EFBFBD>ek jest 0.
|
||||
8. [x] Kolumna LP w szczeg<EFBFBD>lach zam<EFBFBD>wienia jest zbyt szeroka.
|
||||
9. [x] Na lis<EFBFBD>ie zam<EFBFBD>wie<EFBFBD> pole po kt<EFBFBD>rym jest domy<EFBFBD>lnie sortowana czyli data zam<EFBFBD>wienia jest puste.
|
||||
10. [x] Na li<EFBFBD>cie zam<EFBFBD>wie<EFBFBD> ukry<EFBFBD> kolumn<EFBFBD> ostatnia zmiana.
|
||||
11. [x] W ustawieniach doda<EFBFBD> zak<EFBFBD>adk<EFBFBD> Integracja Apaczka. Doda<EFBFBD> tam pierwsze ustawienie, czyli klucz API.
|
||||
12. [] synchronizowa<EFBFBD> r<EFBFBD>czn<EFBFBD> zmian<EFBFBD> statusu z allegro
|
||||
13. [x] W ustawieniach cron https://orderpro.projectpro.pl/settings/cron historia powinna mie<EFBFBD> stronicowanie
|
||||
14. [] border input<EFBFBD>w, select, textarea, itd zr<EFBFBD>b troszk<EFBFBD> ciemniejszy
|
||||
15. [] W tym miejscu odwróć kolejność: najpierw źródło potem ID, <div class="orders-ref__meta"><span>f6079660-1af8-11f1-a7c9-231cf6ef29d1</span><span>allegro</span></div>
|
||||
16. [] Na liście zamówień statusy powinno być pokolorowane zgodnie z ustawieniami.
|
||||
17. [] Na liście zamówien jak jest źródło i id zamówienia to zamiast shopPRO musi pisać która integracja konkretnie. Oraz dodajemy napis ID: ...D
|
||||
|
||||
Reference in New Issue
Block a user