- Introduced ShipmentProviderInterface to define the contract for shipment providers. - Implemented ShipmentProviderRegistry to manage and retrieve shipment providers. - Added a new tool for probing Apaczka order_send payload variants, enhancing debugging capabilities.
28 KiB
28 KiB
Architecture
Status
- Projekt po resecie do trybu
users-only. - UI korzysta z globalnego standardu naglowkow sekcji (
h2/h3/h4.section-title) definiowanego centralnie wresources/scss/app.scssi buildowanego dopublic/assets/css/app.css.
Moduly aktywne
App\Modules\AuthApp\Modules\OrdersApp\Modules\UsersApp\Modules\Settings
Routing
GET /login,POST /login,POST /logoutGET /settings/users,POST /settings/usersGET /orders(redirect do/orders/list)GET /orders/listGET /orders/{id}POST /orders/{id}/statusGET /users(redirect do/settings/users)POST /users(compat route)GET /settings(redirect do/settings/users)GET /settings/databasePOST /settings/database/migrateGET /settings/statusesPOST /settings/status-groupsPOST /settings/status-groups/updatePOST /settings/status-groups/deletePOST /settings/status-groups/reorderPOST /settings/statuses/createPOST /settings/statuses/updatePOST /settings/statuses/deletePOST /settings/statuses/reorderGET /settings/cronPOST /settings/cronGET /settings/integrationsGET /settings/integrations/allegroPOST /settings/integrations/allegro/savePOST /settings/integrations/allegro/oauth/startPOST /settings/integrations/allegro/import-singlePOST /settings/integrations/allegro/statuses/savePOST /settings/integrations/allegro/statuses/save-bulkPOST /settings/integrations/allegro/statuses/deletePOST /settings/integrations/allegro/statuses/syncGET /settings/integrations/allegro/oauth/callbackGET /settings/integrations/apaczkaPOST /settings/integrations/apaczka/savePOST /settings/integrations/apaczka/testGET /settings/integrations/inpostPOST /settings/integrations/inpost/saveGET /settings/integrations/shopproPOST /settings/integrations/shoppro/savePOST /settings/integrations/shoppro/testPOST /settings/integrations/shoppro/statuses/savePOST /settings/integrations/shoppro/statuses/syncPOST /settings/integrations/shoppro/delivery/saveGET /healthGET /(redirect)
Korekta logowania
AuthController::showLogin(Request): Response:- dla zalogowanego usera redirect na
/settings/users(zamiast nieistniejacego/dashboard).
- dla zalogowanego usera redirect na
AuthController::login(Request): Response:- po poprawnym logowaniu redirect na
/settings/users.
- po poprawnym logowaniu redirect na
Kluczowe klasy
App\Core\ApplicationApp\Modules\Auth\AuthControllerApp\Modules\Auth\AuthServiceApp\Modules\Orders\OrdersControllerApp\Modules\Orders\OrdersRepositoryApp\Modules\Settings\SettingsControllerApp\Modules\Settings\OrderStatusRepositoryApp\Modules\Settings\AllegroIntegrationControllerApp\Modules\Settings\AllegroIntegrationRepositoryApp\Modules\Settings\AllegroOAuthClientApp\Modules\Settings\AllegroApiClientApp\Modules\Settings\AllegroOrderImportServiceApp\Modules\Settings\AllegroStatusMappingRepositoryApp\Modules\Settings\AllegroStatusDiscoveryServiceApp\Modules\Settings\IntegrationsRepositoryApp\Modules\Settings\IntegrationSecretCipherApp\Modules\Orders\OrderImportRepositoryApp\Modules\Settings\CronSettingsControllerApp\Modules\Cron\CronRepositoryApp\Modules\Cron\CronRunnerApp\Modules\Cron\AllegroTokenRefreshHandlerApp\Modules\Cron\AllegroOrdersImportHandlerApp\Modules\Cron\AllegroStatusSyncHandlerApp\Modules\Cron\ShopproOrdersImportHandlerApp\Modules\Cron\ShopproStatusSyncHandlerApp\Modules\Cron\ShopproPaymentStatusSyncHandlerApp\Modules\Users\UsersControllerApp\Modules\Users\UserRepositoryApp\Modules\Settings\ApaczkaIntegrationControllerApp\Modules\Settings\ApaczkaIntegrationRepositoryApp\Modules\Settings\ApaczkaApiClientApp\Modules\Settings\CarrierDeliveryMethodMappingRepositoryApp\Modules\Settings\InpostIntegrationControllerApp\Modules\Settings\InpostIntegrationRepositoryApp\Modules\Settings\IntegrationsHubControllerApp\Modules\Settings\ShopproIntegrationsControllerApp\Modules\Settings\ShopproIntegrationsRepositoryApp\Modules\Settings\ShopproStatusMappingRepositoryApp\Modules\Settings\ShopproDeliveryMethodMappingRepositoryApp\Modules\Settings\ShopproApiClientApp\Modules\Settings\ShopproOrdersSyncServiceApp\Modules\Settings\ShopproStatusSyncServiceApp\Modules\Settings\ShopproPaymentStatusSyncServiceApp\Modules\Settings\AllegroOrdersSyncServiceApp\Modules\Settings\AllegroOrderSyncStateRepositoryApp\Modules\Settings\AllegroStatusSyncServiceApp\Modules\Shipments\ShipmentProviderInterfaceApp\Modules\Shipments\ShipmentProviderRegistryApp\Modules\Shipments\ApaczkaShipmentService
Przeplyw Zamowienia > Lista zamowien
GET /orders/list:OrdersController::index(Request): Response- pobiera dane listy przez
OrdersRepository::paginate(...), - data zamowienia na liscie korzysta z fallbacku:
orders.ordered_at->orders.source_created_at->orders.source_updated_at->orders.fetched_at, - domyslne sortowanie i filtry zakresu dat (
date_from,date_to) korzystaja z tej samej daty efektywnej, - pobiera slowniki filtrow (
sourceOptions(),statusOptions()), statystyki (quickStats()), agregaty statusow (statusCounts()) i konfiguracje grup/statusow (statusPanelConfig()), - buduje panel statusow z grupami i licznikami (
buildStatusPanel(...)) z linkami filtrujacymi po statusie, - panel statusow i etykiety statusow sa zgodne z konfiguracja z
Ustawienia > Statusy(z fallbackiemPozostale), - renderuje podglad pozycji zamowienia (nazwa, miniatura, ilosc) na bazie
order_items, - miniatura pozycji jest rozwiazywana priorytetowo:
order_items.media_url-> glowny obraz powiazanego produktu orderPRO (product_channel_map+sales_channels[allegro]+product_images), - obsluguje modal podgladu zdjecia pozycji po kliknieciu miniatury,
- normalizuje status techniczny na etykiete biznesowa (bez kodu statusu),
- renderuje widok
resources/views/orders/list.phpi komponent tabeliresources/views/components/table-list.php.
GET /orders/{id}:OrdersController::show(Request): Response- pobiera szczegoly przez
OrdersRepository::findDetails(int $orderId), statystyke statusow przezstatusCounts()oraz konfiguracje przezstatusPanelConfig(), - pozycje zamowienia maja ten sam mechanizm rozwiazywania miniatur co lista (
media_urlz zamowienia lub obraz z mapowania produktu), - buduje panel statusow z grupami i licznikami (
buildStatusPanel(...)), - renderuje klikalne taby sekcji i przelaczanie paneli po stronie klienta (JS w
orders/show.php), - renderuje widok
resources/views/orders/show.phpz sekcjami:- pozycje zamowienia,
- szczegoly zamowienia,
- platnosc i wysylka,
- adresy (
customer,invoice,delivery), - notatki i historia statusow.
- Sidebar ma oddzielna grupe nawigacyjna:
Zamowienia->Lista zamowien.
Skrypty techniczne (CLI)
bin/fix_status_codes.php- naprawa kodow grup/statusow (transliteracja PL -> ASCII, tryb
--dry-run, opcja--use-remote).
- naprawa kodow grup/statusow (transliteracja PL -> ASCII, tryb
bin/deploy_and_seed_orders.php- aplikuje generyczny schema zamowien z
database/drafts/20260302_orders_schema_v1.sql, - seeduje dane testowe (
--count,--append,--use-remote,--profile=default|realistic), - profil
realisticutrzymuje spojne zaleznosci miedzy:- statusem zamowienia,
- statusem i kwota platnosci,
- obecnoscia wysylek i dokumentow,
- historia przejsc statusow (deterministyczne sciezki zamiast losowych przeskokow).
- aplikuje generyczny schema zamowien z
Przeplyw Ustawienia > Statusy
GET /settings/statuses:SettingsController::statuses(Request): Response- pobiera dane przez
OrderStatusRepository::listGroups()iOrderStatusRepository::listStatuses(), - renderuje widok
resources/views/settings/statuses.php.
POST /settings/status-groups:SettingsController::createStatusGroup(Request): Response- waliduje CSRF i dane (
name,color_hex,is_active), codejest generowany automatycznie znamei nie jest edytowany z UI,- zapisuje przez
OrderStatusRepository::createGroup(...).
POST /settings/status-groups/update:SettingsController::updateStatusGroup(Request): Response- waliduje istnienie grupy i aktualizuje rekord przez
updateGroup(...), codepozostaje bez zmian (read-only po utworzeniu).
POST /settings/status-groups/delete:SettingsController::deleteStatusGroup(Request): Response- usuwa grupe przez
deleteGroup(...); statusy z tej grupy usuwane sa kaskadowo (FK).
POST /settings/status-groups/reorder:SettingsController::reorderStatusGroups(Request): Response- zapisuje kolejnosc drag-and-drop grup przez
OrderStatusRepository::reorderGroups(...), - endpoint jest wywolywany automatycznie po upuszczeniu elementu listy (auto-save).
POST /settings/statuses/create:SettingsController::createStatus(Request): Response- waliduje grupe, pola statusu i zapisuje przez
createStatus(...).
POST /settings/statuses/update:SettingsController::updateStatus(Request): Response- waliduje dane i aktualizuje status przez
updateStatus(...), codepozostaje bez zmian (read-only po utworzeniu).
POST /settings/statuses/delete:SettingsController::deleteStatus(Request): Response- usuwa status przez
deleteStatus(...).
POST /settings/statuses/reorder:SettingsController::reorderStatuses(Request): Response- zapisuje kolejnosc drag-and-drop statusow w ramach grupy przez
OrderStatusRepository::reorderStatusesByGroup(...), - endpoint jest wywolywany automatycznie po upuszczeniu elementu listy (auto-save).
Nawigacja ustawien
- Sidebar (
resources/views/layouts/app.php) ma nowy podlink:Statusy(/settings/statuses).Cron(/settings/cron).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), - historia (
past_jobs) ma stronicowanie po parametrze querypast_page(25 rekordow na strone).
POST /settings/cron:CronSettingsController::save(Request): Response- waliduje CSRF,
- zapisuje
cron_run_on_webicron_web_limitdoapp_settings.
Przeplyw wykonania crona
bin/cron.php:- laduje aplikacje i uruchamia
CronRunner::run($limit).
- laduje aplikacje i uruchamia
App\Core\Application::maybeRunCronOnWeb(Request): void:- przy wlaczonej opcji
cron_run_on_web=1uruchamiaCronRunnerpodczas requestu HTTP, - stosuje throttling sesyjny i lock DB (
GET_LOCK) zeby uniknac wielu rownoleglych workerow.
- przy wlaczonej opcji
CronRunner:- dispatchuje due schedule z
cron_schedulesdocron_jobs, - pobiera pending joby wg priorytetu i czasu,
- wykonuje handler po
job_type.
- dispatchuje due schedule z
- Pierwszy aktywny handler:
allegro_token_refresh->AllegroTokenRefreshHandler::handle(...)(odswiezenie tokenu OAuth Allegro).- 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 integracjishopPROz 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 flagipaid).
Przeplyw tworzenia przesylki
GET /orders/{id}/shipment/prepare:ShipmentController::prepare(Request): Response,- laduje uslugi dostawy providerow z
ShipmentProviderRegistry(aktualnie:allegro_wza,apaczka), - pobiera automatyczne mapowanie formy dostawy przez
CarrierDeliveryMethodMappingRepository(source_system+source_integration_id+order_delivery_method), - dla dostaw punktowych (
parcel_external_id/parcel_name) prefillemreceiver_namesa dane klienta (a nie nazwa punktu/metody dostawy), - gdy mapowanie nie zostanie znalezione, buduje komunikat diagnostyczny (brak mapowan dla instancji lub brak mapowania konkretnej metody) i przekazuje go do widoku.
POST /orders/{id}/shipment/create:ShipmentController::create(Request): Response,- wybiera providera dynamicznie po
provider_codei deleguje doShipmentProviderInterface::createShipment(...), - dla
apaczkawaliduje wymagane punkty odbioru/nadania wg definicji uslugi (service_structure) i przy bledzie wyceny zwraca rozszerzona diagnostyke parametrow, apaczkauzupelnia i wysylacontact_persondla nadawcy (zUstawienia > Dane firmy) i odbiorcy (fallback z danych zamowienia),apaczkaustawia jawniepickup.type(SELF/COURIER) na podstawie uslugi i obecnoscisender_point_id; dlaCOURIERdopelnia tezpickup.date,pickup.hours_from,pickup.hours_to,- dla uslug punktowych
apaczkapayload adresu zawiera aliasy identyfikatora punktu (point,foreign_address_id,point_id) dla nadania i odbioru, ApaczkaShipmentService::buildReceiverAddress(...)sklada dane odbiorcy z fallbackami (formularz -> delivery -> punkt odbioru zparcel_name-> customer), a dla przesylek punktowych dodatkowo probuje uzupelnic adres punktu przez APIpoints; przy dalszych brakach dopelnia minimum techniczne, aby nie blokowac tworzenia.
GET /orders/{id}/shipment/{packageId}/status:ShipmentController::checkStatus(Request): Response,- wybiera providera po
shipment_packages.provideri delegujecheckCreationStatus(...).
POST /orders/{id}/shipment/{packageId}/label:ShipmentController::label(Request): Response,- wybiera providera po
shipment_packages.provideri delegujedownloadLabel(...), - dla Apaczka bledy typu
Label is not available for this orderoznaczaja paczke jakoerror, aby nie ponawiac nieskutecznych prob pobrania.
Przeplyw Ustawienia > Integracje > Allegro
GET /settings/integrations/allegro:AllegroIntegrationController::index(Request): Response- odczytuje konfiguracje przez
AllegroIntegrationRepository::getSettings(), - renderuje
resources/views/settings/allegro.phpz domyslnym callback URL.
POST /settings/integrations/allegro/save:AllegroIntegrationController::save(Request): Response- waliduje CSRF, srodowisko,
redirect_urii date startu, - zapisuje ustawienia przez
AllegroIntegrationRepository::saveSettings(...).
POST /settings/integrations/allegro/settings/save:AllegroIntegrationController::saveImportSettings(Request): Response- zapisuje interwal harmonogramu
allegro_orders_import(w minutach) docron_schedules.interval_seconds, - zapisuje kierunek synchronizacji statusow i interwal synchronizacji statusow do
app_settings, - zapisuje interwal joba
allegro_status_syncdocron_schedules.interval_seconds.
POST /settings/integrations/allegro/oauth/start:AllegroIntegrationController::startOAuth(Request): Response- waliduje CSRF i komplet danych OAuth (
client_id,client_secret,redirect_uri), - buduje URL autoryzacji przez
AllegroOAuthClient::buildAuthorizeUrl(...)(scope:orders:read+sale:offers:read), - zapisuje
statew sesji i przekierowuje do Allegro.
POST /settings/integrations/allegro/import-single:AllegroIntegrationController::importSingleOrder(Request): Response- waliduje CSRF i
checkout_form_id, - uruchamia
AllegroOrderImportService::importSingleOrder(...), - po imporcie pokazuje diagnostyke miniatur pozycji (ile pozycji ma obrazek i przyczyny brakow).
POST /settings/integrations/allegro/statuses/save:AllegroIntegrationController::saveStatusMapping(Request): Response- zapisuje mapowanie
allegro_status_code -> orderpro_status_code.
POST /settings/integrations/allegro/statuses/save-bulk:AllegroIntegrationController::saveStatusMappingsBulk(Request): Response- zapisuje mapowania zbiorczo dla wszystkich wierszy tabeli mapowan.
POST /settings/integrations/allegro/statuses/delete:AllegroIntegrationController::deleteStatusMapping(Request): Response- usuwa mapowanie po
mapping_id.
POST /settings/integrations/allegro/statuses/sync:AllegroIntegrationController::syncStatusesFromAllegro(Request): Response- pobiera statusy z API Allegro (
checkout-forms) i dopisuje je do tabeli mapowan.
GET /settings/integrations/allegro/oauth/callback:AllegroIntegrationController::oauthCallback(Request): Response- waliduje
stateicode, - wymienia
codena tokeny przezAllegroOAuthClient::exchangeAuthorizationCode(...), - zapisuje tokeny przez
AllegroIntegrationRepository::saveTokens(...).
AllegroOrderImportService:- pilnuje waznosci tokenu (refresh przed requestem lub retry po
401), - pobiera zamowienie
GET /order/checkout-forms/{id}przezAllegroApiClient, - pobiera przesylki zamowienia
GET /order/checkout-forms/{id}/shipmentsprzezAllegroApiClient::getCheckoutFormShipments(...), - dla pozycji bez obrazka w checkout-form pobiera szczegoly oferty
GET /sale/product-offers/{offerId}i uzupelniaorder_items.media_url, - mapuje forme wysylki Allegro (
delivery.method.name/delivery.method.id) do pol zamowienia (external_carrier_id,external_carrier_account_id), - dla dostawy do punktu odbioru mapuje adres
delivery.pickupPoint.addressi nazwe punktu do adresu typudelivery, - mapuje terminy wysylki z
delivery.time.dispatchdosend_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 (z
integration_idaktywnej instancji Allegro), - zapisuje aggregate przez
OrderImportRepository::upsertOrderAggregate(...).
- pilnuje waznosci tokenu (refresh przed requestem lub retry po
AllegroOrdersSyncService:- uruchamiany z crona (
allegro_orders_import), - korzysta z dynamicznego
integration_idaktywnego 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.
- uruchamiany z crona (
AllegroStatusSyncService:- uruchamiany z crona (
allegro_status_sync), - respektuje ustawienie kierunku
allegro_status_sync_direction, - dla kierunku
allegro_to_orderprowykorzystuje mechanizm importu zamowien do aktualizacji statusow, - dla kierunku
orderpro_to_allegrozwraca wynik informacyjny (tryb przygotowany pod kolejny etap).
- uruchamiany z crona (
Log aktywnosci zamowien
- Tabela
order_activity_logrejestruje wszystkie zdarzenia dotyczace zamowienia. - Typy zdarzen:
status_change,payment,invoice,shipment,message,document,import,note. - Rejestracja zdarzen:
OrdersRepository::recordActivity(...). - Zmiana statusu:
OrdersRepository::updateOrderStatus(...)— aktualizujeorders.external_status_id, wpisuje doorder_status_historyiorder_activity_log. - Import zamowienia:
AllegroOrderImportService::importSingleOrder(...)— po upsert zamowienia rejestruje zdarzenieimportworder_activity_log(nowy import lub re-import/aktualizacja), actor_typeimport, actor_nameAllegro. - Widok szczegolow zamowienia (
GET /orders/{id}) wyswietla log aktywnosci w zakladceHistoria zmian.
Zmiana statusu zamowienia z widoku szczegolow
POST /orders/{id}/status:OrdersController::updateStatus(Request): Response- waliduje CSRF i wybrany status,
- wywoluje
OrdersRepository::updateOrderStatus(...)(aktualizujeorders.external_status_id, wpisuje doorder_status_historyiorder_activity_log), - actor_type:
user, actor_name: nazwa zalogowanego uzytkownika, - po zapisie redirect do
GET /orders/{id}z flash message (sukces/blad).
- Widok szczegolow zamowienia wyswietla dropdown ze wszystkimi aktywnymi statusami (pogrupowanymi wg grup statusow) obok aktualnego statusu.
Przeplyw Ustawienia > Integracja Apaczka
GET /settings/integrations/apaczka:ApaczkaIntegrationController::index(Request): Response- odczytuje konfiguracje przez
ApaczkaIntegrationRepository::getSettings(), - renderuje
resources/views/settings/apaczka.php.
POST /settings/integrations/apaczka/save:ApaczkaIntegrationController::save(Request): Response- waliduje CSRF i klucz API,
- zapisuje zaszyfrowany klucz API przez
ApaczkaIntegrationRepository::saveSettings(...)do tabeli bazowejintegrations(type=apaczka).
Przeplyw Ustawienia > Integracja InPost
GET /settings/integrations/inpost:InpostIntegrationController::index(Request): Response- odczytuje konfiguracje przez
InpostIntegrationRepository::getSettings(), - renderuje
resources/views/settings/inpost.php.
POST /settings/integrations/inpost/save:InpostIntegrationController::save(Request): Response- waliduje CSRF,
- zapisuje ustawienia przez
InpostIntegrationRepository::saveSettings(...):- token API w
integrations.api_key_encrypted(type=inpost), - parametry specyficzne przewoznika w
inpost_integration_settings.
- token API w
Przeplyw Ustawienia > Baza danych
GET /settings/database:SettingsController::database(Request): Response- pobiera
Migrator::status(), przekazuje statystyki i liste pending migracji do widokuresources/views/settings/database.php.
POST /settings/database/migrate:SettingsController::migrate(Request): Response- waliduje CSRF,
- uruchamia
Migrator::runPending(), - zapisuje wynik do flash (
settings_success/settings_error,settings_migrate_logs), - wykonuje redirect do
GET /settings/database.
Zmiany nawigacji
- Sidebar ma teraz grupe
Ustawieniaz podlinkami:Uzytkownicy(/settings/users)Baza danych(/settings/database)
UsersController::index(Request): Responseustawia:activeMenu = settingsactiveSettings = users
- Usunieto wewnetrzny pasek
settings-navz widokow podstron ustawien.
Zasady aktualizacji
- Przy kazdej zmianie dopisz:
- 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
Ustawieniaw kazdym wierszu, - przycisk
Ustawieniaprowadzi 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=) przezfindIntegration(...), - renderuje
resources/views/settings/shoppro.phpz 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 datyorders_fetch_start_date(Y-m-d), - zapisuje konfiguracje przez
ShopproIntegrationsRepository::saveIntegration(...)do tabeli bazowejintegrations(type=shoppro), - zapisuje interwal joba
shoppro_orders_import(minuty) docron_schedules.interval_seconds, - zapisuje kierunek synchronizacji statusow per instancja (
integrations.order_status_sync_direction), - zapisuje interwal joba
shoppro_order_status_sync(minuty) docron_schedules.interval_seconds, - zapisuje interwal joba
shoppro_payment_status_sync(minuty) docron_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_*iintegration_test_logs.
POST /settings/integrations/shoppro/statuses/sync:ShopproIntegrationsController::syncStatuses(Request): Response- pobiera slownik statusow z API (
dictionaries/statuses) przezShopproIntegrationsRepository::fetchOrderStatuses(...), - przekazuje odkryte statusy do widoku zakladki
Statusy(flash/sesja).
POST /settings/integrations/shoppro/statuses/save:ShopproIntegrationsController::saveStatusMappings(Request): Response- waliduje CSRF,
integration_idi kody statusow orderPRO, - zapisuje mapowania per instancja shopPRO przez
ShopproStatusMappingRepository::replaceForIntegration(...)doorder_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_urlprzez pobranieproducts/getpoproduct_id, gdy zamowienie nie zawiera obrazu. - wykrywa zadanie faktury takze po obecnosci danych firmowych (
firm_*) i ustawiaorders.is_invoice, - mapuje adres faktury do
order_addresses.address_type=invoice(firma/NIP/adres) na podstawie polinvoice/billing*/firm_*, - mapuje punkty odbioru (
inpost_paczkomat/orlen_point) do adresudelivery(parcel_external_id,parcel_name, ulica/kod/miasto), - uzupelnia
deliveryo telefon/e-mail klienta i etykiete metody dostawy z kosztem (transport_cost).
- uruchamiany z crona (
ShopproStatusSyncService:- uruchamiany z crona (
shoppro_order_status_sync), - filtruje aktywne instancje
shopPROpo kierunku synchronizacji statusow (shoppro_to_orderpro), - dla wspieranego kierunku wykorzystuje
ShopproOrdersSyncServicedo odswiezenia statusow/importu danych, - dla kierunku
orderpro_to_shoppropomija instancje i zwraca wynik informacyjny (tryb przygotowany pod kolejny etap).
- uruchamiany z crona (
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|detailsi odczytuje flagepaid, - aktualizuje
orders.payment_status,orders.total_paidiorder_payments, - zapisuje log
paymentdoorder_activity_log, - respektuje liste statusow z
integrations.payment_sync_status_codes_json(gdy pusta: fallback na pomijanie statusow finalnych).
- uruchamiany z crona (
- 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.
- laduje formy dostawy wykryte w zamowieniach danej instancji (