- Implement AllegroShipmentService for managing shipment creation and status checks. - Create ShipmentController to handle shipment preparation and label downloading. - Introduce ShipmentPackageRepository for database interactions related to shipment packages. - Add methods for retrieving delivery services, creating shipments, checking creation status, and downloading labels. - Implement address validation and token management for Allegro API integration.
18 KiB
18 KiB
Architecture
Status
- Projekt po resecie do trybu
users-only.
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/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/saveGET /settings/integrations/inpostPOST /settings/integrations/inpost/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\Orders\OrderImportRepositoryApp\Modules\Settings\CronSettingsControllerApp\Modules\Cron\CronRepositoryApp\Modules\Cron\CronRunnerApp\Modules\Cron\AllegroTokenRefreshHandlerApp\Modules\Cron\AllegroOrdersImportHandlerApp\Modules\Cron\AllegroStatusSyncHandlerApp\Modules\Users\UsersControllerApp\Modules\Users\UserRepositoryApp\Modules\Settings\ApaczkaIntegrationControllerApp\Modules\Settings\ApaczkaIntegrationRepositoryApp\Modules\Settings\InpostIntegrationControllerApp\Modules\Settings\InpostIntegrationRepositoryApp\Modules\Settings\AllegroOrdersSyncServiceApp\Modules\Settings\AllegroOrderSyncStateRepositoryApp\Modules\Settings\AllegroStatusSyncService
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 Allegro(/settings/integrations/allegro).Integracja Apaczka(/settings/integrations/apaczka).Integracja InPost(/settings/integrations/inpost).
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).
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).
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,
- zapisuje aggregate przez
OrderImportRepository::upsertOrderAggregate(...).
- pilnuje waznosci tokenu (refresh przed requestem lub retry po
AllegroOrdersSyncService:- uruchamiany z crona (
allegro_orders_import), - 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(...).
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 (token API szyfrowany AES-256-CBC, parametry domyslne przesylek) przez
InpostIntegrationRepository::saveSettings(...).
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.