Files
orderPRO/DOCS/TECH_CHANGELOG.md
Jacek Pyziak 1b5e403c31 Add Allegro shipment service and related components
- 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.
2026-03-06 01:06:59 +01:00

300 lines
21 KiB
Markdown

# 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.