73 KiB
73 KiB
Tech Changelog
2026-04-04 (Email templates - split list/form view)
EmailTemplateController:- dodano osobne endpointy widokowe
create()iedit()dla formularza szablonu, - wydzielono render formularza do
renderForm(...), save()przy bledzie walidacji/CSRF wraca na odpowiednia podstrone formularza (/createalbo/edit?id=), zamiast do listy.
- dodano osobne endpointy widokowe
- Routing:
- dodano trasy
GET /settings/email-templates/createorazGET /settings/email-templates/edit.
- dodano trasy
- Widoki:
resources/views/settings/email-templates.phpzawiera tylko liste szablonow i akcje tabeli,- dodano
resources/views/settings/email-templates-form.phpjako osobna podstrone create/edit (Quill, zmienne, preview).
- Brak zmian schematu bazy danych.
2026-04-04 (Phase 69 - Allegro Tracking English Statuses, Plan 01)
DeliveryStatus::slugifyAllegroDescription():- dodano obsluge prefiksow EN (
Parcel has been ...,Parcel is ...,Courier has ...) przed slugifikacja.
- dodano obsluge prefiksow EN (
DeliveryStatus:- rozszerzono
ALLEGRO_EDGE_MAPo slugi EN i ich mapowanie na statusy biznesowe (m.in.awaiting_pick_up,delivered,dispatched,released_for_delivery), - rozszerzono
ALLEGRO_EDGE_DESCRIPTIONSo opisy EN/PL dla nowych slugow, - rozszerzono
guessStatusFromDescription()o keyword fallback dla statusow EN (delivery/return/cancel/pickup/transit/confirmed/created/problem).
- rozszerzono
- Dodano test jednostkowy
tests/Unit/DeliveryStatusTest.phppokrywajacy:- mapowanie EN (
Parcel is awaiting pick-up,Parcel has been delivered), - fallback EN (
released for delivery), - regresje mapowania PL (
Przesylka zostala dostarczona).
- mapowanie EN (
- Brak zmian schematu bazy danych.
2026-04-03 (Phase 64 - Receipt Datetime Precision, Plan 01)
- Migracja
20260403_000076_alter_receipts_issue_date_to_datetime.sql: ALTER TABLE receipts MODIFY issue_date DATETIME NOT NULL. ReceiptController::store(): zapis issue_date jako Y-m-d H:i:s, konwersja z formatu datetime-local (T separator).AccountingController::toTableRow()iexport(): formatowanie issue_date do YYYY-MM-DD HH:MM (substr 0-16).receipt-create.php: input type=datetime-local z domyslna biezaca data+czas.receipts/show.php,receipts/print.php,orders/show.php: wyswietlanie issue_date z godzina (substr 0-16).
2026-04-01 (Phase 63 - Order Item Personalization, Plan 01)
- Migracja
20260401_000075_add_personalization_to_order_items.sql: kolumnapersonalization TEXT NULLworder_items. ShopproOrderMapper::extractPersonalization(): ekstrakcjacustom_fieldsz odpowiedzi shopPRO API, konwersja HTML na czysty tekst (strip_tags, html_entity_decode, br->newline).ShopproOrderMapper::mapItems(): dodanie kluczapersonalizationdo mapowanego itemu.OrderImportRepository::replaceItems(): zapispersonalizationdo INSERT query.resources/views/orders/show.php: warunkowe wyswietlanie personalizacji pod nazwa produktu (div.item-personalization z etykieta i liniami tekstu, escape viae()).resources/scss/app.scss: style.item-personalization(kompaktowy blok, border-left, muted colors).
2026-03-31 (Phase 60 - Order Status Aged Event, Plan 01)
- Migracja
20260331_000074_seed_order_status_aged_cron.sql: seed cron scheduleorder_status_agedco 3600s. OrderStatusAgedService: skanuje zamowienia w danym statusie od X dni (query HAVING MAX(changed_at) naorder_status_history), limit 100/regule, triggerorder.status_aged.OrderStatusAgedHandler: cron handler delegujacy doOrderStatusAgedService::scan().CronHandlerFactory: rejestracja handleraorder_status_aged.AutomationController: dodanoorder.status_ageddoALLOWED_EVENTS,days_in_statusdoALLOWED_CONDITION_TYPES,parseConditionValue+ branchdays_in_status.AutomationService::evaluateDaysInStatusCondition(): ewaluacjacontext.days_in_status >= value.days.resources/views/automation/form.php: opcja "Minelo X dni od zmiany statusu" w zdarzeniach, "Liczba dni w statusie" w warunkach z polem numerycznym.public/assets/js/modules/automation-form.js:buildDaysInStatusInput(), opcjadays_in_statuswaddCondition()ionConditionTypeChange().
2026-03-31 (Phase 59 - Order Status Automation Event, Plan 01)
AutomationController: dodanoorder.status_changeddoALLOWED_EVENTS,order_statusdoALLOWED_CONDITION_TYPES,parseConditionValue+ branchorder_status(walidacja kodow vs DB),buildRuleFromRequest+ branchorder_status.AutomationService::evaluateOrderStatusCondition(): ewaluacja warunku order_status — porownanienew_statusz context vs dozwoloneorder_status_codes.AutomationService::handleUpdateOrderStatus(): pobiera old_status przed zmiana, emituje chain eventorder.status_changedprzezemitEvent()(tylko przy realnej zmianie statusu).OrdersController::changeStatus(): pobiera old_status przedupdateOrderStatus(), emisjaorder.status_changedpo udanej zmianie (try/catch, non-blocking).resources/views/automation/form.php: opcja "Zmiana statusu zamowienia" w zdarzeniach, "Status zamowienia" w warunkach z checkboxami aktywnych statusow.resources/views/automation/index.php: dodano etykietypayment.status_changediorder.status_changeddo$eventLabels.public/assets/js/modules/automation-form.js:buildOrderStatusCheckboxes(), opcjaorder_statuswaddCondition()ionConditionTypeChange().
2026-03-30 (Phase 58 - Automation Form Preserve, Plan 01)
AutomationController::store()iupdate(): re-render formularza z danymi z request zamiast redirect przy bledzie walidacji.AutomationController::buildRuleFromRequest(): buduje tablice$rulez POST data w formacie oczekiwanym przezform.php.AutomationController::renderForm(): nowy parametr$errorMessage— priorytet nad Flash.resources/views/automation/form.php:$isEditsprawdzaisset($rule['id'])(nie$rule !== null), conditions/actions wyciagane z$ruleniezaleznie od$isEdit.
2026-03-30 (Phase 57 - Payment Automation Event, Plan 01)
AutomationController: dodanopayment.status_changeddoALLOWED_EVENTS,payment_statusdoALLOWED_CONDITION_TYPES, stalaPAYMENT_STATUS_OPTIONS(0/1/2), parseConditions dlapayment_status_keys.AutomationService::evaluatePaymentStatusCondition(): ewaluacja warunku payment_status — porownanienew_payment_statusz context vs dozwolone status_keys.OrdersController::addPayment(): emisjapayment.status_changedpo zapisie platnosci (try/catch, non-blocking).ShopproPaymentStatusSyncService::syncSingleOrderPayment(): emisjapayment.status_changedpo zmianie payment_status w cron sync (tylko przy realnej zmianie).CronHandlerFactory: przeniesiono tworzenie$automationServiceprzed$shopproPaymentSyncService, przekazano jako zależność.resources/views/automation/form.php: opcja "Zmiana statusu platnosci" w zdarzeniach, "Status platnosci" w warunkach z checkboxami (Nieoplacone/Czesciowo oplacone/Oplacone).public/assets/js/modules/automation-form.js:buildPaymentStatusCheckboxes(), opcja waddCondition()ionConditionTypeChange().
2026-03-30 (Phase 56 - Order Payments, Plan 01)
- Migracja
20260330_000073_create_order_payments_table.sql: tabelaorder_payments(id, order_id, source_payment_id, external_payment_id, payment_type_id, payment_date, amount, currency, comment, payload_json) + idempotentne dodanie kolumntotal_with_tax,total_paid,external_payment_type_iddoorders. OrdersRepository::addPayment(): INSERT doorder_payments, przeliczenietotal_paidipayment_statusnaorders.OrdersRepository::findOrderSourceInfo(): pobierasource,integration_id,source_order_iddla push do shopPRO.OrdersController::addPayment(): POST/orders/{id}/payment/add— walidacja, zapis platnosci, activity log, push do shopPRO.OrdersController::pushPaymentToShoppro(): po dodaniu platnosci pokrywajacej calosc — PUTset_paiddo shopPRO API.ShopproApiClient::setOrderPaid(): PUT/api.php?endpoint=orders&action=set_paid&id={sourceOrderId}.resources/views/orders/show.php: przycisk "Dodaj platnosc", formularz inline (kwota, typ, data, komentarz), AJAX submit z reload.- Style:
.payment-add-formwresources/scss/app.scss.
2026-03-28 (Phase 51 - Email HTML Layout, Plan 01)
- Migracja
20260328_000001_add_html_layout_to_email_mailboxes.sql: kolumnyheader_htmlTEXT NULL ifooter_htmlTEXT NULL wemail_mailboxes. EmailMailboxRepository::save(): zapisheader_html/footer_htmlw INSERT i UPDATE.EmailMailboxController::save(): pobieraheader_html/footer_htmlz POST i przekazuje do repozytorium.resources/views/settings/email-mailboxes.php: sekcja "Szablon wiadomosci" z dwoma edytorami Quill.js (email-safe toolbar: bold, italic, underline, kolor, wyrownanie, listy, link, image, naglowki h1-h3). Sync innerHTML do hidden inputs przy submit.EmailSendingService: nowa metodacomposeBody()— sklada header + body + footer. Uzywa variableResolver na header/footer. Uzyta wsend()ipreview(). NULL/pusty header/footer = pomijany.
2026-03-28 (Phase 50 - Allegro Shipment Waybill Push, Plan 01)
AllegroShipmentService:- po sukcesie
checkCreationStatus(...)(gdy jesttracking_number) probuje dopiac przesylke do checkout form Allegro, - wykorzystuje
AllegroApiClient::addShipmentToOrder(...)(POST /order/checkout-forms/{id}/shipments), - push wykonywany tylko dla zamowien
orders.source='allegro'i niepustegosource_order_id, - retry pushu po
ALLEGRO_HTTP_401z ponownymtokenManager->resolveToken(), - bledy pushu traktowane jako niekrytyczne (lokalna paczka pozostaje utworzona).
- po sukcesie
AllegroShipmentService::downloadLabel(...):- przy fallbackowym dopelnieniu trackingu (gdy brak numeru w rekordzie paczki) wykonuje ten sam warunkowy push waybilla do Allegro.
- Testy:
- dodano
tests/Unit/AllegroShipmentServiceTest.php(scenariusze: push dla Allegro, brak pushu dla nie-Allegro, fallback przy bledzie API, retry po 401).
- dodano
2026-03-28 (Public HTTPS cron endpoint)
- Dodano publiczny endpoint triggera crona:
GET /cron?token=<CRON_PUBLIC_TOKEN>- dodatkowo kompatybilny wariant sciezki:
GET /cron/token=<CRON_PUBLIC_TOKEN>.
- Token jest walidowany przez
hash_equalsi pochodzi z nowej zmiennej srodowiskowejCRON_PUBLIC_TOKEN. - Endpoint uruchamia
CronRunnerz limitem z ustawieniacron_web_limit. Application::maybeRunCronOnWeb(...)ignoruje teraz sciezki/croni/cron/*, aby uniknac podwojnego triggera.- Zaktualizowano
.env.exampleoCRON_PUBLIC_TOKEN.
2026-03-28 (Hotfix - Apaczka pickup day fallback)
ApaczkaShipmentService:- dodano automatyczny retry
order_senddla bledu APIPickup not available for selected day, - rozszerzono detekcje bledu o wariant komunikatu:
We're sorry, you can't place an order today. Change its date to another working day., - fallback dotyczy tylko
pickup.type=COURIER, - kazdy retry przesuwa
pickup.datena kolejny dzien roboczy (normalizeCourierPickupDate) i ponawia wysylke, - limit fallbacku: do 7 kolejnych dni, potem zwracany jest oryginalny blad API.
- dodano automatyczny retry
2026-03-28 (Phase 49 - Automation History Tab, Plan 01 - rozszerzenie akcji)
- Rozszerzono automatyzacje o nowy typ akcji
update_order_status(UI:Zmiana statusu zamowienia). AutomationController:ALLOWED_ACTION_TYPESzawieraupdate_order_status,- waliduje i parsuje
order_status_codetylko do aktywnych statusow zorder_statuses.
AutomationRepository:- nowa metoda
listActiveOrderStatuses()zwracajaca aktywne statusy (code,name) sortowane rosnaco po nazwie.
- nowa metoda
resources/views/automation/form.phpipublic/assets/js/modules/automation-form.js:- nowa opcja akcji z wyborem docelowego statusu zamowienia.
AutomationService:- nowy handler
handleUpdateOrderStatus(...), - wykonanie zmiany przez
OrdersRepository::updateOrderStatus(...)z aktorem systemowymAutomatyzacja: <nazwa reguly>, - fallback log aktywnosci
automation_order_status_failedgdy zmiana nie powiedzie sie.
- nowy handler
2026-03-28 (Phase 49 - Automation History Tab, Plan 01)
Ustawienia > Zadania automatyczne(/settings/automation) rozdzielone na 2 taby:Ustawienia- obecne zarzadzanie regulami,Historia- log wykonan automatyzacji z filtrowaniem i paginacja.
- Dodano migracje
20260328_000072_create_automation_execution_logs_table.sql:- nowa tabela
automation_execution_logs(event, regula, order, status, wynik, context, timestamp), - indeksy pod filtry historii,
- seed harmonogramu crona
automation_history_cleanup(co 24h).
- nowa tabela
- Nowe klasy backend:
AutomationExecutionLogRepository- zapis/listowanie/paginacja/licznik historii + purge retencji,AutomationHistoryCleanupHandler- usuwanie wpisow starszych niz konfigurowalna liczba dni (domyslnie 30).
AutomationService::trigger(...)zapisuje wpis historii per wykonana regula:successpo poprawnym wykonaniu akcji,failedprzy wyjatku w wykonaniu reguly.
AutomationController::index(...)obsluguje filtry historii (history_*) i paginacje (history_page), zachowujac kompatybilnosc listy regul.- UI historii wykorzystuje kompaktowy formularz filtrow i paginacje z zachowaniem aktywnych parametrow.
2026-03-28 (Phase 48 - Email Template Shipment Variables, Plan 01)
- Email templates (
/settings/email-templates):- dodano zmienne
{{przesylka.numer}}i{{przesylka.link_sledzenia}}wEmailTemplateController::VARIABLE_GROUPS, - rozszerzono
SAMPLE_DATAdo preview o przykladowy numer i URL sledzenia.
- dodano zmienne
VariableResolver:- otrzymuje zaleznosc
ShipmentPackageRepository, - pobiera najnowsza paczke (
findLatestByOrderId(order_id)), - mapuje
przesylka.numeriprzesylka.link_sledzenia, - link jest liczony przez
DeliveryStatus::trackingUrl(provider, tracking_number, carrier_id).
- otrzymuje zaleznosc
- DI:
routes/web.phpiCronHandlerFactoryprzekazujaShipmentPackageRepositorydoVariableResolver.
- Zachowanie brzegowe:
- brak paczki lub brak numeru trackingowego nie psuje renderu - zmienne przesylki zwracaja pusty string.
2026-03-28 (Phase 47 - Shipment Creation Automation, Plan 01)
- Automatyzacja:
- dodano nowe zdarzenie
shipment.created(UI:Utworzenie przesylki), - trigger jest uruchamiany natychmiast po sukcesie
ShipmentController::create()orazShipmentController::createManual(), - kontekst triggera zawiera m.in.
package_id,provider,tracking_number,package_status,delivery_status.
- dodano nowe zdarzenie
- Dodano nowy typ akcji automatyzacji
update_shipment_status(UI:Zmiana statusu przesylki):- walidacja konfiguracji przez
AutomationController(shipment_status_key->status_key), - wykonanie przez
AutomationService::handleUpdateShipmentStatus(...), - aktualizacja
delivery_statustylko przy realnej zmianie (bez falszywych triggerow), - po zmianie statusu emitowane jest
shipment.status_changedz kontekstem zmiany.
- walidacja konfiguracji przez
- Rozszerzono
AutomationServiceo zaleznoscShipmentPackageRepository:- nowa metoda pomocnicza
ShipmentPackageRepository::findLatestByOrderId(int): ?array(fallback wyboru paczki dla akcji).
- nowa metoda pomocnicza
- UI automatyzacji (
resources/views/automation/form.php,resources/views/automation/index.php,public/assets/js/modules/automation-form.js) rozszerzono o:- event
Utworzenie przesylki, - akcje
Zmiana statusu przesylkiz wyborem docelowego statusu biznesowego.
- event
- Aktualizacja DI:
routes/web.phpisrc/Modules/Cron/CronHandlerFactory.phpprzekazujaShipmentPackageRepositorydoAutomationService,ShipmentControllerotrzymujeAutomationServicejako zaleznosc konstruktora.
2026-03-28 (Allegro Status Push - orderPRO -> Allegro)
- Zaimplementowano kierunek synchronizacji statusow
orderpro_to_allegrowAllegroStatusSyncService. AllegroStatusSyncService:- pobiera reczne zmiany statusow (
order_status_history.change_source=manual) dla zamowien Allegro, - buduje reverse mapping (
orderpro_status_code -> allegro_status_code) na podstawieallegro_order_status_mappings, - pushuje statusy do API Allegro i raportuje
pushed/skipped/failed, - aktualizuje kursor
integration_order_sync_state.last_status_pushed_at.
- pobiera reczne zmiany statusow (
- Nowa metoda
AllegroApiClient::updateCheckoutFormFulfillment():- PUT
/order/checkout-forms/{id}/fulfillment, - body JSON:
{"status":"<ALLEGRO_STATUS>"}.
- PUT
AllegroOrderSyncStateRepository: dodano obsluge kursora push (getLastStatusPushedAt,updateLastStatusPushedAt).AllegroStatusMappingRepository: dodano reverse map builderbuildOrderproToAllegroMap().- UI
Ustawienia > Integracje > Allegro > Ustawienia:- odblokowano wybor opcji
orderPRO -> Allegro(usunietodisabledi dopisek(wkrotce)), - zaktualizowano opis hintu kierunku synchronizacji.
- odblokowano wybor opcji
- Dodano testy jednostkowe
tests/Unit/AllegroStatusSyncServiceTest.phpdla scenariuszy push/skip/fail/retry-401.
2026-03-27 (ShopPRO Status Push — orderPRO -> shopPRO)
- Zaimplementowano kierunek synchronizacji statusow
orderpro_to_shopprowShopproStatusSyncService. - Nowa metoda
ShopproApiClient::updateOrderStatus()— PUT/api.php?endpoint=orders&action=change_status&id={id}. - Wydzielono wspolna metode
executeRequest()wShopproApiClient(reuse GET/PUT). ShopproStatusSyncService::syncPushDirection():- buduje reverse mapping (orderpro_status_code -> shoppro_status_code),
- query
order_status_historypo zmianachchange_source=manualpo kursore, - pushuje status do shopPRO API, aktualizuje kursor
last_status_pushed_at.
- Migracja:
20260327_000071_add_last_status_pushed_at_to_sync_state.sql— kolumnalast_status_pushed_atwintegration_order_sync_state. ShopproOrderSyncStateRepository: nowe metodygetLastStatusPushedAt(),updateLastStatusPushedAt().CronHandlerFactory: zaktualizowana kompozycjaShopproStatusSyncServicez nowymi zaleznosciami.
2026-03-25 (Automation - new action "Wystaw paragon")
- Dodano nowy typ akcji automatyzacji:
issue_receipt(Wystaw paragon). - Konfiguracja akcji wymaga kompletu parametrow:
receipt_config_id(aktywna konfiguracja paragonu),issue_date_mode(today/order_date/payment_date),duplicate_policy(skip_if_exists/allow_duplicates).
AutomationController:- rozszerzono
ALLOWED_ACTION_TYPES, - dodano walidacje i parsowanie configu akcji
issue_receipt, - formularz dostaje aktywne konfiguracje paragonow i slowniki opcji.
- rozszerzono
resources/views/automation/form.phpipublic/assets/js/modules/automation-form.js:- nowa pozycja akcji
Wystaw paragon, - dynamiczne pola dla parametrow akcji.
- nowa pozycja akcji
AutomationService:- wykonuje automatyczne wystawienie paragonu przez
ReceiptRepository, - zapisuje activity log sukcesu/pominiecia/bledu,
- ma ochrone przed petla dla eventu
receipt.created(akcjaissue_receiptjest pomijana i logowana), - obsluguje polityke duplikatow.
- wykonuje automatyczne wystawienie paragonu przez
- Aktualizacja DI:
routes/web.phpiCronHandlerFactoryprzekazuja doAutomationServicezaleznosciReceiptRepositoryiReceiptConfigRepository.
- Dodano systemowy mechanizm chain automation dla obecnych i przyszlych zdarzen:
- wspolny kontekst lancucha (
__automation_chain) propagowany miedzy kolejnymi triggerami, emitEvent(...)jako bezpieczny mechanizm emitowania kolejnych eventow z akcji,- ochrona anty-petla przez deduplikacje wykonania
event_type + rule_idw jednym lancuchu, - limit glebokosci lancucha (
MAX_CHAIN_DEPTH) i limit historii wykonan (MAX_CHAIN_EXECUTIONS).
- wspolny kontekst lancucha (
2026-03-25 (Phase 43 - Print Queue Entry Removal, Plan 01)
- Dodano usuwanie wpisu kolejki wydruku:
PrintJobRepository::deleteById(int): bool,PrintSettingsController::deleteJob(Request): Response,- route
POST /settings/printing/jobs/deletewroutes/web.php.
- Widok
resources/views/settings/printing.phpma przyciskUsundla wpisu kolejki z potwierdzeniemwindow.OrderProAlerts.confirm(...). - Dodano style
print-queue-actionsiprint-queue-delete-formwresources/scss/modules/_printing.scss+ rebuildpublic/assets/css/app.css.
2026-03-25 (Phase 42 - Automation Shipment Status Event, Plan 01)
- Rozszerzono automatyzacje o event
shipment.status_changedi condition typeshipment_status:AutomationControllerdopuszcza nowe event/condition i walidujestatus_keys,AutomationService::trigger()przyjmuje kontekst triggera i ocenia warunki statusowe.
- UI automatyzacji (
resources/views/automation/form.php,index.php,public/assets/js/modules/automation-form.js) obsluguje:- wybor eventu
Zmiana statusu przesylki, - nowy warunek biznesowy statusu przesylki:
- zarejestrowana ->
created|confirmed, - do odbioru ->
ready_for_pickup, - nadana w punkcie ->
confirmed|in_transit, - odebrana ->
delivered, - anulowana ->
cancelled, - nieodebrana ->
problem, - odebrana (zwrot) ->
returned.
- zarejestrowana ->
- wybor eventu
ShipmentTrackingHandlertriggerujeAutomationService->trigger('shipment.status_changed', orderId, context)tylko gdydelivery_statusrealnie sie zmieni.CronHandlerFactorybudujeAutomationServicedla procesu cron i przekazuje go doShipmentTrackingHandler; konstruktor dostaje teraz dodatkowobasePath(zmiany wbin/cron.phpiApplication::maybeRunCronOnWeb).
2026-03-25 (Phase 41 - Allegro Import Log Rationalization, Plan 01)
AllegroOrderImportService::importSingleOrder(...)przyjmuje trigger (manual_import,orders_sync,status_sync) i zapisuje go wdetails_jsonloguimport(trigger,trigger_label,source_updated_at).AllegroOrdersSyncServiceiAllegroStatusSyncServiceprzekazuja jawny trigger do importu.OrdersRepository::shouldSkipDuplicateImportActivity(...)deduplikuje kolejne wpisyimport, gdy ostatni wpis ma ten samsource_order_id,source_updated_atitrigger(z wyjatkiem nowo utworzonego zamowienia).- Widok historii zamowienia (
resources/views/orders/show.php) pokazuje przy wpisieimportskondensowany kontekst triggera isource_updated_at.
2026-03-25 (Phase 40 - Remove Order List Bulk Print, Plan 01)
- Usunieto akcje bulk print z listy zamowien:
- OrdersController::index() nie wystawia juz przycisku Drukuj etykiety w header_actions.
- resources/views/orders/list.php nie zawiera juz skryptu wysylajacego bulk request do drukarki.
- Wycofano endpoint i logike backendowa bulk print:
- usunieto trase POST /api/print/jobs/bulk z routes/web.php,
- usunieto metode PrintApiController::bulkCreateJobs(...),
- usunieto nieuzywana metode PrintJobRepository::findPackagesWithLabelsByOrderIds(...).
- Pozostawiono bez zmian druk pojedynczej etykiety przez POST /api/print/jobs oraz API klienta Windows (pending/download/complete).
2026-03-25 (Phase 30 - Button Primary Color Distinction, Plan 01)
- Rozdzielono palete kolorow naglowkow i przyciskow akcji w warstwie SCSS:
resources/scss/shared/_ui-components.scssma nowe tokeny--c-action-primary,--c-action-primary-dark,--focus-ring-action,btn--primaryibtn:focus-visiblekorzystaja z tokenow akcji, bez zmiany kolorusection-titleopartego o--c-primary.
resources/scss/modules/_printing.scss:btn--outline-primaryzostal przepiety z twardego niebieskiego (#4a90d9) na token--c-action-primary.- Przebudowano assety frontendowe komenda
npm run build:css, co zaktualizowalopublic/assets/css/app.css.
2026-03-23 (Phase 26 — Manual Tracking Number, Plan 01)
- Nowa metoda
ShipmentPackageRepository::createManual(int, string, ?string): int— INSERT doshipment_packageszprovider='manual',status='created'. - Nowa metoda
ShipmentController::createManual(Request): Response— endpointPOST /orders/{id}/shipment/manual, walidacja CSRF + tracking_number, activity logshipment_manual. - Nowa route w
routes/web.php:POST /orders/{id}/shipment/manual. resources/views/orders/show.php— formularz inline do dodawania recznego numeru przesylki w zakladce Przesylki; zmienione wyswietlanie przesylek manualnych (status "Dodana recznie", przewoznik z carrier_id, brak etykiety).resources/scss/app.scss— nowa klasa.manual-tracking-form(flex, gap 8px).
2026-03-22 (Phase 21 — Order Source Display, Plan 01)
OrdersRepository::buildListSql()— LEFT JOINintegrations ig ON ig.id = o.integration_id, nowa kolumnaig.name AS integration_name.OrdersRepository::findDetails()— analogiczny LEFT JOIN dla strony szczegolow zamowienia.OrdersRepository::transformOrderRow()— nowe poleintegration_name.OrdersController::toTableRow()— wyswietlaintegration_namegdy niepuste, fallback nasourceLabel()(Allegro/Erli/default).resources/views/orders/show.php— naglowek zamowienia: dwa osobne spany (nazwa integracji + "ID: identyfikator") zamiast jednego.
2026-03-18 (Phase 16 — Zadania automatyczne, Plan 02: Watcher/Executor)
- Nowa klasa
App\Modules\Automation\AutomationService— trigger + ewaluacja warunkow (AND) + wykonanie akcji. - Flow:
ReceiptController::store()->AutomationService::trigger('receipt.created', orderId)-> sprawdzenie warunkow (integration_id) ->EmailSendingService::send(). - Rozszerzenie
EmailSendingService::send()o opcjonalne parametry$recipientEmailOverridei$recipientNameOverride(kompatybilnosc wsteczna). - 3 tryby odbiorcy: 'client' (kupujacy), 'company' (e-mail firmy z company_settings), 'client_and_company' (oba).
- Trigger w try/catch — blad automatyzacji nie blokuje sukcesu tworzenia paragonu.
- Activity log: automation_email_sent / automation_email_failed z actor_type='system'.
2026-03-18 (Phase 16 — Zadania automatyczne, Plan 01: DB + CRUD)
- Nowe tabele:
automation_rules,automation_conditions,automation_actions(migracja 000057). - Nowy modul
App\Modules\Automationz 2 klasami:AutomationController— CRUD regul automatyzacji (index, create, store, edit, update, destroy, toggleStatus).AutomationRepository— operacje DB z transakcjami (create/update atomowe z conditions+actions), findActiveByEvent dla watchera.
- 7 nowych route'ow:
/settings/automation/*. - Widoki:
resources/views/automation/index.php(lista regul),resources/views/automation/form.php(formularz z dynamicznymi warunkami/akcjami). - Nowy JS:
public/assets/js/modules/automation-form.js(dodawanie/usuwanie wierszy warunkow i akcji). - Nowy SCSS:
resources/scss/modules/_automation.scss(style formularza dynamicznego). - Menu nawigacji: dodany link "Zadania automatyczne" w sekcji Ustawienia.
2026-03-17 (Phase 15 — Wysylka e-mail z zamowien)
- Nowa zaleznosc:
phpmailer/phpmailerv7.0.2 (SMTP transport). - Nowy modul
App\Modules\Emailz 3 klasami:EmailSendingService— wysylka e-mail (send, preview), logowanie do email_logs, resolwer skrzynki (mailboxId → template → default).VariableResolver— zamiana{{grupa.zmienna}}na dane zamowienia/kupujacego/adresu/firmy.AttachmentGenerator— generowanie PDF paragonu (dompdf) jako zalacznik in-memory (addStringAttachment).
OrdersController: nowe metodysendEmail(),emailPreview(),loadEmailLogs().- Nowe route'y:
POST /orders/{id}/send-email,POST /orders/{id}/email-preview. - Widok
orders/show.php: przycisk "Wyslij e-mail" + modal (wybor szablonu/skrzynki, podglad, wysylka AJAX). - Zakladka Dokumenty: sekcja "Wysylki e-mail" z historia wyslanych maili (status, podglad body).
- Nowy partial:
resources/views/orders/partials/email-send-modal.php. - Nowy SCSS:
resources/scss/modules/_email-send.scss(modal overlay, podglad, style).
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_clientz 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 nastatic—information_schemaodpytywany co najwyzej raz na cykl PHP zamiast raz per instancja.- Dodano migracje
20260314_000048_add_orders_performance_indexes.sql— indeksy naorders: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$_SESSIONdoapp_settings(kluczcron_web_last_run_at) — eliminuje wielokrotne uruchamianie crona przy wielu aktywnych sesjach. - Deduplikacja migracji
000014→000014b(kolizja zcreate_product_integration_translations). AllegroStatusSyncService::sync()zwracaok:falsedla kierunkuorderpro_to_allegro(wczesniej false-positiveok:true). Opcja UI oznaczona jakodisabledz(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()→ inlinebackground-color). - Ciemniejsze obramowanie pol formularzy:
--c-borderzmieniony z#e2e8f0na#b0bec5. - Hotfix SSL:
getCaBundlePath()zwracanullgdy zaden CA bundle nie znaleziony —CURLOPT_CAINFOustawiany warunkowo, cURL uzywa systemowego CA na serwerze.
2026-03-08
- Poprawiono date podjazdu kuriera w payloadzie Apaczka:
pickup.datedla trybuCOURIERjest normalizowane tak, aby nie wypadal w niedziele (niedziela -> poniedzialek),pickup.hours_tojest ograniczane do16:00(wg limitu API), a okno godzinowe jest korygowane do poprawnej relacjihours_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 firmyma nowe poleOsoba kontaktowa nadawcy, ApaczkaShipmentServicewysylacontact_persondla nadawcy z ustawien firmy.
- nowa migracja
- Uzupelniono kontakt odbiorcy w payloadzie Apaczka:
ApaczkaShipmentServicewysylareceiver.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.typew payloadzieorder_send:- gdy podano
sender_point_idustawiane jestSELF, - gdy brak punktu nadania i usluga dopuszcza odbior kurierem ustawiane jest
COURIER.
- gdy podano
- Poprawiono obsluge punktow nadania/odbioru w payloadzie Apaczka:
- adres
senderireceiverwysyla teraz komplet aliasow punktu (point,foreign_address_id,point_id), - rozszerzono diagnostyke dla bledu API
Niepoprawny sposob nadania przesylkio wskazowke dot.sender_point_id/ doboru uslugi.
- adres
- Wzmocniono fallback adresu odbiorcy dla przesylek punktowych Apaczka (Orlen/InPost):
ApaczkaShipmentServiceprobuje teraz dodatkowo uzupelnic adres punktu (street,postal_code,city) przez APIpointsna podstawiereceiver_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 przesylkeoraz pozostale ekrany korzystajace zsection-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
deliveryz 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(uzywadelivery.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 jakoerrori zapisywany jesterror_message, - dzieki temu przycisk etykiety nie jest ponownie pokazywany dla tego rekordu.
- gdy API zwraca
- Ujednolicono flow etykiet w
Zamowienia > Przygotuj przesylke(dla wszystkich providerow):- po statusie
createdetykieta jest generowana automatycznie przez cykliczne sprawdzanie statusu (backend probujedownloadLabel), - UI nie pokazuje juz przycisku
Generuj etykiete; do czasu gotowosci widoczny jest stanGenerowanie etykiety..., - przycisk
Pobierzpojawia sie dopiero po zapisaniu pliku etykiety (label_path).
- po statusie
- Uzgodniono payload
order_sendApaczka z dokumentacja API v2:ApaczkaShipmentServicewysyla teraz struktureaddress.sender/receiver+shipment[](dimension1/2/3,weightw kg),codjest przekazywany jako obiekt (amount,currency), a wartosc ubezpieczenia przezshipment_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_senddla wskazanego zamowienia (bez klikania w UI), - testuje kombinacje uslug i wariantow pol punktu, raportujac sukces/blad per proba.
- wykonuje automatyczne proby
- Rozszerzono payload punktow w tworzeniu przesylki Apaczka:
- oprocz
pointprzekazywane sa teraz aliasyforeign_address_idipoint_id(dla odbiorcy i nadawcy), - cel: kompatybilnosc z wariantami API wymagajacymi innej nazwy pola punktu.
- oprocz
- Korekta walidacji punktu odbioru Apaczka:
- usunieto twarde blokowanie tworzenia przesylki na podstawie prefiksu punktu (
POP-), - informacja o prefiksie punktu pozostaje tylko jako sugestia diagnostyczna.
- usunieto twarde blokowanie tworzenia przesylki na podstawie prefiksu punktu (
- Poprawiono prefill danych odbiorcy na ekranie
Zamowienia > Przygotuj przesylke:ShipmentControllerdla dostaw do punktu (parcel_external_id/parcel_name) ustawiareceiver_namena dane klienta (address_type=customer),- eliminuje przypadek podstawiania nazwy punktu/metody dostawy w polu
Imie i nazwisko.
- Poprawiono diagnostyke bledow tworzenia przesylki Apaczka:
ApaczkaShipmentServiceprzekazuje terazreceiver_point_iddo payloadureceiver.point(orazsender_point_iddosender.point),- dodano walidacje wymagan uslugi na podstawie
service_structure(np. wymagany punkt odbioru/nadania), - dla bledu API
Brak wyceny dla podanych parametrów zamówieniakomunikat 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:
ShopproOrdersSyncServicewykrywa fakture nie tylko pois_invoice/invoice.required, ale takze po danych firmowych (firm_name/firm_nip),ShopproOrdersSyncService::mapAddresses(...)zapisuje adresinvoice(firma, NIP, adres) na podstawie polinvoice/billing*/firm_*,- widok
orders/showwyswietla terazcompany_nameicompany_tax_numberdla adresu faktury.
- Fix prewyboru uslugi Apaczka na ekranie
Zamowienia > Przygotuj przesylke:- widok
resources/views/shipments/prepare.phpodczytuje ID uslugi Apaczka z fallbackiemservice_id -> id, - naprawia przypadek, gdy przewoznik (
Apaczka) byl wybierany poprawnie, ale usluga dostawy pozostawala pusta mimo mapowania.
- widok
- Poprawiono diagnostyke mapowania form dostawy na ekranie
Zamowienia > Przygotuj przesylke:ShipmentControllerzwraca 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.phpwyswietla ten komunikat bezposrednio pod informacja o metodzie z zamowienia.
- Poprawiono UX wyszukiwania w selectach mapowania form dostawy (zakladki
Formy dostawy):resources/views/settings/allegro.phpprzeszlo z przebudowy opcji<select>na tryb bezpieczny (focus first matchbez 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).
- dla niezamapowanych form domyslny przewoznik to teraz pusty wybor (zamiast
- Dodano architekture provider-agnostic dla wysylek:
- nowy kontrakt
ShipmentProviderInterface, - nowy rejestr
ShipmentProviderRegistry, ShipmentControllerwybiera providera dynamicznie (allegro_wza/apaczka) przy tworzeniu przesylki, sprawdzaniu statusu i pobieraniu etykiety.
- nowy kontrakt
- 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 > Apaczkao polaApp ID,App Secretoraz test polaczenia (POST /settings/integrations/apaczka/test). - poprawiono format podpisu/requestu zgodnie z API v2 (
app_id:route:request_json:expires, endpointy URL zamiast polamethod), co naprawia blad testu polaczenia (brak JSON).
- nowy klient
- Dodano wspolny model mapowania form dostawy dla wielu providerow:
- nowa tabela
carrier_delivery_method_mappings(migracja20260308_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 dostawyw Allegro i shopPRO obsluguja mapowanie naallegro_wzaiapaczka.
- nowa tabela
- Dodano migracje
20260308_000045_extend_apaczka_credentials.sql:- rozszerzenie
apaczka_integration_settingsoapp_idiapp_secret_encrypted, - migracja danych legacy sekretu z
api_key_encrypted.
- rozszerzenie
- Dodano zakladke
Formy dostawydla integracjishopPRO(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.
- nowy endpoint
- Dodano
ShopproDeliveryMethodMappingRepositoryi tabele mapowan perintegration_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(...)orazbin/cron.php.
- nowy job cron
- 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.
- dodano interwal sprawdzania platnosci (minuty) dla joba
- Import zamowien shopPRO zapisuje status platnosci numerycznie (
orders.payment_status) na podstawie flagipaid, 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).
- uzupelnienie kolumny
- Fix danych wysylki dla zamowien shopPRO (np.
OP000000016):ShopproOrdersSyncServicemapujeinpost_paczkomat/orlen_pointdo adresudelivery(punkt, ulica, kod, miasto),- zapisuje
parcel_external_idiparcel_namedla punktu odbioru, deliverydziedziczy 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):ShopproOrdersSyncServicemapuje kwoty zamowienia zsummaryipaid(fallback), ceny pozycji zprice_brutto,- poprawiono laczenie payloadow
orders/listiorders/get|details(zachowanie kluczowych pol z listy), - dodano fallback miniatur pozycji przez API
products/getpoproduct_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 stalegoallegro.
- resolver miniatur pozycji uwzglednia kod kanalu zgodny ze zrodlem zamowienia (
- Korekta layoutu sekcji
Ustawieniadla integracjishopPRO:- wyrownano pola w siatce (
integration-settings-group__grid) przezalign-items: start, - wymuszono spojna wysokosc kontrolek (
.form-control), w tym poladate, - przebudowano CSS (
public/assets/css/app.css) dla rownego przebiegu linii i pol w obu kolumnach.
- wyrownano pola w siatce (
- Fix UX przycisku
Nowa integracjawUstawienia > 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.
- przycisk otwiera teraz tryb wymuszonego tworzenia (
- Poprawiono prezentacje dostawy na szczegolach zamowienia (
orders/show):Platnosc i wysylkasanitizuje nazwe przewoznika (usuwa tagi HTML typu<b>...</b>),Dane wysylkipokazujaparcel_nameiparcel_external_id(np. punkt/paczkomat Allegro),- gdy brak adresu
delivery, sekcjaDane wysylkipokazuje fallback z metody dostawy (external_carrier_id).
- Poprawiono import shopPRO dla formy dostawy:
ShopproOrdersSyncServicesanitizujeexternal_carrier_idiorder_shipments.carrier_provider_id(usuwanie HTML + dekodowanie encji),- rozszerzono fallbacki mapowania przewoznika (
transport,transport_description,transport_id).
- Fix mapowania formy dostawy z shopPRO:
ShopproOrdersSyncServicemapuje terazorders.external_carrier_idz fallbackiem na polatransportitransport_description,orders.external_carrier_account_idmapowane ztransport_id,order_shipments.carrier_provider_idrozszerzone o fallbacktransport/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
deliverytylko 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, wariantyfirst_name/last_name,postcodeitd.),- adres dostawy jest zapisywany takze wtedy, gdy brak pelnej nazwy, ale istnieja inne dane adresowe,
- rozszerzono mapowanie
orders.customer_loginiorders.external_carrier_ido dodatkowe fallbacki z payloadu shopPRO.
- Poprawiono UX zakladki
UstawieniaintegracjishopPRO:- ustawienia sa pogrupowane w sekcje
Pobieranie zamowienorazSynchronizacja statusow, - dodano naglowki sekcji i opisy kontekstu, aby pola nie zlewaly sie wizualnie,
- dodano dedykowane style SCSS (
integration-settings-group*) i przebudowanopublic/assets/css/app.css.
- ustawienia sa pogrupowane w sekcje
- Dodano cron synchronizacji statusow
shopPRO:- nowy handler
App\Modules\Cron\ShopproStatusSyncHandler, - nowy serwis
App\Modules\Settings\ShopproStatusSyncService, - nowy job
shoppro_order_status_syncpodlaczony do runnera wApp\Core\Application::maybeRunCronOnWeb(...)ibin/cron.php.
- nowy handler
- 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_directioni harmonogramcron_schedulesdlashoppro_order_status_sync.
- dodano wybor kierunku synchronizacji statusow (
- 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_directionjesli brak.
- seed/naprawa harmonogramu
- Rozszerzono
ShopproOrdersSyncServiceo opcje uruchomienia filtrowanego pointegration_idi z pominięciem flagiorders_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_importjest podlaczony do wykonania zarowno wApp\Core\Application::maybeRunCronOnWeb(...), jak i wbin/cron.php.
- nowy handler
- Rozszerzono
Ustawienia > Integracje > shopPRO > Ustawienia:- dodano pole interwalu pobierania zamowien (minuty),
- zapis aktualizuje harmonogram
cron_schedulesdla jobashoppro_orders_import.
- Dodano migracje
20260308_000040_ensure_shoppro_orders_import_schedule.sql:- seed/naprawa harmonogramu
shoppro_orders_import(domyslnie 300s, priorytet 90).
- seed/naprawa harmonogramu
- Zadanie #13 z
DOCS/todo.md: dodano stronicowanie historii wUstawienia > Cron:CronSettingsControllerpobierapast_pagez query i przekazuje metadane paginacji do widoku,CronRepositoryrozszerzono ocountPastJobs()orazlistPastJobs(limit, offset),- widok
settings/cron.phprenderuje kontrolki paginacji dla sekcjiHistoria jobow (przeszle).
- Rozpoczeto ujednolicanie modelu integracji na baze
integrations:- dodano klasy wspolne
App\Modules\Settings\IntegrationsRepositoryorazApp\Modules\Settings\IntegrationSecretCipher, - ograniczono duplikacje szyfrowania sekretow integracji (wspolny cipher dla repozytoriow integracji).
- dodano klasy wspolne
- Migracja
20260308_000037_unify_integrations_base_links.sql:- dodaje
integration_iddoallegro_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.
- dodaje
ApaczkaIntegrationRepository:- klucz API zapisuje/odczytuje z
integrations.api_key_encrypted(type=apaczka).
- klucz API zapisuje/odczytuje z
InpostIntegrationRepository:- token API zapisuje/odczytuje z
integrations.api_key_encrypted(type=inpost), - ustawienia specyficzne przewoznika pozostaja w
inpost_integration_settings.
- token API zapisuje/odczytuje z
AllegroIntegrationRepository:- zapewnia powiazanie aktywnego srodowiska OAuth z rekordem bazowym
integrations, - dodana metoda
getActiveIntegrationId()pod spojnosc domeny zamowien/sync.
- zapewnia powiazanie aktywnego srodowiska OAuth z rekordem bazowym
AllegroOrderImportServiceiAllegroOrdersSyncService:- przestaly uzywac stalej/
nulldlaintegration_id, - korzystaja z aktywnego
integration_idAllegro, co eliminuje sztywne zalozenieintegration_id=1.
- przestaly uzywac stalej/
- Dodano wspolny ekran
Ustawienia > Integracje:- nowa route
GET /settings/integrations, - nowa klasa
App\Modules\Settings\IntegrationsHubController, - nawigacja boczna prowadzi do jednego huba integracji.
- nowa route
- Hub integracji zawiera tabele podsumowania oraz akcje per instancja:
- przycisk
Ustawieniaw kazdym wierszu prowadzi do dedykowanego ekranu zaawansowanego providera.
- przycisk
- Fix UI: rozciaganie przyciskow w formularzach (
.form-actions) przy ukladzie grid:- ustawiono
align-items: flex-startorazalign-self: flex-startdla.form-actions .btn, - eliminuje pionowe rozciaganie przyciskow do wysokosci sasiednich pol formularza.
- ustawiono
- 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 wierszshopPROz przejsciem do ekranu ustawien, - dodano pomocnicze style
.table-row-actionsdla kompaktowych akcji w tabelach.
- nowe endpointy:
- Ekran
shopPROrozbudowano o zakladki analogiczne do Allegro:Integracja,Statusy,Ustawienia,Formy dostawy,Ustawieniazawiera polaPobieraj zamowieniaiData 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/syncorazPOST /settings/integrations/shoppro/statuses/save, - dodana klasa
App\Modules\Settings\ShopproStatusMappingRepository, - synchronizacja statusow pobiera slownik
dictionaries/statusesz API shopPRO, - zapis mapowan trafia do
order_status_mappingsperintegration_id(wieloinstancyjnie).
- nowe endpointy:
- Poprawiono parser statusow shopPRO:
- obsluguje odpowiedzi zagniezdzone w
data, - obsluguje rowniez format mapy
kod => nazwaoraz dodatkowe aliasy pol (status_code,status_name,symbol,slug).
- obsluguje odpowiedzi zagniezdzone w
- Dodano migracje naprawcza
20260308_000038_ensure_order_status_mappings_table.sql:- tworzy
order_status_mappingsjesli tabela nie istnieje (scenariusz niepelnej historii migracji na srodowisku).
- tworzy
- Dodano migracje naprawcza
20260308_000039_ensure_integrations_fetch_columns.sql:- uzupelnia w
integrationsbrakujace kolumnyorders_fetch_enablediorders_fetch_start_datedla srodowisk, gdzie tabelaintegrationszostala odtworzona pozniej niz pierwotne migracje shopPRO.
- uzupelnia w
- 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 dlaStatusy/Ustawienia/Formy dostawy.
- przy istniejacych instancjach automatycznie wybierana jest pierwsza integracja (bez koniecznosci wracania do zakladki
2026-03-06
- Fix: synchronizacja statusow Allegro nie aktualizowala zamowien.
- Przyczyna: Allegro API nie zmienia
updatedAtprzy zmianiefulfillment.status. Cursor-based sync (AllegroOrdersSyncService) pomijal takie zamowienia. - Rozwiazanie:
AllegroStatusSyncServiceprzepisany na podejscie direct-query: odpytuje baze o zamowienia Allegro w nie-finalnych statusach i re-importuje je przezAllegroOrderImportService::importSingleOrder(). AllegroStatusSyncServicenie zalezy juz odAllegroOrdersSyncService.- Dodano
ensureDefaultSchedulesExist()wAllegroIntegrationController, aby harmonogramy cron byly tworzone automatycznie.
- Przyczyna: Allegro API nie zmienia
- Rozszerzono zakladke
Formy dostawyo wybor przewoznika (Allegro / InPost) per wiersz:- nowa kolumna
carrierw tabeliallegro_delivery_method_mappings, - select przewoznika determinuje dostepne uslugi (Allegro z API, InPost statyczna lista),
- JS przelacza panele uslug w zaleznosci od wybranego przewoznika.
- nowa kolumna
- Migracja
20260306_000036_add_carrier_to_delivery_method_mappings.sql.
2026-03-05
- Dodano nowa zakladke
Ustawienia > Integracja InPost:- route
GET /settings/integrations/inpostiPOST /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.
- route
- 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
Ustawieniao linkIntegracja InPost. - Import Allegro pobiera przesylki z dedykowanego endpointu
GET /order/checkout-forms/{id}/shipmentszamiast 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_idiexternal_order_idz ta sama wartoscia). - Dodano nazwe integracji (np. "Allegro") przed ID zamowienia w naglowku szczegolow.
- Dodano nowa zakladke
Ustawienia > Integracja Apaczka:- route
GET /settings/integrations/apaczkaiPOST /settings/integrations/apaczka/save, - widok konfiguracji z polem klucza API (szyfrowany AES-256-CBC jak w integracji Allegro).
- route
- Dodano klasy:
App\Modules\Settings\ApaczkaIntegrationController,App\Modules\Settings\ApaczkaIntegrationRepository.
- Dodano migracje
20260305_000029_create_apaczka_integration_settings_table.sql:- tabela
apaczka_integration_settingsna konfiguracje klucza API (zaszyfrowany).
- tabela
- Rozszerzono nawigacje
Ustawieniao linkIntegracja 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_historyiorder_activity_log(actor_type:user), - flash messages (sukces/blad) po redirect,
- bez zmian schematu.
- nowa route
- Import zamowienia z Allegro (reczny i auto-sync) rejestruje zdarzenie
importworder_activity_log:AllegroOrderImportServicerozszerzony o zaleznoscOrdersRepository,- 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(migracja20260305_000030_create_order_activity_log_table.sql), - nowe metody w
OrdersRepository:recordActivity(),recordStatusChange(),updateOrderStatus(), - zakladka
Historia zmianw 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
Szczegolypokazuje teraz nazwy statusow zamiast surowych kodow.
- nowa tabela
2026-03-04
- Poprawiono kolumne
Data zamowieniana 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.
- wartosc jest liczona fallbackiem
- Import zamowienia Allegro zapisuje teraz forme wysylki:
delivery.method.name(fallbackdelivery.method.id) trafia doorders.external_carrier_id,- techniczne
delivery.method.idtrafia doorders.external_carrier_account_id.
- Dopracowano mapowanie dostawy dla zamowien Allegro:
- dla dostawy do punktu odbioru adres
Dane wysylkijest budowany zdelivery.pickupPoint(nazwa punktu + adres punktu), - terminy z
delivery.time.dispatchsa zapisywane doorders.send_date_min/orders.send_date_max.
- dla dostawy do punktu odbioru adres
- Rozszerzono UI
Ustawienia > Integracje > Allegroo zakladkeUstawienia:- dodano opcje konfiguracji interwalu pobierania zamowien (minuty),
- nowy endpoint zapisu
POST /settings/integrations/allegro/settings/save, - zapis aktualizuje harmonogram joba
allegro_orders_importwcron_schedules.
- Rozszerzono zakladke
Ustawieniaintegracji 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
- Dodano cron synchronizacji statusow Allegro:
- nowy job type
allegro_status_syncz harmonogramem domyslnym co 900s, - nowy handler
App\Modules\Cron\AllegroStatusSyncHandler, - nowy serwis
App\Modules\Settings\AllegroStatusSyncService(obsluga kierunku sync z ustawien integracji).
- nowy job type
- Dodano migracje
20260304_000028_add_allegro_status_sync_schedule.sql:- seed
cron_schedulesdlaallegro_status_sync, - seed domyslnych ustawien
app_settingsdla kierunku i interwalu synchronizacji statusow.
- seed
- Dodano automatyczny import zamowien Allegro przez cron:
- nowy job type
allegro_orders_importz 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\AllegroOrderSyncStateRepositoryutrzymujacy kursor i status wykonania wintegration_order_sync_state.
- nowy job type
- Podlaczono handler
allegro_orders_importdo 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_stateo kolumny kursora sync.
- seed harmonogramu
- Dodano obsluge miniatur produktow dla importu Allegro i widokow zamowien:
- import pojedynczego zamowienia Allegro zapisuje URL obrazka pozycji (
lineItems.offer.image*) doorder_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).
- import pojedynczego zamowienia Allegro zapisuje URL obrazka pozycji (
- Rozszerzono import pojedynczego zamowienia Allegro o fallback pobrania obrazka po
offerId:- gdy
checkout-form lineItemnie zawiera obrazka, importer pobiera dane oferty przezGET /sale/product-offers/{offerId}i zapisuje URL miniatury doorder_items.media_url, - obslugiwane sa rowniez URL w formacie
//...(normalizacja dohttps://...).
- gdy
- Dodano diagnostyke importu obrazkow Allegro:
- po imporcie pojedynczego zamowienia UI pokazuje podsumowanie
obrazki: X/Yi ostrzezenie z przyczynami brakow, - diagnostyka rozroznia m.in. brak obrazka w checkout-form, brak obrazka w API oferty, brak
offerIdoraz bledy HTTP API ofert (np.403).
- po imporcie pojedynczego zamowienia UI pokazuje podsumowanie
- Rozszerzono zakres scope zadany w OAuth Allegro:
- autoryzacja prosi teraz o
allegro:api:orders:readorazallegro:api:sale:offers:read, - po zmianie scope wymagane jest ponowne polaczenie OAuth (
Polacz ponownie), aby nowe tokeny mialy dostep do API ofert.
- autoryzacja prosi teraz o
- 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.
- status efektywny jest liczony dynamicznie z mapowaniem
- UI mapowania statusow Allegro zmieniono na zapis zbiorczy:
- jeden przycisk
Zapisz mapowaniadla wszystkich selectow w tabeli, - nowy endpoint
POST /settings/integrations/allegro/statuses/save-bulk.
- jeden przycisk
- Dodano automatyczne pobieranie statusow Allegro do mapowania:
- endpoint
POST /settings/integrations/allegro/statuses/sync, - przycisk
Pobierz statusy z Allegrow zakladceUstawienia > Integracje > Allegro > Statusy, - nowa klasa
App\Modules\Settings\AllegroStatusDiscoveryService(statusy z APIcheckout-forms).
- endpoint
- Dodano migracje
20260304_000026_make_allegro_status_mapping_nullable.sql:allegro_order_status_mappings.orderpro_status_codejest teraz nullable (statusy moga byc najpierw odkryte, potem mapowane).
- Zmieniono podejscie do statusow Allegro:
- usunieto fallbackowe tlumaczenia statusow z kodu listy zamowien,
- dodano zakladke
StatusywUstawienia > Integracje > Allegroz recznym mapowaniemstatus 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).
- filtr statusu pokazuje etykiety biznesowe zamiast surowych kodow (
- Dodano reczny import pojedynczego zamowienia Allegro z poziomu
Ustawienia > Integracje > Allegro:- endpoint
POST /settings/integrations/allegro/import-single, - formularz z polem
checkout_form_idw widoku integracji Allegro.
- endpoint
- Dodano klasy importu Allegro:
App\Modules\Settings\AllegroApiClient(requestGET /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\AllegroTokenRefreshHandlerdla jobaallegro_token_refresh.
- Dodano odswiezanie tokenu OAuth w
App\Modules\Settings\AllegroOAuthClient::refreshAccessToken(...). - Rozszerzono
App\Modules\Settings\AllegroIntegrationRepositoryo 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).
- harmonogram
- Dodano zakladke
Ustawienia > Cron:GET /settings/cron,POST /settings/cron,- kontrola opcji
cron_run_on_webicron_web_limit, - podglad harmonogramow i kolejki/historii jobow.
- Podlaczono wykonanie crona podczas requestow HTTP:
App\Core\Application::maybeRunCronOnWeb(Request)jest uruchamiane wApplication::run(),- aktywowane ustawieniem
cron_run_on_webi ograniczane lockiem DB + throttlingiem sesyjnym.
- Dodano nowa zakladke
Ustawienia > Integracje > Allegro:- route i widok konfiguracji,
- sekcja z gotowym
redirect_urido 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_settingsna konfiguracje OAuth2 i tokeny (client_secret,access_token,refresh_tokentrzymane jako zaszyfrowane).
- tabela
- Dodano walidacje i obsluge flow Authorization Code:
- generowanie
statei walidacja callbacku, - wymiana
codena tokeny przez endpoint tokenowy Allegro (sandbox/production).
- generowanie
- Rozszerzono nawigacje
Ustawieniao linkIntegracje Allegro. - Dodano style SCSS dla bloku prezentacji callback URL i przebudowano asset CSS (
public/assets/css/app.css).
2026-03-02
- Dodano zakladke
Ustawienia > Statusydo 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_statusesz FKorder_statuses_group_fki kasowaniem kaskadowym.
- tabela
- Dodano
App\Modules\Settings\OrderStatusRepository(CRUD grup/statusow i walidacja unikalnosci kodow). - Rozszerzono
App\Modules\Settings\SettingsControllero 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.phporaz 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.
- 2 taby (
- 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
codedla 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,_3przy konfliktach), - wspiera
--dry-runi--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.
- dokumentacja:
- 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:codejest 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
AuthiUsersdoarchive/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.mdARCHITECTURE.mdTECH_CHANGELOG.md
- Przywrocono sekcje
Ustawieniaw nawigacji jako grupe z podkategoriami:Uzytkownicy(/users)Baza danych(/settings/database)
- Dodano modul
App\Modules\Settingsz kontroleremSettingsController(metodydatabase,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.titlenaBaza danychoraz dodanonavigation.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.phpo parametr--profile=default|realistic. - Dodano realistyczny profil seedowania:
- wazone losowanie statusow i metod platnosci,
- spojne mapowanie
external_status_id->payment_statusitotal_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.
- komenda:
- Dodano glowna sekcje panelu
Zamowieniaz podzakladkaLista 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.phpdo uzupelniania pustychorder_items.media_urllosowymi URL (picsum.photos) i wykonano go na bazie zdalnej (--use-remote, zaktualizowano 94 rekordy). - Rozszerzono sidebar o grupe
Zamowieniaz podlinkiemLista 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.
- endpoint
- 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.
- podzial na grupy i nazwy statusow sa pobierane dynamicznie z
- Ujednolicono render panelu statusow jako jeden widget widoku:
- nowy komponent
resources/views/components/order-status-panel.php, - komponent jest wspolnie uzywany przez
orders/list.phpiorders/show.php, - statusy w szczegolach zamowienia sa klikalne (przejscie do listy z odpowiednim filtrem).
- nowy komponent
- 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_idjest losowany z aktywnych statusow z tabeliorder_statuses(zgodnie z konfiguracja wUstawienia > Statusy),- dodano fallback do listy domyslnej, jesli tabela jest pusta/niedostepna,
- profil
realisticma fallback reguly finansowej dla niestandardowych statusow.
- Dodano skrypt serwisowy
bin/randomize_order_statuses.php:- losowo podmienia
orders.external_status_iddla juz istniejacych zamowien na aktywne statusy zorder_statuses, - aktualizuje tez
is_canceled_by_buyerdla statusucancelled, - wspiera
--use-remotei--dry-run.
- losowo podmienia
- Wykonano podmiane statusow na bazie zdalnej (
--use-remote): zaktualizowano 30 zamowien.