Phase 30 complete:\n- split semantic tokens for actions vs informational headings\n- update primary/outline button styles and rebuild CSS assets\n- update TODO/docs and close PAUL loop with SUMMARY
33 KiB
33 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. - Kolory akcji UI (przyciski
btn--primaryi wariantybtn--outline-primary) sa odseparowane od koloru naglowkow (section-title) przez dedykowane tokeny--c-action-primaryi--c-action-primary-darkwresources/scss/shared/_ui-components.scss.
Moduly aktywne
App\Modules\AuthApp\Modules\OrdersApp\Modules\UsersApp\Modules\SettingsApp\Modules\Accounting(modul paragonow — wystawianie, podglad, druk, PDF, lista, eksport XLSX)App\Modules\Settings\EmailMailbox*(skrzynki pocztowe SMTP — CRUD + test polaczenia)App\Modules\Settings\EmailTemplate*(szablony e-mail — CRUD + Quill.js + zmienne + zalaczniki)App\Modules\Email(wysylka e-mail z zamowien — EmailSendingService, VariableResolver, AttachmentGenerator)App\Modules\Automation(zadania automatyczne — reguly zdarzenie/warunki/akcje, CRUD)
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}/statusPOST /orders/{id}/send-email(wysylka e-mail z zamowienia, AJAX)POST /orders/{id}/email-preview(podglad szablonu z rozwiazanymi zmiennymi, AJAX)GET /accounting(lista paragonow z filtrami i paginacja)GET /accounting/export(eksport XLSX z aktywnymi filtrami)GET /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 /settings/accountingPOST /settings/accounting/savePOST /settings/accounting/togglePOST /settings/accounting/deleteGET /settings/email-mailboxesPOST /settings/email-mailboxes/savePOST /settings/email-mailboxes/deletePOST /settings/email-mailboxes/togglePOST /settings/email-mailboxes/testGET /settings/automationGET /settings/automation/createPOST /settings/automation/storeGET /settings/automation/editPOST /settings/automation/updatePOST /settings/automation/deletePOST /settings/automation/toggleGET /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\AllegroTokenManagerApp\Modules\Settings\AllegroApiClientApp\Modules\Settings\AllegroOrderImportServiceApp\Modules\Settings\AllegroStatusMappingRepositoryApp\Modules\Settings\AllegroStatusDiscoveryServiceApp\Modules\Settings\IntegrationsRepositoryApp\Modules\Settings\IntegrationSecretCipherApp\Modules\Settings\EmailMailboxControllerApp\Modules\Settings\EmailMailboxRepositoryApp\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\Settings\ReceiptConfigControllerApp\Modules\Settings\ReceiptConfigRepositoryApp\Modules\Accounting\ReceiptRepository(findById, findByOrderId, create, getNextNumber, paginate, exportData)App\Modules\Accounting\ReceiptController(create, store, show, printView, pdf)App\Modules\Accounting\AccountingController(index — lista paragonow, export — XLSX)App\Modules\Automation\AutomationController(index, create, store, edit, update, destroy, toggleStatus)App\Modules\Automation\AutomationRepository(findAll, findById, create, update, delete, toggleActive, findActiveByEvent)App\Modules\Automation\AutomationService(trigger, evaluateConditions, executeActions — watcher/executor regul automatyzacji; flow: ReceiptController::store() -> trigger('receipt.created') -> ewaluacja warunkow -> EmailSendingService::send())App\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.Ksiegowosc(/settings/accounting) - konfiguracja paragonow.
Przeplyw Ustawienia > Ksiegowosc (konfiguracja paragonow)
GET /settings/accounting:ReceiptConfigController::index(Request): Response- pobiera liste konfiguracji przez
ReceiptConfigRepository::listAll(), - opcjonalnie laduje konfiguracje do edycji przez
findById()(query paramedit), - renderuje widok
resources/views/settings/accounting.php.
POST /settings/accounting/save:ReceiptConfigController::save(Request): Response- waliduje CSRF, nazwe (wymagana) i format numeracji (wymagany, musi zawierac
%N), - zapisuje przez
ReceiptConfigRepository::save(...)(INSERT lub UPDATE wg obecnosciid).
POST /settings/accounting/toggle:ReceiptConfigController::toggleStatus(Request): Response- przelacza
is_activeprzezReceiptConfigRepository::toggleStatus(...).
POST /settings/accounting/delete:ReceiptConfigController::delete(Request): Response- usuwa konfiguracje przez
ReceiptConfigRepository::delete(...), - FK RESTRICT blokuje usuniecie jesli istnieja powiazane paragony.
Przeplyw Wystawianie paragonu z zamowienia
GET /orders/{id}/receipt/create:ReceiptController::create(Request): Response- pobiera zamowienie (OrdersRepository::findDetails), aktywne konfiguracje, dane sprzedawcy,
- renderuje formularz
resources/views/orders/receipt-create.php.
POST /orders/{id}/receipt/store:ReceiptController::store(Request): Response- waliduje CSRF, config_id, istnienie zamowienia,
- buduje snapshoty: seller_data_json (z company_settings), buyer_data_json (z adresow zamowienia), items_json (z pozycji),
- oblicza total_gross, sale_date (wg sale_date_source z konfiguracji), order_reference_value,
- generuje numer atomowo przez
ReceiptRepository::getNextNumber(...)(INSERT ON DUPLICATE KEY UPDATE na receipt_number_counters), - zapisuje paragon przez
ReceiptRepository::create(...), - redirect na /orders/{id} z flash success.
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.
POST /orders/{id}/shipment/manual:ShipmentController::createManual(Request): Response,- tworzy rekord w
shipment_packageszprovider='manual',status='created'i podanymtracking_number, - opcjonalnie zapisuje nazwe przewoznika w
carrier_id, - loguje zdarzenie
shipment_manualworder_activity_log, ShipmentPackageRepository::createManual(int $orderId, string $trackingNumber, ?string $carrierName): int.
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(...).
AllegroTokenManager:- Shared Allegro OAuth token resolver. Checks expiry and refreshes via
AllegroOAuthClientwhen needed. Injected into all Allegro service classes (AllegroOrderImportService,AllegroOrdersSyncService,AllegroStatusDiscoveryService,AllegroShipmentService).
- Shared Allegro OAuth token resolver. Checks expiry and refreshes via
AllegroOrderImportService:- pilnuje waznosci tokenu przez
AllegroTokenManager::resolveToken()(refresh przed requestem lub retry po401), - 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 przez
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 (