# Tech Changelog ## 2026-03-06 - Rozszerzono zakladke `Formy dostawy` o wybor przewoznika (Allegro / InPost) per wiersz: - nowa kolumna `carrier` w tabeli `allegro_delivery_method_mappings`, - select przewoznika determinuje dostepne uslugi (Allegro z API, InPost statyczna lista), - JS przelacza panele uslug w zaleznosci od wybranego przewoznika. - Migracja `20260306_000036_add_carrier_to_delivery_method_mappings.sql`. ## 2026-03-05 - Dodano nowa zakladke `Ustawienia > Integracja InPost`: - route `GET /settings/integrations/inpost` i `POST /settings/integrations/inpost/save`, - widok konfiguracji z polami: token API (szyfrowany), ID organizacji, srodowisko (sandbox/production), - domyslny sposob nadania (POP/paczkomat/kurier), punkt nadania, - domyslny rozmiar paczki (A/B/C), wymiary przesylek kurierskich, - typ etykiety (PDF/ZPL/EPL), paczka weekendowa, auto-ubezpieczenie, multi-paczki. - Dodano klasy: - `App\Modules\Settings\InpostIntegrationController`, - `App\Modules\Settings\InpostIntegrationRepository` (szyfrowanie AES-256-CBC + deszyfrowanie tokenu). - Dodano migracje `20260305_000035_create_inpost_integration_settings_table.sql`. - Rozszerzono nawigacje `Ustawienia` o link `Integracja InPost`. - Import Allegro pobiera przesylki z dedykowanego endpointu `GET /order/checkout-forms/{id}/shipments` zamiast szukac ich w payloadzie checkout form (naprawa zerowej liczby przesylek). - Dodano metode `AllegroApiClient::getCheckoutFormShipments(...)`. - Usunieto duplikat ID zamowienia Allegro w naglowku szczegolow zamowienia (wyswietlane bylo `source_order_id` i `external_order_id` z ta sama wartoscia). - Dodano nazwe integracji (np. "Allegro") przed ID zamowienia w naglowku szczegolow. - Dodano nowa zakladke `Ustawienia > Integracja Apaczka`: - route `GET /settings/integrations/apaczka` i `POST /settings/integrations/apaczka/save`, - widok konfiguracji z polem klucza API (szyfrowany AES-256-CBC jak w integracji Allegro). - Dodano klasy: - `App\Modules\Settings\ApaczkaIntegrationController`, - `App\Modules\Settings\ApaczkaIntegrationRepository`. - Dodano migracje `20260305_000029_create_apaczka_integration_settings_table.sql`: - tabela `apaczka_integration_settings` na konfiguracje klucza API (zaszyfrowany). - Rozszerzono nawigacje `Ustawienia` o link `Integracja Apaczka`. - Dodano reczna zmiane statusu zamowienia z widoku szczegolow: - nowa route `POST /orders/{id}/status`, - nowa metoda `OrdersController::updateStatus(...)`, - dropdown ze wszystkimi aktywnymi statusami (pogrupowane wg grup) w naglowku szczegolow zamowienia, - zmiana rejestrowana w `order_status_history` i `order_activity_log` (actor_type: `user`), - flash messages (sukces/blad) po redirect, - bez zmian schematu. - Import zamowienia z Allegro (reczny i auto-sync) rejestruje zdarzenie `import` w `order_activity_log`: - `AllegroOrderImportService` rozszerzony o zaleznosc `OrdersRepository`, - po kazdym upsert zamowienia wpisywany jest log z informacja o nowym imporcie lub re-imporcie, - actor_type: `import`, actor_name: `Allegro`, - bez zmian schematu. - Dodano uniwersalny log aktywnosci zamowien: - nowa tabela `order_activity_log` (migracja `20260305_000030_create_order_activity_log_table.sql`), - nowe metody w `OrdersRepository`: `recordActivity()`, `recordStatusChange()`, `updateOrderStatus()`, - zakladka `Historia zmian` w szczegolow zamowienia wyswietla tabele z logiem aktywnosci (data, typ, opis, wykonawca), - typy zdarzen: zmiana statusu, platnosc, faktura, przesylka, wiadomosc, dokument, import, notatka, - kolorowe badge'e typow zdarzen, - historia statusow w zakladce `Szczegoly` pokazuje teraz nazwy statusow zamiast surowych kodow. ## 2026-03-04 - Poprawiono kolumne `Data zamowienia` na liscie zamowien: - wartosc jest liczona fallbackiem `orders.ordered_at -> orders.source_created_at -> orders.source_updated_at -> orders.fetched_at`, - domyslne sortowanie listy i filtry zakresu dat korzystaja z tej samej daty efektywnej, co eliminuje puste wartosci przy rekordach bez `ordered_at`. - Import zamowienia Allegro zapisuje teraz forme wysylki: - `delivery.method.name` (fallback `delivery.method.id`) trafia do `orders.external_carrier_id`, - techniczne `delivery.method.id` trafia do `orders.external_carrier_account_id`. - Dopracowano mapowanie dostawy dla zamowien Allegro: - dla dostawy do punktu odbioru adres `Dane wysylki` jest budowany z `delivery.pickupPoint` (nazwa punktu + adres punktu), - terminy z `delivery.time.dispatch` sa zapisywane do `orders.send_date_min` / `orders.send_date_max`. - Rozszerzono UI `Ustawienia > Integracje > Allegro` o zakladke `Ustawienia`: - dodano opcje konfiguracji interwalu pobierania zamowien (minuty), - nowy endpoint zapisu `POST /settings/integrations/allegro/settings/save`, - zapis aktualizuje harmonogram joba `allegro_orders_import` w `cron_schedules`. - Rozszerzono zakladke `Ustawienia` integracji Allegro: - dodano `kierunek synchronizacji statusow` (`Allegro -> orderPRO`, `orderPRO -> Allegro`), - dodano `interwal synchronizacji statusow` (minuty), - zapis do `app_settings` (`allegro_status_sync_direction`, `allegro_status_sync_interval_minutes`) pod przyszly cron synchronizacji statusow. - Dodano cron synchronizacji statusow Allegro: - nowy job type `allegro_status_sync` z harmonogramem domyslnym co 900s, - nowy handler `App\Modules\Cron\AllegroStatusSyncHandler`, - nowy serwis `App\Modules\Settings\AllegroStatusSyncService` (obsluga kierunku sync z ustawien integracji). - Dodano migracje `20260304_000028_add_allegro_status_sync_schedule.sql`: - seed `cron_schedules` dla `allegro_status_sync`, - seed domyslnych ustawien `app_settings` dla kierunku i interwalu synchronizacji statusow. - Dodano automatyczny import zamowien Allegro przez cron: - nowy job type `allegro_orders_import` z harmonogramem co 300s (priorytet 20, max_attempts 3), - nowy handler `App\Modules\Cron\AllegroOrdersImportHandler`, - nowy serwis `App\Modules\Settings\AllegroOrdersSyncService` (stronicowanie checkout forms, deduplikacja/idempotentny import, limity batcha), - nowy repo `App\Modules\Settings\AllegroOrderSyncStateRepository` utrzymujacy kursor i status wykonania w `integration_order_sync_state`. - Podlaczono handler `allegro_orders_import` do runnera crona: - `bin/cron.php` (CLI worker), - `App\Core\Application::maybeRunCronOnWeb` (tryb cron-on-web). - Dodano migracje `20260304_000027_add_allegro_orders_import_schedule.sql`: - seed harmonogramu `allegro_orders_import`, - uzupelnienie kompatybilnosci tabeli `integration_order_sync_state` o kolumny kursora sync. - Dodano obsluge miniatur produktow dla importu Allegro i widokow zamowien: - import pojedynczego zamowienia Allegro zapisuje URL obrazka pozycji (`lineItems.offer.image*`) do `order_items.media_url`, - lista i szczegoly zamowienia rozwiazuja miniature priorytetowo: `order_items.media_url` -> glowny obraz powiazanego produktu orderPRO (`product_channel_map` + `sales_channels=allegro` + `product_images`). - dodano bezpieczny fallback zgodnosci: jesli wymagane tabele/kolumny mapowania produktu nie istnieja w aktualnym schemacie DB, UI korzysta tylko z `order_items.media_url` (bez bledu 404 na szczegolach zamowienia). - Rozszerzono import pojedynczego zamowienia Allegro o fallback pobrania obrazka po `offerId`: - gdy `checkout-form lineItem` nie zawiera obrazka, importer pobiera dane oferty przez `GET /sale/product-offers/{offerId}` i zapisuje URL miniatury do `order_items.media_url`, - obslugiwane sa rowniez URL w formacie `//...` (normalizacja do `https://...`). - Dodano diagnostyke importu obrazkow Allegro: - po imporcie pojedynczego zamowienia UI pokazuje podsumowanie `obrazki: X/Y` i ostrzezenie z przyczynami brakow, - diagnostyka rozroznia m.in. brak obrazka w checkout-form, brak obrazka w API oferty, brak `offerId` oraz bledy HTTP API ofert (np. `403`). - Rozszerzono zakres scope zadany w OAuth Allegro: - autoryzacja prosi teraz o `allegro:api:orders:read` oraz `allegro:api:sale:offers:read`, - po zmianie scope wymagane jest ponowne polaczenie OAuth (`Polacz ponownie`), aby nowe tokeny mialy dostep do API ofert. - Poprawiono odczyt statusow zamowien w UI listy/szczegolow: - status efektywny jest liczony dynamicznie z mapowaniem `allegro_order_status_mappings` (nie tylko przy imporcie), - panel statusow, filtr statusu i etykieta statusu w tabeli korzystaja z tego samego statusu po mapowaniu. - UI mapowania statusow Allegro zmieniono na zapis zbiorczy: - jeden przycisk `Zapisz mapowania` dla wszystkich selectow w tabeli, - nowy endpoint `POST /settings/integrations/allegro/statuses/save-bulk`. - Dodano automatyczne pobieranie statusow Allegro do mapowania: - endpoint `POST /settings/integrations/allegro/statuses/sync`, - przycisk `Pobierz statusy z Allegro` w zakladce `Ustawienia > Integracje > Allegro > Statusy`, - nowa klasa `App\Modules\Settings\AllegroStatusDiscoveryService` (statusy z API `checkout-forms`). - Dodano migracje `20260304_000026_make_allegro_status_mapping_nullable.sql`: - `allegro_order_status_mappings.orderpro_status_code` jest teraz nullable (statusy moga byc najpierw odkryte, potem mapowane). - Zmieniono podejscie do statusow Allegro: - usunieto fallbackowe tlumaczenia statusow z kodu listy zamowien, - dodano zakladke `Statusy` w `Ustawienia > Integracje > Allegro` z recznym mapowaniem `status Allegro -> status orderPRO`. - Dodano migracje `20260304_000025_create_allegro_order_status_mappings_table.sql`. - Dodano `App\Modules\Settings\AllegroStatusMappingRepository`. - Import pojedynczego zamowienia Allegro mapuje teraz status przez `allegro_order_status_mappings` (jesli istnieje wpis), zamiast fallbackowej translacji. - Poprawiono prezentacje statusow na liscie zamowien: - filtr statusu pokazuje etykiety biznesowe zamiast surowych kodow (`external_status_id`), - kody bez mapowania sa tylko formatowane technicznie do czytelnej postaci (`do_odbioru` -> `Do odbioru`). - Dodano reczny import pojedynczego zamowienia Allegro z poziomu `Ustawienia > Integracje > Allegro`: - endpoint `POST /settings/integrations/allegro/import-single`, - formularz z polem `checkout_form_id` w widoku integracji Allegro. - Dodano klasy importu Allegro: - `App\Modules\Settings\AllegroApiClient` (request `GET /order/checkout-forms/{id}`), - `App\Modules\Settings\AllegroOrderImportService` (refresh tokenu + mapowanie payloadu), - `App\Modules\Orders\OrderImportRepository` (upsert aggregate do tabel zamowien). - Import pojedynczego zamowienia dziala idempotentnie po kluczu biznesowym (`source=allegro`, `source_order_id`) i nadpisuje kolekcje 1:N (adresy/pozycje/platnosci/wysylki/notatki/historia) aktualnym snapshotem z API. - Dodano nowy modul crona oparty o tabele `cron_schedules` + `cron_jobs`: - `App\Modules\Cron\CronRepository`, - `App\Modules\Cron\CronRunner`. - Dodano pierwszy handler crona: - `App\Modules\Cron\AllegroTokenRefreshHandler` dla joba `allegro_token_refresh`. - Dodano odswiezanie tokenu OAuth w `App\Modules\Settings\AllegroOAuthClient::refreshAccessToken(...)`. - Rozszerzono `App\Modules\Settings\AllegroIntegrationRepository` o odczyt danych refresh tokenu. - Odtworzono CLI worker `bin/cron.php` (uruchomienie jobow wg harmonogramu i priorytetu). - Dodano migracje `20260304_000024_add_allegro_token_refresh_schedule.sql`: - harmonogram `allegro_token_refresh` (`interval_seconds=3600`, `priority=10`, `max_attempts=3`, `enabled=1`). - Dodano zakladke `Ustawienia > Cron`: - `GET /settings/cron`, - `POST /settings/cron`, - kontrola opcji `cron_run_on_web` i `cron_web_limit`, - podglad harmonogramow i kolejki/historii jobow. - Podlaczono wykonanie crona podczas requestow HTTP: - `App\Core\Application::maybeRunCronOnWeb(Request)` jest uruchamiane w `Application::run()`, - aktywowane ustawieniem `cron_run_on_web` i ograniczane lockiem DB + throttlingiem sesyjnym. - Dodano nowa zakladke `Ustawienia > Integracje > Allegro`: - route i widok konfiguracji, - sekcja z gotowym `redirect_uri` do rejestracji aplikacji Allegro. - Dodano endpointy Allegro OAuth: - `GET /settings/integrations/allegro`, - `POST /settings/integrations/allegro/save`, - `POST /settings/integrations/allegro/oauth/start`, - `GET /settings/integrations/allegro/oauth/callback`. - Dodano klasy: - `App\Modules\Settings\AllegroIntegrationController`, - `App\Modules\Settings\AllegroIntegrationRepository`, - `App\Modules\Settings\AllegroOAuthClient`. - Dodano migracje `20260304_000023_create_allegro_integration_settings_table.sql`: - tabela `allegro_integration_settings` na konfiguracje OAuth2 i tokeny (`client_secret`, `access_token`, `refresh_token` trzymane jako zaszyfrowane). - Dodano walidacje i obsluge flow Authorization Code: - generowanie `state` i walidacja callbacku, - wymiana `code` na tokeny przez endpoint tokenowy Allegro (sandbox/production). - Rozszerzono nawigacje `Ustawienia` o link `Integracje Allegro`. - Dodano style SCSS dla bloku prezentacji callback URL i przebudowano asset CSS (`public/assets/css/app.css`). ## 2026-03-02 - Dodano zakladke `Ustawienia > Statusy` do zarzadzania: - grupami statusow (z kolorem na poziomie grupy), - statusami przypisanymi do grup. - Dodano migracje `20260302_000022_create_order_status_groups_and_statuses_tables.sql`: - tabela `order_status_groups`, - tabela `order_statuses` z FK `order_statuses_group_fk` i kasowaniem kaskadowym. - Dodano `App\Modules\Settings\OrderStatusRepository` (CRUD grup/statusow i walidacja unikalnosci kodow). - Rozszerzono `App\Modules\Settings\SettingsController` o endpointy: - `statuses`, - `createStatusGroup`, `updateStatusGroup`, `deleteStatusGroup`, - `createStatus`, `updateStatus`, `deleteStatus`. - Rozszerzono routing o trasy `/settings/statuses*` i `/settings/status-groups*`. - Sidebar ustawien ma nowy link `Statusy`. - Dodano widok `resources/views/settings/statuses.php` oraz style SCSS dla formularzy/akcji tego widoku. - Potwierdzenia usuwania w nowym widoku realizowane sa przez `window.OrderProAlerts.confirm(...)`. - Przebudowano UI `Ustawienia > Statusy`: - 2 taby (`Statusy`, `Grupy statusow`), - sortowanie realizowane przez drag-and-drop z automatycznym zapisem kolejnosci po upuszczeniu. - Skondensowano UI zakladki `Ustawienia > Statusy`: - elementy listy statusow i grup maja bardziej kompaktowy, jednoliniowy uklad, - zmniejszono paddingi/gapy i wysokosci kontrolek, aby zwiekszyc ilosc danych widocznych bez scrolla. - Wprowadzono globalna preferencje kompaktowego UI w `AGENTS.md`. - Poprawiono generowanie `code` dla statusow/grup: polskie znaki sa transliterowane do ASCII (np. `Nieopłacone` -> `nieoplacone`), zamiast zamiany na `_`. - Dodano skrypt serwisowy `bin/fix_status_codes.php`: - przelicza kody grup/statusow na podstawie aktualnych nazw z transliteracja PL->ASCII, - zapewnia unikalnosc kodow (`_2`, `_3` przy konfliktach), - wspiera `--dry-run` i `--use-remote`. - Wykonano naprawe kodow na bazie zdalnej (`--use-remote`): zaktualizowano 2 grupy i 1 status. - Przygotowano draft generycznego schematu tabel zamowien (Apilo tylko jako przyklad pol API): - dokumentacja: `DOCS/ORDERS_SCHEMA_DRAFT.md`, - draft SQL (nieuruchamiany automatycznie): `database/drafts/20260302_orders_schema_v1.sql`. - Wdrozono generyczny schema zamowien na bazie docelowej przez `bin/deploy_and_seed_orders.php`. - Zasiano dane testowe: - `orders`: 30, - `order_items`: 90, - `order_status_history`: 123, - pozostale kolekcje (adresy/platnosci/wysylki/dokumenty/notatki/tagi) proporcjonalnie. - Dodano endpointy zapisu kolejnosci: - `POST /settings/status-groups/reorder`, - `POST /settings/statuses/reorder`. - Zmieniono obsluge pola `code`: - `code` jest automatycznie generowany przy tworzeniu z nazwy, - po utworzeniu jest tylko do odczytu i nie podlega edycji z formularza. - Reset projektu do trybu `users-only`. - Zarchiwizowano moduly poza `Auth` i `Users` do `archive/2026-03-02_users-only-reset/`. - Uproszczono routing i layout do obslugi logowania i zarzadzania uzytkownikami. - Ustalono nowy standard dokumentacji technicznej w plikach root: - `DB_SCHEMA.md` - `ARCHITECTURE.md` - `TECH_CHANGELOG.md` - Przywrocono sekcje `Ustawienia` w nawigacji jako grupe z podkategoriami: - `Uzytkownicy` (`/users`) - `Baza danych` (`/settings/database`) - Dodano modul `App\Modules\Settings` z kontrolerem `SettingsController` (metody `database`, `migrate`). - Przywrocono reczne uruchamianie migracji z UI: - `GET /settings/database` (status migracji + lista pending plikow), - `POST /settings/database/migrate` (wykonanie pending migracji + log ostatniego uruchomienia). - Zmieniono tlumaczenie `settings.database.title` na `Baza danych` oraz dodano `navigation.database`. - Poprawiono redirect po logowaniu (`AuthController`): `/dashboard` -> `/settings/users`. - Usunieto wewnetrzny pasek zakladek (`settings-nav`) z podstron ustawien. - Podstrona uzytkownikow jest adresowana jako `GET/POST /settings/users` (z zachowaniem tras kompatybilnosci `/users`). - Usunieto z podstron ustawien blok naglowkowy `Ustawienia` + opis, aby zwiekszyc obszar roboczy. - Rozszerzono `bin/deploy_and_seed_orders.php` o parametr `--profile=default|realistic`. - Dodano realistyczny profil seedowania: - wazone losowanie statusow i metod platnosci, - spojne mapowanie `external_status_id` -> `payment_status` i `total_paid`, - bardziej realne reguly tworzenia wpisow `order_payments`, `order_shipments`, `order_documents`, - historia statusow oparta na logicznych sciezkach przejsc (zamiast losowych skokow). - Wykonano ponowne wdrozenie draftu i seed z profilem realistycznym: - komenda: `C:\xampp\php\php.exe bin/deploy_and_seed_orders.php --use-remote --count=30 --profile=realistic`, - wynik: `orders=30`, `order_items=94`, `order_status_history=81`. - Dodano glowna sekcje panelu `Zamowienia` z podzakladka `Lista zamowien`. - Wdrozone endpointy: - `GET /orders` (redirect do `/orders/list`), - `GET /orders/list` (widok listy). - Dodano modul aplikacyjny: - `App\Modules\Orders\OrdersController`, - `App\Modules\Orders\OrdersRepository`. - Widok listy zamowien opiera sie o aktualna baze (`orders`, `order_addresses`, `order_items`, `order_shipments`, `order_documents`) i udostepnia: - filtry (fraza, zrodlo, status, status platnosci, zakres dat), - sortowanie i paginacje, - kompaktowe komorki (referencje, klient, status+platnosc, pozycje, kwoty, wysylka, daty), - skrócone statystyki (`wszystkie`, `oplacone`, `wyslane`). - Rozszerzono liste zamowien o podglad produktow w zamowieniu: - nazwa produktu, - miniatura (z `order_items.media_url`, fallback bez obrazu), - ilosc sztuk per pozycja, - licznik dodatkowych pozycji poza limitem podgladu. - Miniatury produktow na liscie zamowien zostaly powiekszone o 100% (uklad bardziej czytelny). - Dodano modal podgladu zdjecia po kliknieciu miniatury produktu na liscie zamowien. - Status w kolumnie statusow jest prezentowany jako nazwa biznesowa (np. `Nowe`, `W realizacji`) bez technicznego kodu. - Dodano skrypt serwisowy `bin/fill_order_item_images.php` do uzupelniania pustych `order_items.media_url` losowymi URL (`picsum.photos`) i wykonano go na bazie zdalnej (`--use-remote`, zaktualizowano 94 rekordy). - Rozszerzono sidebar o grupe `Zamowienia` z podlinkiem `Lista zamowien`. - Dodano widok szczegolow zamowienia: - endpoint `GET /orders/{id}`, - link do szczegolow po kliknieciu numeru zamowienia na liscie, - uklad sekcji inspirowany widokiem Apilo: pozycje, dane zamowienia, platnosc/wysylka, adresy, notatki, historia. - Dopracowano widok `GET /orders/{id}` do ukladu bardziej zblizonego do Apilo: - lewy panel statusow z licznikami, - prawa kolumna szczegolow z paskiem akcji i tabami sekcji, - aktywne wyroznienie biezacego statusu zamowienia. - Dodano taki sam lewy panel statusow na `GET /orders/list`: - grupy statusow z licznikami, - klikniecie statusu filtruje liste zamowien po `status`, - kolorowe liczniki per status (info/warn/success/danger). - Poprawiono zrodlo panelu statusow (lista + szczegoly): - podzial na grupy i nazwy statusow sa pobierane dynamicznie z `order_status_groups` + `order_statuses`, - kolory pochodza z `order_status_groups.color_hex`, - dla statusow nieprzypisanych do konfiguracji dodawana jest sekcja `Pozostale`. - Ujednolicono render panelu statusow jako jeden widget widoku: - nowy komponent `resources/views/components/order-status-panel.php`, - komponent jest wspolnie uzywany przez `orders/list.php` i `orders/show.php`, - statusy w szczegolach zamowienia sa klikalne (przejscie do listy z odpowiednim filtrem). - Dodano klikalne taby w `orders/show.php`: - przelaczanie sekcji bez przeladowania strony (JS), - aktywny panel `Szczegoly zamowienia`, - pozostale panele (`Historia zmian`, `Przesylki`, `Platnosci`, `Dokumenty`) zawieraja tymczasowe puste boksy. - Zmieniono seed zamowien (`bin/deploy_and_seed_orders.php`): - `external_status_id` jest losowany z aktywnych statusow z tabeli `order_statuses` (zgodnie z konfiguracja w `Ustawienia > Statusy`), - dodano fallback do listy domyslnej, jesli tabela jest pusta/niedostepna, - profil `realistic` ma fallback reguly finansowej dla niestandardowych statusow. - Dodano skrypt serwisowy `bin/randomize_order_statuses.php`: - losowo podmienia `orders.external_status_id` dla juz istniejacych zamowien na aktywne statusy z `order_statuses`, - aktualizuje tez `is_canceled_by_buyer` dla statusu `cancelled`, - wspiera `--use-remote` i `--dry-run`. - Wykonano podmiane statusow na bazie zdalnej (`--use-remote`): zaktualizowano 30 zamowien.