Files
orderPRO/DOCS/TECH_CHANGELOG.md
Jacek Pyziak 3223aac4d9 feat(13-email-mailboxes): phase 13 complete — email DB foundation + SMTP mailbox CRUD
3 migrations (email_mailboxes, email_templates, email_logs), full CRUD
for SMTP mailboxes with encrypted passwords (IntegrationSecretCipher),
native SMTP connection test via stream_socket_client, sidebar navigation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-15 23:57:33 +01:00

46 KiB

Tech Changelog

2026-03-15 (Phase 13 — DB + Skrzynki pocztowe)

  • Dodano 3 migracje email: 000054_create_email_mailboxes_table, 000055_create_email_templates_table, 000056_create_email_logs_table.
  • Nowe klasy: EmailMailboxController (index, save, delete, toggleStatus, testConnection), EmailMailboxRepository (listAll, findById, save, delete, toggleStatus, listActive).
  • Test polaczenia SMTP przez natywny stream_socket_client z pelnym handshake (EHLO → STARTTLS → AUTH LOGIN) — bez zewnetrznych bibliotek.
  • Hasla SMTP szyfrowane przez IntegrationSecretCipher (AES-256-CBC + HMAC-SHA256).
  • Widok settings/email-mailboxes.php — lista skrzynek + formularz CRUD + AJAX test polaczenia.
  • Nawigacja: link "Skrzynki pocztowe" w sidebar Settings.
  • 5 nowych route'ow: GET/POST /settings/email-mailboxes/*.

2026-03-14

  • Zoptymalizowano zapytanie listy zamowien (OrdersRepository::buildListSql()):
    • 4 correlated subqueries (items_count, items_qty, shipments_count, documents_count) zastapiono aggregating LEFT JOINami — eliminuje N+1 na kazdym wierszu listy.
  • OrdersRepository::canResolveMappedMedia() — zamiana instance property na staticinformation_schema odpytywany co najwyzej raz na cykl PHP zamiast raz per instancja.
  • Dodano migracje 20260314_000048_add_orders_performance_indexes.sql — indeksy na orders: source, external_status_id, ordered_at, composite (source, external_status_id).
  • Dodano SSL verification (CURLOPT_SSL_VERIFYPEER => true, CURLOPT_SSL_VERIFYHOST => 2, CURLOPT_CAINFO) do 4 klas ApiClient: AllegroApiClient (3 metody), AllegroOAuthClient, ShopproApiClient, ApaczkaApiClient. Fallback: $_ENV['CURL_CA_BUNDLE_PATH'] → XAMPP cacert.pem → system CA bundle.
  • Cron web throttle (isWebCronThrottled()) przeniesiony z $_SESSION do app_settings (klucz cron_web_last_run_at) — eliminuje wielokrotne uruchamianie crona przy wielu aktywnych sesjach.
  • Deduplikacja migracji 000014000014b (kolizja z create_product_integration_translations).
  • AllegroStatusSyncService::sync() zwraca ok:false dla kierunku orderpro_to_allegro (wczesniej false-positive ok:true). Opcja UI oznaczona jako disabled z (wkrotce).
  • Lista zamowien: source wyswietlany przed ID z prefixem ID:; sourceLabel() mapuje shoppro→shopPRO, allegro→Allegro.
  • Statusy zamowien na liscie kolorowane kolorem grupy z konfiguracji (statusColorMap() → inline background-color).
  • Ciemniejsze obramowanie pol formularzy: --c-border zmieniony z #e2e8f0 na #b0bec5.
  • Hotfix SSL: getCaBundlePath() zwraca null gdy zaden CA bundle nie znaleziony — CURLOPT_CAINFO ustawiany warunkowo, cURL uzywa systemowego CA na serwerze.

2026-03-08

  • Poprawiono date podjazdu kuriera w payloadzie Apaczka:
    • pickup.date dla trybu COURIER jest normalizowane tak, aby nie wypadal w niedziele (niedziela -> poniedzialek),
    • pickup.hours_to jest ograniczane do 16:00 (wg limitu API), a okno godzinowe jest korygowane do poprawnej relacji hours_from < hours_to,
    • eliminuje blad API Field PickupLocation->MaxPickupDate cannot be set to Sunday.
  • Dodano pole firmy sender_contact_person (osoba kontaktowa nadawcy):
    • nowa migracja 20260308_000046_extend_company_settings_contact_person.sql,
    • UI Ustawienia > Dane firmy ma nowe pole Osoba kontaktowa nadawcy,
    • ApaczkaShipmentService wysyla contact_person dla nadawcy z ustawien firmy.
  • Uzupelniono kontakt odbiorcy w payloadzie Apaczka:
    • ApaczkaShipmentService wysyla receiver.contact_person (fallback na dane odbiorcy/klienta z zamowienia),
    • eliminuje blad API: Osoba kontaktowa nadawcy/odbiorcy: Pole jest wymagane.
  • Dla tworzenia przesylek Apaczka dodano jawne pole pickup.type w payloadzie order_send:
    • gdy podano sender_point_id ustawiane jest SELF,
    • gdy brak punktu nadania i usluga dopuszcza odbior kurierem ustawiane jest COURIER.
  • Poprawiono obsluge punktow nadania/odbioru w payloadzie Apaczka:
    • adres sender i receiver wysyla teraz komplet aliasow punktu (point, foreign_address_id, point_id),
    • rozszerzono diagnostyke dla bledu API Niepoprawny sposob nadania przesylki o wskazowke dot. sender_point_id / doboru uslugi.
  • Wzmocniono fallback adresu odbiorcy dla przesylek punktowych Apaczka (Orlen/InPost):
    • ApaczkaShipmentService probuje teraz dodatkowo uzupelnic adres punktu (street, postal_code, city) przez API points na podstawie receiver_point_id,
    • jezeli zamowienie punktowe dalej nie ma kompletu danych adresowych, serwis uzupelnia techniczne minimum (line1, city, postal_code) zamiast blokowac tworzenie przesylki bledem walidacji lokalnej.
  • Ujednolicono i wzmocniono naglowki sekcji UI (h2/h3/h4.section-title) w widokach:
    • naglowki sekcyjne maja teraz wyrazniejszy styl (akcent lewy, delikatne tlo, obramowanie),
    • zmiana jest globalna (SCSS), obejmuje m.in. Zamowienia > Przygotuj przesylke oraz pozostale ekrany korzystajace z section-title.
  • Poprawiono fallback danych odbiorcy dla przesylek punktowych Apaczka (w tym Orlen Paczka):
    • ApaczkaShipmentService::buildReceiverAddress(...) uzupelnia brakujace pola z wielu zrodel w kolejnosci:
      • dane z formularza,
      • adres delivery z zamowienia,
      • dane punktu z parcel_name (ulica, kod, miasto),
      • dane klienta (name, phone, email, country),
    • adres ulicy sklada teraz street_name + street_number,
    • naprawiono fallback receiver_point_id (uzywa delivery.parcel_external_id, usunieto bledne odwolanie do niezdefiniowanej zmiennej).
  • Poprawiono obsluge usunietych/nieosiagalnych etykiet Apaczka:
    • gdy API zwraca Label is not available for this order, rekord paczki jest oznaczany jako error i zapisywany jest error_message,
    • dzieki temu przycisk etykiety nie jest ponownie pokazywany dla tego rekordu.
  • Ujednolicono flow etykiet w Zamowienia > Przygotuj przesylke (dla wszystkich providerow):
    • po statusie created etykieta jest generowana automatycznie przez cykliczne sprawdzanie statusu (backend probuje downloadLabel),
    • UI nie pokazuje juz przycisku Generuj etykiete; do czasu gotowosci widoczny jest stan Generowanie etykiety...,
    • przycisk Pobierz pojawia sie dopiero po zapisaniu pliku etykiety (label_path).
  • Uzgodniono payload order_send Apaczka z dokumentacja API v2:
    • ApaczkaShipmentService wysyla teraz strukture address.sender/receiver + shipment[] (dimension1/2/3, weight w kg),
    • cod jest przekazywany jako obiekt (amount, currency), a wartosc ubezpieczenia przez shipment_value + shipment_currency,
    • punkty sa przekazywane jako foreign_address_id (z aliasami diagnostycznymi),
    • naprawilo to blad wyceny dla zamowienia testowego #21 (utworzenie przesylki zakonczone sukcesem).
  • Dodano techniczny skrypt diagnostyczny tools/apaczka_probe_order.php:
    • wykonuje automatyczne proby order_send dla wskazanego zamowienia (bez klikania w UI),
    • testuje kombinacje uslug i wariantow pol punktu, raportujac sukces/blad per proba.
  • Rozszerzono payload punktow w tworzeniu przesylki Apaczka:
    • oprocz point przekazywane sa teraz aliasy foreign_address_id i point_id (dla odbiorcy i nadawcy),
    • cel: kompatybilnosc z wariantami API wymagajacymi innej nazwy pola punktu.
  • Korekta walidacji punktu odbioru Apaczka:
    • usunieto twarde blokowanie tworzenia przesylki na podstawie prefiksu punktu (POP-),
    • informacja o prefiksie punktu pozostaje tylko jako sugestia diagnostyczna.
  • Poprawiono prefill danych odbiorcy na ekranie Zamowienia > Przygotuj przesylke:
    • ShipmentController dla dostaw do punktu (parcel_external_id/parcel_name) ustawia receiver_name na dane klienta (address_type=customer),
    • eliminuje przypadek podstawiania nazwy punktu/metody dostawy w polu Imie i nazwisko.
  • Poprawiono diagnostyke bledow tworzenia przesylki Apaczka:
    • ApaczkaShipmentService przekazuje teraz receiver_point_id do payloadu receiver.point (oraz sender_point_id do sender.point),
    • dodano walidacje wymagan uslugi na podstawie service_structure (np. wymagany punkt odbioru/nadania),
    • dla bledu API Brak wyceny dla podanych parametrów zamówienia komunikat zawiera rozszerzona diagnostyke (service_id/nazwa/supplier, punkt odbioru/nadania, gabaryt/waga) i hint o niedopasowaniu uslugi do typu punktu.
  • Poprawiono import danych faktury z shopPRO:
    • ShopproOrdersSyncService wykrywa fakture nie tylko po is_invoice/invoice.required, ale takze po danych firmowych (firm_name/firm_nip),
    • ShopproOrdersSyncService::mapAddresses(...) zapisuje adres invoice (firma, NIP, adres) na podstawie pol invoice/billing*/firm_*,
    • widok orders/show wyswietla teraz company_name i company_tax_number dla adresu faktury.
  • Fix prewyboru uslugi Apaczka na ekranie Zamowienia > Przygotuj przesylke:
    • widok resources/views/shipments/prepare.php odczytuje ID uslugi Apaczka z fallbackiem service_id -> id,
    • naprawia przypadek, gdy przewoznik (Apaczka) byl wybierany poprawnie, ale usluga dostawy pozostawala pusta mimo mapowania.
  • Poprawiono diagnostyke mapowania form dostawy na ekranie Zamowienia > Przygotuj przesylke:
    • ShipmentController zwraca teraz komunikat diagnostyczny, gdy brak mapowania metody dostawy,
    • komunikat rozroznia brak mapowan dla instancji shopPRO (source_integration_id) od braku mapowania konkretnej metody,
    • widok resources/views/shipments/prepare.php wyswietla ten komunikat bezposrednio pod informacja o metodzie z zamowienia.
  • Poprawiono UX wyszukiwania w selectach mapowania form dostawy (zakladki Formy dostawy):
    • resources/views/settings/allegro.php przeszlo z przebudowy opcji <select> na tryb bezpieczny (focus first match bez modyfikacji listy opcji),
    • eliminuje przypadki „znikajacych” opcji i problem z wyborem uslugi po zmianie przewoznika na Apaczka,
    • ujednolicono zachowanie z resources/views/settings/shoppro.php.
  • Poprawiono inicjalizacje stanu mapowania przewoznika (allegro.php, shoppro.php):
    • dla niezamapowanych form domyslny przewoznik to teraz pusty wybor (zamiast allegro),
    • panel uslugi (Allegro/InPost/Apaczka/pusty) jest synchronizowany na starcie z realna wartoscia selecta przewoznika (showPanel(carrierSelect.value)),
    • usunieto pozostaly po refaktorze odwolanie do nieistniejacej zmiennej $currentAllegroId (zastapione $currentMethodId).
  • Dodano architekture provider-agnostic dla wysylek:
    • nowy kontrakt ShipmentProviderInterface,
    • nowy rejestr ShipmentProviderRegistry,
    • ShipmentController wybiera providera dynamicznie (allegro_wza / apaczka) przy tworzeniu przesylki, sprawdzaniu statusu i pobieraniu etykiety.
  • Dodano integracje API Apaczka v2:
    • nowy klient App\Modules\Settings\ApaczkaApiClient (service_structure, order_send, order_details, waybill, points),
    • nowy serwis wysylkowy App\Modules\Shipments\ApaczkaShipmentService,
    • rozszerzone Ustawienia > Integracje > Apaczka o pola App ID, App Secret oraz test polaczenia (POST /settings/integrations/apaczka/test).
    • poprawiono format podpisu/requestu zgodnie z API v2 (app_id:route:request_json:expires, endpointy URL zamiast pola method), co naprawia blad testu polaczenia (brak JSON).
  • Dodano wspolny model mapowania form dostawy dla wielu providerow:
    • nowa tabela carrier_delivery_method_mappings (migracja 20260308_000044_create_carrier_delivery_method_mappings_table.sql),
    • nowy repo CarrierDeliveryMethodMappingRepository,
    • backfill danych z tabel legacy (allegro_delivery_method_mappings, shoppro_delivery_method_mappings),
    • zakladki Formy dostawy w Allegro i shopPRO obsluguja mapowanie na allegro_wza i apaczka.
  • Dodano migracje 20260308_000045_extend_apaczka_credentials.sql:
    • rozszerzenie apaczka_integration_settings o app_id i app_secret_encrypted,
    • migracja danych legacy sekretu z api_key_encrypted.
  • Dodano zakladke Formy dostawy dla integracji shopPRO (analogicznie do Allegro):
    • nowy endpoint POST /settings/integrations/shoppro/delivery/save,
    • mapowanie per instancja: forma dostawy shopPRO -> usluga dostawy Allegro/InPost WZA,
    • UI z wyborem przewoznika (allegro/inpost) i wyszukiwaniem uslug Allegro.
  • Dodano ShopproDeliveryMethodMappingRepository i tabele mapowan per integration_id.
  • Dodano migracje 20260308_000043_create_shoppro_delivery_method_mappings_table.sql.
  • Dodano synchronizacje platnosci shopPRO oparta o flage paid:
    • nowy job cron shoppro_payment_status_sync,
    • nowy handler App\Modules\Cron\ShopproPaymentStatusSyncHandler,
    • nowy serwis App\Modules\Settings\ShopproPaymentStatusSyncService,
    • runner podlaczony w App\Core\Application::maybeRunCronOnWeb(...) oraz bin/cron.php.
  • Rozszerzono Ustawienia > Integracje > shopPRO > Ustawienia:
    • dodano interwal sprawdzania platnosci (minuty) dla joba shoppro_payment_status_sync,
    • dodano wybor statusow orderPRO, dla ktorych cron ma sprawdzac oplacenie zamowien,
    • zapis konfiguracji listy statusow per instancja trafia do integrations.payment_sync_status_codes_json.
  • Import zamowien shopPRO zapisuje status platnosci numerycznie (orders.payment_status) na podstawie flagi paid, co unifikuje filtry/statystyki platnosci z Allegro.
  • Dodano migracje 20260308_000042_ensure_shoppro_payment_sync_schedule_and_columns.sql:
    • uzupelnienie kolumny integrations.payment_sync_status_codes_json,
    • seed/naprawa harmonogramu shoppro_payment_status_sync (domyslnie 600s, priorytet 105).
  • Fix danych wysylki dla zamowien shopPRO (np. OP000000016):
    • ShopproOrdersSyncService mapuje inpost_paczkomat/orlen_point do adresu delivery (punkt, ulica, kod, miasto),
    • zapisuje parcel_external_id i parcel_name dla punktu odbioru,
    • delivery dziedziczy telefon i e-mail klienta, gdy API nie zwraca osobnych danych odbiorcy,
    • etykieta metody dostawy (external_carrier_id) zawiera koszt transportu (transport_cost), np. Paczkomaty InPost - przedpłata: 13.5 zł.
  • Fix importu shopPRO dla listy zamowien (Kwoty + miniatury):
    • ShopproOrdersSyncService mapuje kwoty zamowienia z summary i paid (fallback), ceny pozycji z price_brutto,
    • poprawiono laczenie payloadow orders/list i orders/get|details (zachowanie kluczowych pol z listy),
    • dodano fallback miniatur pozycji przez API products/get po product_id,
    • dodano dodatkowy fallback miniatur po parent_product_id (warianty), gdy obraz nie istnieje na produkcie potomnym.
  • OrdersRepository:
    • resolver miniatur pozycji uwzglednia kod kanalu zgodny ze zrodlem zamowienia (o.source) zamiast stalego allegro.
  • Korekta layoutu sekcji Ustawienia dla integracji shopPRO:
    • wyrownano pola w siatce (integration-settings-group__grid) przez align-items: start,
    • wymuszono spojna wysokosc kontrolek (.form-control), w tym pola date,
    • przebudowano CSS (public/assets/css/app.css) dla rownego przebiegu linii i pol w obu kolumnach.
  • Fix UX przycisku Nowa integracja w Ustawienia > Integracje > shopPRO:
    • przycisk otwiera teraz tryb wymuszonego tworzenia (?new=1),
    • ShopproIntegrationsController::index(...) nie auto-wybiera wtedy pierwszej istniejacej integracji,
    • formularz tworzenia otwiera sie zawsze jako pusty.
  • Poprawiono prezentacje dostawy na szczegolach zamowienia (orders/show):
    • Platnosc i wysylka sanitizuje nazwe przewoznika (usuwa tagi HTML typu <b>...</b>),
    • Dane wysylki pokazuja parcel_name i parcel_external_id (np. punkt/paczkomat Allegro),
    • gdy brak adresu delivery, sekcja Dane wysylki pokazuje fallback z metody dostawy (external_carrier_id).
  • Poprawiono import shopPRO dla formy dostawy:
    • ShopproOrdersSyncService sanitizuje external_carrier_id i order_shipments.carrier_provider_id (usuwanie HTML + dekodowanie encji),
    • rozszerzono fallbacki mapowania przewoznika (transport, transport_description, transport_id).
  • Fix mapowania formy dostawy z shopPRO:
    • ShopproOrdersSyncService mapuje teraz orders.external_carrier_id z fallbackiem na pola transport i transport_description,
    • orders.external_carrier_account_id mapowane z transport_id,
    • order_shipments.carrier_provider_id rozszerzone o fallback transport/transport_description.
  • Fix importu adresow shopPRO na realnym payloadzie zamowien (client_name, client_surname, client_email, client_phone):
    • ShopproOrdersSyncService::mapAddresses(...) mapuje teraz pola klienta w formacie flat (bez zagniezdzenia),
    • usunieto przypadek tworzenia pustego adresu delivery tylko na bazie fallbacku e-mail,
    • po wymuszonym re-sync zamowienia #13 dane zamawiajacego zapisaly sie jako Jacek Pyziak, pyziak84@gmail.com, 530755774.
  • Poprawiono mapowanie danych adresowych w imporcie zamowien shopPRO:
    • ShopproOrdersSyncService::mapAddresses(...) obsluguje rozszerzony zestaw aliasow pol klienta i dostawy (buyer/customer/client, billing_address, shipping_address, delivery_address, receiver, warianty first_name/last_name, postcode itd.),
    • adres dostawy jest zapisywany takze wtedy, gdy brak pelnej nazwy, ale istnieja inne dane adresowe,
    • rozszerzono mapowanie orders.customer_login i orders.external_carrier_id o dodatkowe fallbacki z payloadu shopPRO.
  • Poprawiono UX zakladki Ustawienia integracji shopPRO:
    • ustawienia sa pogrupowane w sekcje Pobieranie zamowien oraz Synchronizacja statusow,
    • dodano naglowki sekcji i opisy kontekstu, aby pola nie zlewaly sie wizualnie,
    • dodano dedykowane style SCSS (integration-settings-group*) i przebudowano public/assets/css/app.css.
  • Dodano cron synchronizacji statusow shopPRO:
    • nowy handler App\Modules\Cron\ShopproStatusSyncHandler,
    • nowy serwis App\Modules\Settings\ShopproStatusSyncService,
    • nowy job shoppro_order_status_sync podlaczony do runnera w App\Core\Application::maybeRunCronOnWeb(...) i bin/cron.php.
  • Rozszerzono Ustawienia > Integracje > shopPRO > Ustawienia:
    • dodano wybor kierunku synchronizacji statusow (shopPRO -> orderPRO, orderPRO -> shopPRO),
    • dodano pole interwalu synchronizacji statusow (minuty),
    • zapis aktualizuje integrations.order_status_sync_direction i harmonogram cron_schedules dla shoppro_order_status_sync.
  • Dodano migracje 20260308_000041_ensure_shoppro_status_sync_schedule_and_direction.sql:
    • seed/naprawa harmonogramu shoppro_order_status_sync (domyslnie 900s, priorytet 100),
    • uzupelnienie kolumny integrations.order_status_sync_direction jesli brak.
  • Rozszerzono ShopproOrdersSyncService o opcje uruchomienia filtrowanego po integration_id i z pominięciem flagi orders_fetch_enabled (wykorzystane przez cron synchronizacji statusow).
  • Dodano cron importu zamowien z shopPRO:
    • nowy handler App\Modules\Cron\ShopproOrdersImportHandler,
    • nowy serwis App\Modules\Settings\ShopproOrdersSyncService,
    • nowy klient API App\Modules\Settings\ShopproApiClient,
    • job shoppro_orders_import jest podlaczony do wykonania zarowno w App\Core\Application::maybeRunCronOnWeb(...), jak i w bin/cron.php.
  • Rozszerzono Ustawienia > Integracje > shopPRO > Ustawienia:
    • dodano pole interwalu pobierania zamowien (minuty),
    • zapis aktualizuje harmonogram cron_schedules dla joba shoppro_orders_import.
  • Dodano migracje 20260308_000040_ensure_shoppro_orders_import_schedule.sql:
    • seed/naprawa harmonogramu shoppro_orders_import (domyslnie 300s, priorytet 90).
  • Zadanie #13 z DOCS/todo.md: dodano stronicowanie historii w Ustawienia > Cron:
    • CronSettingsController pobiera past_page z query i przekazuje metadane paginacji do widoku,
    • CronRepository rozszerzono o countPastJobs() oraz listPastJobs(limit, offset),
    • widok settings/cron.php renderuje kontrolki paginacji dla sekcji Historia jobow (przeszle).
  • Rozpoczeto ujednolicanie modelu integracji na baze integrations:
    • dodano klasy wspolne App\Modules\Settings\IntegrationsRepository oraz App\Modules\Settings\IntegrationSecretCipher,
    • ograniczono duplikacje szyfrowania sekretow integracji (wspolny cipher dla repozytoriow integracji).
  • Migracja 20260308_000037_unify_integrations_base_links.sql:
    • dodaje integration_id do allegro_integration_settings, apaczka_integration_settings, inpost_integration_settings,
    • podpina relacje 1:1 FK do integrations,
    • seeduje bazowe rekordy providerow (allegro, apaczka, inpost) i backfilluje powiazania.
  • ApaczkaIntegrationRepository:
    • klucz API zapisuje/odczytuje z integrations.api_key_encrypted (type=apaczka).
  • InpostIntegrationRepository:
    • token API zapisuje/odczytuje z integrations.api_key_encrypted (type=inpost),
    • ustawienia specyficzne przewoznika pozostaja w inpost_integration_settings.
  • AllegroIntegrationRepository:
    • zapewnia powiazanie aktywnego srodowiska OAuth z rekordem bazowym integrations,
    • dodana metoda getActiveIntegrationId() pod spojnosc domeny zamowien/sync.
  • AllegroOrderImportService i AllegroOrdersSyncService:
    • przestaly uzywac stalej/null dla integration_id,
    • korzystaja z aktywnego integration_id Allegro, co eliminuje sztywne zalozenie integration_id=1.
  • Dodano wspolny ekran Ustawienia > Integracje:
    • nowa route GET /settings/integrations,
    • nowa klasa App\Modules\Settings\IntegrationsHubController,
    • nawigacja boczna prowadzi do jednego huba integracji.
  • Hub integracji zawiera tabele podsumowania oraz akcje per instancja:
    • przycisk Ustawienia w kazdym wierszu prowadzi do dedykowanego ekranu zaawansowanego providera.
  • Fix UI: rozciaganie przyciskow w formularzach (.form-actions) przy ukladzie grid:
    • ustawiono align-items: flex-start oraz align-self: flex-start dla .form-actions .btn,
    • eliminuje pionowe rozciaganie przyciskow do wysokosci sasiednich pol formularza.
  • Dodano wieloinstancyjna konfiguracje integracji shopPRO:
    • nowe endpointy: GET /settings/integrations/shoppro, POST /settings/integrations/shoppro/save, POST /settings/integrations/shoppro/test,
    • nowa klasa App\Modules\Settings\ShopproIntegrationsController,
    • nowy widok resources/views/settings/shoppro.php (lista instancji, formularz dodawania/edycji, test polaczenia),
    • hub integracji (/settings/integrations) zawiera wiersz shopPRO z przejsciem do ekranu ustawien,
    • dodano pomocnicze style .table-row-actions dla kompaktowych akcji w tabelach.
  • Ekran shopPRO rozbudowano o zakladki analogiczne do Allegro:
    • Integracja, Statusy, Ustawienia, Formy dostawy,
    • Ustawienia zawiera pola Pobieraj zamowienia i Data startu pobierania,
    • zapis/odczyt tych pol jest realizowany przez tabele bazowa integrations (orders_fetch_enabled, orders_fetch_start_date).
  • Wdrozone mapowanie statusow shopPRO (zakladka Statusy):
    • nowe endpointy: POST /settings/integrations/shoppro/statuses/sync oraz POST /settings/integrations/shoppro/statuses/save,
    • dodana klasa App\Modules\Settings\ShopproStatusMappingRepository,
    • synchronizacja statusow pobiera slownik dictionaries/statuses z API shopPRO,
    • zapis mapowan trafia do order_status_mappings per integration_id (wieloinstancyjnie).
  • Poprawiono parser statusow shopPRO:
    • obsluguje odpowiedzi zagniezdzone w data,
    • obsluguje rowniez format mapy kod => nazwa oraz dodatkowe aliasy pol (status_code, status_name, symbol, slug).
  • Dodano migracje naprawcza 20260308_000038_ensure_order_status_mappings_table.sql:
    • tworzy order_status_mappings jesli tabela nie istnieje (scenariusz niepelnej historii migracji na srodowisku).
  • Dodano migracje naprawcza 20260308_000039_ensure_integrations_fetch_columns.sql:
    • uzupelnia w integrations brakujace kolumny orders_fetch_enabled i orders_fetch_start_date dla srodowisk, gdzie tabela integrations zostala odtworzona pozniej niz pierwotne migracje shopPRO.
  • Poprawiono UX ekranu shopPRO:
    • przy istniejacych instancjach automatycznie wybierana jest pierwsza integracja (bez koniecznosci wracania do zakladki Integracja),
    • dodano przełącznik instancji nad zakladkami (Wybrana integracja) dostepny globalnie dla Statusy/Ustawienia/Formy dostawy.

2026-03-06

  • Fix: synchronizacja statusow Allegro nie aktualizowala zamowien.
    • Przyczyna: Allegro API nie zmienia updatedAt przy zmianie fulfillment.status. Cursor-based sync (AllegroOrdersSyncService) pomijal takie zamowienia.
    • Rozwiazanie: AllegroStatusSyncService przepisany na podejscie direct-query: odpytuje baze o zamowienia Allegro w nie-finalnych statusach i re-importuje je przez AllegroOrderImportService::importSingleOrder().
    • AllegroStatusSyncService nie zalezy juz od AllegroOrdersSyncService.
    • Dodano ensureDefaultSchedulesExist() w AllegroIntegrationController, aby harmonogramy cron byly tworzone automatycznie.
  • 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.