diff --git a/.paul/TODO.md b/.paul/TODO.md
deleted file mode 100644
index f153208..0000000
--- a/.paul/TODO.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# TODO
-
-> Przeniesione do `.paul/codebase/todo.md`
diff --git a/.paul/docs/API.md b/.paul/docs/API.md
deleted file mode 100644
index c39e2fa..0000000
--- a/.paul/docs/API.md
+++ /dev/null
@@ -1,177 +0,0 @@
-# API
-
-## Zakres
-- Dokument opisuje aktualne endpointy z `routes/web.php` (stan repo: 2026-04-18).
-- Runtime API jest oparte o sesje (`AuthMiddleware`) i CSRF dla formularzy.
-- Publiczny endpoint bez sesji: `GET /cron` (token w query lub segmencie sciezki).
-- API dla klienta drukowania uzywa `X-Api-Key` (`ApiKeyMiddleware`).
-
-## Uwierzytelnianie
-- Session auth: wszystkie trasy panelowe i wiekszosc tras `/api/*`.
-- API key auth: tylko zdalne kolejki druku.
-- CSRF: wszystkie trasy `POST` w panelu (`_token` w body).
-
-## Endpointy publiczne
-- `GET /health` - status aplikacji JSON.
-- `GET /info` - strona info.
-- `GET /cron?token=...` - uruchomienie crona przez HTTPS.
-- `GET /cron/{tokenValue}` - alternatywny wariant tokenu w sciezce.
-
-## Auth
-- `GET /login` - formularz logowania.
-- `POST /login` - logowanie.
-- `POST /logout` - wylogowanie.
-
-## Nawigacja i dashboard
-- `GET /` - redirect do `/settings/users` (zalogowany) albo `/login`.
-- `GET /users` - redirect do `/settings/users`.
-- `GET /orders` - redirect do `/orders/list`.
-- `GET /settings` - redirect do `/settings/users`.
-
-## Orders
-- `GET /orders/list` - lista zamowien; AJAX zwraca fragmenty HTML tabeli/panelu statusow.
-- `GET /orders/{id}` - szczegoly zamowienia.
-- `POST /orders/{id}/status` - zmiana statusu; obsluguje HTML i AJAX JSON.
-- `POST /orders/{id}/details/update` - update formy dostawy/platnosci.
-- `POST /orders/{id}/send-email` - wysylka e-mail z szablonu (JSON).
-- `POST /orders/{id}/email-preview` - preview e-maila (JSON: subject/body/attachments).
-- `POST /orders/{id}/payment/add` - reczne dodanie platnosci (JSON).
-- `GET /api/orders/search` - quick search (JSON).
-- `GET /api/orders/{id}/preview` - podglad mini karty zamowienia (HTML fragment).
-
-## Receipts i accounting
-- `GET /orders/{id}/receipt/create`
-- `POST /orders/{id}/receipt/store`
-- `GET /orders/{id}/receipt/{receiptId}`
-- `GET /orders/{id}/receipt/{receiptId}/print`
-- `GET /orders/{id}/receipt/{receiptId}/pdf`
-- `GET /accounting` - lista paragonow.
-- `POST /accounting/export` - eksport danych ksiegowych.
-
-## Shipments
-- `GET /orders/{id}/shipment/prepare`
-- `POST /orders/{id}/shipment/create`
-- `GET /orders/{id}/shipment/{packageId}/status`
-- `POST /orders/{id}/shipment/{packageId}/label`
-- `POST /orders/{id}/shipment/manual`
-- `POST /orders/{id}/shipment/{packageId}/delete`
-
-## Printing API
-- Session auth:
-- `POST /api/print/jobs` - dodanie zlecenia druku.
-- `GET /api/print/jobs/status` - statusy kolejek.
-- API key auth (`X-Api-Key`):
-- `GET /api/print/jobs/pending` - lista zadan `pending`.
-- `GET /api/print/jobs/{id}/download` - pobranie etykiety.
-- `POST /api/print/jobs/{id}/complete` - finalizacja zadania.
-
-## Settings: users i baza
-- `GET /settings/users`
-- `POST /settings/users`
-- `GET /settings/database`
-- `POST /settings/database/migrate`
-
-## Settings: statusy
-- `GET /settings/statuses`
-- `POST /settings/status-groups`
-- `POST /settings/status-groups/update`
-- `POST /settings/status-groups/delete`
-- `POST /settings/status-groups/reorder`
-- `POST /settings/statuses/create`
-- `POST /settings/statuses/update`
-- `POST /settings/statuses/delete`
-- `POST /settings/statuses/reorder`
-
-## Settings: cron i integracje
-- `GET /settings/cron`
-- `POST /settings/cron`
-- `GET /settings/integrations`
-
-## Settings: Allegro
-- `GET /settings/integrations/allegro`
-- `POST /settings/integrations/allegro/save`
-- `POST /settings/integrations/allegro/settings/save`
-- `POST /settings/integrations/allegro/oauth/start`
-- `GET /settings/integrations/allegro/oauth/callback`
-- `POST /settings/integrations/allegro/import-single`
-- `POST /settings/integrations/allegro/statuses/save`
-- `POST /settings/integrations/allegro/statuses/save-bulk`
-- `POST /settings/integrations/allegro/statuses/delete`
-- `POST /settings/integrations/allegro/statuses/save-pull`
-- `POST /settings/integrations/allegro/statuses/sync`
-- `POST /settings/integrations/allegro/delivery/save`
-
-## Settings: Apaczka / Inpost / shopPRO
-- `GET /settings/integrations/apaczka`
-- `POST /settings/integrations/apaczka/save`
-- `POST /settings/integrations/apaczka/test`
-- `GET /settings/integrations/inpost`
-- `POST /settings/integrations/inpost/save`
-- `GET /settings/integrations/shoppro`
-- `POST /settings/integrations/shoppro/save`
-- `POST /settings/integrations/shoppro/test`
-- `POST /settings/integrations/shoppro/statuses/save`
-- `POST /settings/integrations/shoppro/statuses/save-pull`
-- `POST /settings/integrations/shoppro/statuses/sync`
-- `POST /settings/integrations/shoppro/delivery/save`
-
-## Settings: firma, e-mail, automatyzacja, delivery mapping
-- `GET /settings/company`
-- `POST /settings/company/save`
-- `GET /settings/accounting`
-- `POST /settings/accounting/save`
-- `POST /settings/accounting/toggle`
-- `POST /settings/accounting/delete`
-- `GET /settings/email-mailboxes`
-- `POST /settings/email-mailboxes/save`
-- `POST /settings/email-mailboxes/delete`
-- `POST /settings/email-mailboxes/toggle`
-- `POST /settings/email-mailboxes/test`
-- `GET /settings/email-templates`
-- `GET /settings/email-templates/create`
-- `GET /settings/email-templates/edit`
-- `POST /settings/email-templates/save`
-- `POST /settings/email-templates/delete`
-- `POST /settings/email-templates/duplicate`
-- `POST /settings/email-templates/toggle`
-- `POST /settings/email-templates/preview`
-- `GET /settings/email-templates/variables`
-- `GET /settings/automation`
-- `GET /settings/automation/create`
-- `POST /settings/automation/store`
-- `GET /settings/automation/edit`
-- `POST /settings/automation/update`
-- `POST /settings/automation/delete`
-- `POST /settings/automation/duplicate`
-- `POST /settings/automation/toggle`
-- `GET /settings/delivery-status-mappings`
-- `POST /settings/delivery-status-mappings/save`
-- `POST /settings/delivery-status-mappings/save-bulk`
-- `POST /settings/delivery-status-mappings/reset`
-- `POST /settings/delivery-status-mappings/reset-all`
-
-## Settings: druk i mapowania projektow
-- `GET /settings/printing`
-- `POST /settings/printing/keys/create`
-- `POST /settings/printing/keys/{id}/delete`
-- `POST /settings/printing/jobs/delete`
-- `GET /settings/project-mappings`
-- `POST /settings/project-mappings`
-- `POST /settings/project-mappings/{id}/update`
-- `POST /settings/project-mappings/{id}/delete`
-- `POST /settings/project-mappings/{id}/toggle`
-
-## API shipment presets
-- `GET /api/shipment-presets`
-- `POST /api/shipment-presets`
-- `POST /api/shipment-presets/update`
-- `POST /api/shipment-presets/delete`
-
-## Kontrakty JSON (najwazniejsze)
-- `GET /health`: `{status, app, timestamp}`.
-- `GET /cron*`: `{ok, message, limit, timestamp}` albo blad `{ok:false, message, error?}`.
-- `POST /api/print/jobs`: tworzy rekord kolejki dla `package_id`; zwraca JSON statusu.
-- `GET /api/print/jobs/pending`: lista pending dla klienta desktop.
-- `POST /api/print/jobs/{id}/complete`: potwierdza wydruk, ustawia `completed`.
-- `GET /api/orders/search`: `{results:[...]}`.
-- `POST /orders/{id}/payment/add`: `{ok, payment_id, payment_status, total_paid}` lub blad.
diff --git a/.paul/docs/ARCHITECTURE.md b/.paul/docs/ARCHITECTURE.md
deleted file mode 100644
index 2b145b0..0000000
--- a/.paul/docs/ARCHITECTURE.md
+++ /dev/null
@@ -1,127 +0,0 @@
-# ARCHITECTURE
-
-## Zakres
-- Dokument opisuje aktualna architekture kodu (stan repo: 2026-04-19).
-- Zrodlem prawdy sa: `src/`, `routes/web.php`, `database/migrations/`.
-
-## Warstwy systemu
-- `Core`: bootstrap aplikacji, router, request/response, sesja, template, migrator, logger.
-- `Modules/*Controller`: obsluga requestow HTTP i walidacja wejscia.
-- `Modules/*Repository`: dostep do danych przez PDO/Medoo (prepared statements).
-- `Modules/*Service`: logika domenowa i integracje zewnetrzne.
-- `Cron`: runner, schedulery i handlery jobow okresowych.
-
-## Moduly domenowe
-- `Auth`: logowanie, wylogowanie, middleware sesyjne.
-- `Users`: zarzadzanie uzytkownikami panelu.
-- `Orders`: lista, szczegoly, statusy, platnosci reczne, preview, quick search.
-- `Shipments`: przygotowanie, tworzenie, status trackingu, etykiety, usuwanie, paczki reczne.
-- `Accounting`: paragony i eksport ksiegowy.
-- `Email`: wysylka i preview wiadomosci z resolverem zmiennych i zalacznikow.
-- `Automation`: reguly event-condition-action, historia wykonan.
-- `Settings`: konfiguracja statusow, integracji, cron, skrzynek, szablonow, drukowania, mapowan projektow.
-- `Printing`: API kolejkowania wydruku i klucze API dla klienta desktop.
-- `Statistics`: raporty i agregacje dzienne zamowien z filtrowaniem po datach, kanalach i grupach statusow.
-- `Cron`: synchronizacje integracji i zadania utrzymaniowe.
-- `Info`: endpoint diagnostyczny `/info`.
-
-## Kluczowe klasy i odpowiedzialnosci
-- `App\Core\Application`: bootstrap, dispatch requestu, opcjonalny web-cron z lockiem DB.
-- `App\Modules\Cron\CronRunner`: pobiera kolejke jobow z `cron_schedules/cron_jobs` i wykonuje handlery.
-- `App\Modules\Cron\CronHandlerFactory`: sklada zaleznosci i mapuje `job_type -> handler`.
-- `App\Modules\Orders\OrdersController`: flow UI zamowien + endpointy AJAX; `buildCustomerRiskInfo/composeCustomerRiskText` skladaja alert klienta ze zwrotami do widoku `orders/show`.
-- `App\Modules\Orders\OrdersRepository`: query listy/szczegolow zamowien, update statusow, activity log; `customerReturnedCountSubquerySql` generuje correlated subquery dopasowujaca historyczne zamowienia klienta po email/phone/name z paczka `returned` (self-exclusion).
-- `App\Modules\Shipments\ShipmentController`: flow przesylek i etykiet.
-- `App\Modules\Shipments\ShipmentPackageRepository`: CRUD paczek + `findReturnedByCustomer(customer, excludeOrderId)` zwraca liste zwroconych paczek klienta dla bannera ryzyka w szczegolach zamowienia.
-- `App\Modules\Shipments\ShipmentProviderRegistry`: wybor providera wysylki po `provider_code`.
-- `App\Modules\Printing\PrintApiController`: endpointy kolejki wydruku (session/api-key).
-- `App\Modules\Automation\AutomationService`: trigger eventow, ewaluacja warunkow, wykonanie akcji.
-- `App\Modules\Settings\ProjectMappingController`: CRUD mapowania produkt -> skrypt generacji projektu.
-- `App\Modules\Statistics\OrdersStatisticsController`: endpoint `/statistics/orders`, walidacja filtrow i przygotowanie modelu tabeli.
-- `App\Modules\Statistics\OrdersStatisticsRepository`: agregacje SQL dzienne (`COUNT`, `SUM total_net`, `SUM total_with_tax`) i mapowanie filtrow kanal/status-group.
-
-## Integracje zewnetrzne
-- Allegro: OAuth, import zamowien, sync statusow push/pull, mapowania statusow i dostaw.
-- shopPRO: import zamowien, sync statusow push/pull, sync platnosci, mapowania statusow i dostaw.
-- Apaczka: konfiguracja API, tworzenie i tracking przesylek.
-- InPost: konfiguracja API, tworzenie i tracking przesylek.
-
-## Glowny przeplyw HTTP
-- Request -> `Router` -> middleware (`AuthMiddleware` lub `ApiKeyMiddleware`) -> Controller.
-- Controller waliduje dane i CSRF, wywoluje Repository/Service.
-- Response: HTML (widoki) albo JSON (endpointy AJAX/API).
-
-### Przeplyw Statystyk Zamowien
-- Route: `GET /statistics/orders` (wymaga sesji uzytkownika).
-- Controller:
- - parsuje `date_from`, `date_to`, `channels[]`, `status_groups[]`,
- - ustawia domyslne grupy statusow (wszystkie poza grupa `anulowane`),
- - pobiera agregaty dzienne z repozytorium,
- - buduje tabele z dynamicznymi kolumnami kanalow i stopka `Razem`.
-- Repository:
- - liczy kanaly jako `allegro` oraz `shoppro:{integration_id}`,
- - dla statusu efektywnego allegro stosuje mapowanie `allegro_order_status_mappings`,
- - zwraca zagregowane rekordy dzien/kanal.
-
-## Glowny przeplyw Cron
-- Trigger:
-- `GET /cron` (public token) lub web-cron w `Application::maybeRunCronOnWeb`.
-- `CronRunner::run(limit)` przetwarza aktywne zadania.
-- Obslugiwane joby:
-- `allegro_token_refresh`
-- `allegro_orders_import`
-- `allegro_status_sync`
-- `shoppro_orders_import`
-- `shoppro_order_status_sync`
-- `shoppro_payment_status_sync`
-- `shipment_tracking_sync`
-- `automation_history_cleanup`
-- `order_status_aged`
-
-## Automatyzacja
-- Triggerowana z wielu miejsc (m.in. zmiana statusu, przesylki, platnosci, wystawienie paragonu, cron age).
-- `AutomationService`:
-- wyszukuje aktywne reguly po `event_type`,
-- sprawdza warunki,
-- wykonuje akcje (`send_email`, `issue_receipt`, `update_shipment_status`, `update_order_status`),
-- zapisuje wynik do `automation_execution_logs`.
-- Warunek `order_status` czyta status z kontekstu eventu:
- - `new_status` dla eventow zmianowych (`order.status_changed`),
- - `current_status` dla eventu czasu w statusie (`order.status_aged`).
-- Akcja `send_email` ma opcjonalna flage `send_once_per_order`:
- - konfiguracja trzymana w `automation_actions.action_config`,
- - deduplikacja oparta o `automation_email_once_deliveries` (`rule_id + action_id + order_id` UNIQUE),
- - wpis "wyslano raz" zapisywany tylko po udanej wysylce (`EmailSendingService::send(...)->success = true`).
-
-## Shipment tracking — mapowanie statusow kuriera
-- `ShipmentTrackingHandler` (job `shipment_tracking_sync`) iteruje po aktywnych paczkach i pobiera status z API przewoznika (`Inpost/Apaczka/AllegroTrackingService`).
-- Serwisy zwracaja `{status, status_raw, description}`, gdzie `status` pochodzi z `DeliveryStatus::normalize($provider, $raw)` (hardcoded PROVIDER_MAPS).
-- Handler na starcie wczytuje overrides z `delivery_status_mappings` (raz per uruchomienie) i po kazdym wyniku stosuje `DeliveryStatus::normalizeWithOverrides()` — pozwala to przypisac nowe raw statusy kuriera przez UI bez zmian w kodzie.
-- Strona `/settings/delivery-status-mappings`:
- - Pokazuje defaulty + overrides + sekcje „Niezmapowane statusy wykryte w systemie" (distinct raw statusy z `shipment_packages` nie wystepujace w defaultach ani overrides).
- - Bulk form zapisuje do `delivery_status_mappings` (override = normalized inny niz default LUB raw nie ma defaultu).
- - Badge w sidebar pokazuje sumaryczna liczbe niezmapowanych statusow (`DeliveryStatusMappingRepository::countAllUnmappedForBadge`).
-- Przy zmianie normalized status (previous != new) handler wywoluje `automation.trigger('shipment.status_changed', ...)`.
-
-## Printing
-- Panel tworzy job `print_jobs` przez `/api/print/jobs`.
-- Klient desktop pobiera pending joby przez API key.
-- Klient pobiera etykiete i zamyka job przez `/complete`.
-- Konfiguracja i zarzadzanie kluczami: `PrintSettingsController` + `print_api_keys`.
-
-## Projekt generation
-- `project_mappings` mapuje wzorzec nazwy produktu na `script_name` i `output_dir`.
-- `order_items.project_generated` i `project_generated_at` trzymaja status wygenerowania artefaktu.
-- UI konfiguracji: `/settings/project-mappings`.
-
-## Bezpieczenstwo
-- Session auth dla panelu.
-- API key auth dla zdalnego klienta druku.
-- CSRF dla POST w panelu.
-- Sekrety integracji szyfrowane przez `IntegrationSecretCipher`.
-
-## Zaleznosci miedzy modulami
-- `Orders` korzysta z `Automation`, `Email`, `Printing`, `Shipments`, `Settings`.
-- `Shipments` korzysta z `Orders`, `CompanySettings`, `Automation`.
-- `Cron` spina `Settings`, `Orders`, `Shipments`, `Automation`, `Email`.
-- `Automation` korzysta z `Orders`, `Email`, `Accounting`, `Shipments`.
diff --git a/.paul/docs/DB_SCHEMA.md b/.paul/docs/DB_SCHEMA.md
deleted file mode 100644
index 1a4e9d7..0000000
--- a/.paul/docs/DB_SCHEMA.md
+++ /dev/null
@@ -1,193 +0,0 @@
-# DB_SCHEMA
-
-## Zakres i zrodlo prawdy
-- Schemat wynika z migracji SQL w `database/migrations`.
-- Dokument odzwierciedla stan repo na 2026-04-25 (migracje do `20260425_000102`).
-
-## Ostatnie istotne migracje
-- `20260425_000102_create_automation_email_once_deliveries_table.sql`
-- `20260422_000101_backfill_delivery_status_unknowns.sql`
-- `20260413_000100_ensure_orders_delivery_payment_columns.sql`
-- `20260412_000099_add_requires_photo_to_project_mappings.sql`
-- `20260412_000098_rename_external_status_id_to_status_code.sql`
-- `20260412_000097_add_project_generation.sql`
-- `20260410_000081_add_remember_token_to_users.sql`
-- `20260408_000090_backfill_delivery_price.sql`
-- `20260407_000083_allegro_pull_status_mappings.sql`
-- `20260407_000080_backfill_personalization_message.sql`
-- `20260407_000079_pull_status_mappings.sql`
-- `20260407_000078_reverse_status_mapping_keys.sql`
-
-## Kompensacyjne migracje ensure_
-- `000038` - naprawa brakujacej tabeli `order_status_mappings`.
-- `000039` - uzupelnienie brakujacych kolumn fetch w `integrations`.
-- `000040` - seed/naprawa harmonogramu `shoppro_orders_import`.
-- `000041` - seed/naprawa harmonogramu `shoppro_order_status_sync` + direction.
-- `000042` - seed/naprawa `shoppro_payment_status_sync` + kolumny payment sync.
-- `000100` - kompensacja brakujacych kolumn `orders.payment_method` i `orders.delivery_method`.
-
-## Kluczowe tabele
-
-### users
-- Uzytkownicy panelu.
-- Wazne kolumny:
-- `id`, `email` (UNIQUE), `password_hash`, `remember_token` (od `000081`), `is_active`, `created_at`, `updated_at`.
-
-### orders
-- Glowna tabela zamowien (model neutralny wzgledem zrodla).
-- Wazne kolumny:
-- `id`, `source`, `integration_id`, `source_order_id`, `internal_order_number` (UNIQUE),
-- `status_code` (rename z `external_status_id` w `000098`),
-- `payment_status`, `total_paid`, `payment_method`,
-- `delivery_method`, `delivery_price` (dodane/backfill `000090`),
-- daty zrodlowe i techniczne, `payload_json`, `preferences_json`.
-- Wydajnosc:
-- indeksy na `source`, `status_code`, `ordered_at`, `(source, status_code)`.
-
-### order_items
-- Pozycje zamowienia.
-- Wazne kolumny:
-- `order_id`, `source_item_id`, `name`, `quantity`, `price_gross`, `media_url`, `payload_json`,
-- `personalization` (`000075`, backfill `000080`),
-- `project_generated`, `project_generated_at` (`000097`).
-
-### order_payments
-- Platnosci zamowien (import i reczne).
-- Wazne kolumny:
-- `order_id`, `source_payment_id`, `payment_type_id`, `payment_date`, `amount`, `currency`, `payload_json`.
-- Klucz unikalny:
-- `(order_id, source_payment_id)`.
-
-### order_status_history
-- Historia zmian statusow zamowienia.
-- Wazne kolumny:
-- `order_id`, `from_status_id`, `to_status_id`, `change_source`, `changed_by`, `changed_at`.
-
-### order_activity_log
-- Uniwersalny log aktywnosci (`status_change`, `payment`, `shipment`, `import`, itd.).
-- Wazne kolumny:
-- `order_id`, `event_type`, `summary`, `details_json`, `actor_type`, `actor_name`, `created_at`.
-
-### order_status_groups i order_statuses
-- Slownik statusow biznesowych i grup statusow.
-- Relacja:
-- `order_statuses.group_id -> order_status_groups.id` (`ON DELETE CASCADE`).
-
-### integrations
-- Bazowa tabela instancji integracji.
-- Wazne kolumny:
-- `type`, `name`, `base_url`, `api_key_encrypted`, `is_active`,
-- `orders_fetch_enabled`, `orders_fetch_start_date`,
-- `order_status_sync_direction`, `payment_sync_status_codes_json`,
-- pola diagnostyczne testu polaczenia.
-
-### integration_order_sync_state
-- Kursor synchronizacji per integracja.
-- Wazne kolumny:
-- `integration_id` (PK), `last_synced_order_updated_at`, `last_synced_source_order_id`,
-- `last_success_at`, `last_status_pushed_at`, `last_error`.
-
-### order_status_mappings
-- Mapowania push statusow dla shopPRO.
-- Po `000078` klucz unikalny:
-- `(integration_id, orderpro_status_code)`.
-- Dodatkowe indeksy:
-- `(integration_id, shoppro_status_code)`.
-
-### order_status_pull_mappings
-- Dedykowane mapowanie pull shopPRO -> orderPRO (`000079`).
-- Klucz unikalny:
-- `(integration_id, shoppro_status_code)`.
-
-### allegro_order_status_mappings
-- Mapowania statusow Allegro dla kierunku push.
-- Po `000078` klucz unikalny:
-- `orderpro_status_code`.
-- Indeks lookup:
-- `allegro_status_code`.
-
-### allegro_order_status_pull_mappings
-- Dedykowane mapowanie pull Allegro -> orderPRO (`000083`).
-- Klucz unikalny:
-- `allegro_status_code`.
-
-### allegro_integration_settings
-- OAuth i tokeny Allegro per srodowisko/integracja.
-- Wazne kolumny:
-- `integration_id` (UNIQUE FK), `environment`, `client_id`, `client_secret_encrypted`,
-- `redirect_uri`, `access_token_encrypted`, `refresh_token_encrypted`, `token_expires_at`,
-- `orders_fetch_enabled`, `orders_fetch_start_date`.
-
-### apaczka_integration_settings i inpost_integration_settings
-- Ustawienia providerow wysylek, powiazane 1:1 z `integrations` przez `integration_id`.
-
-### company_settings
-- Dane firmy/nadawcy, parametry domyslnych paczek i pola ksiegowe.
-
-### receipt_configs, receipts, receipt_number_counters
-- Konfiguracja numeracji, wystawione paragony i liczniki numerow.
-
-### email_mailboxes, email_templates, email_logs
-- Skrzynki SMTP, szablony i log wysylki.
-
-### automation_rules, automation_conditions, automation_actions, automation_execution_logs
-- Definicje regul i historia ich wykonan.
-
-### automation_email_once_deliveries
-- Rejestr jednorazowych wysylek e-mail dla akcji automatyzacji (`send_once_per_order`).
-- Klucz unikalny:
-- `(rule_id, action_id, order_id)` - gwarancja, ze ta sama akcja e-mail reguly nie zostanie oznaczona drugi raz dla tego samego zamowienia.
-- Relacje:
-- `rule_id -> automation_rules.id` (CASCADE),
-- `action_id -> automation_actions.id` (CASCADE),
-- `order_id -> orders.id` (CASCADE).
-
-### shipment_packages
-- Rekordy przesylek i etykiet.
-- Wazne kolumny trackingowe (od `000060`):
-- `delivery_status`, `delivery_status_raw`, `delivery_status_updated_at`.
-
-### delivery_status_mappings
-- Mapowanie statusow przewoznikow na status biznesowy (`provider + raw_status` UNIQUE).
-
-### carrier_delivery_method_mappings
-- Wspolne mapowanie form dostawy na providerow wysylki.
-
-### shipment_presets
-- Presety nadania wykorzystywane przez API presetow przesylek.
-
-### print_api_keys
-- Klucze API dla klienta desktop druku.
-- Kolumny:
-- `key_hash` (UNIQUE), `key_prefix`, `is_active`, `last_used_at`.
-
-### print_jobs
-- Kolejka wydruku etykiet.
-- Kolumny:
-- `order_id`, `package_id`, `label_path`, `status`, `created_by`, `created_at`, `completed_at`.
-
-### project_mappings
-- Mapowanie produktu na skrypt generujacy projekt (`000097`).
-- Wazne kolumny:
-- `product_name_pattern`, `script_name`, `output_dir`, `requires_photo` (`000099`), `is_active`.
-
-## Harmonogram cron (cron_schedules)
-- Wykorzystywane typy jobow:
-- `allegro_token_refresh`
-- `allegro_orders_import`
-- `allegro_status_sync`
-- `shoppro_orders_import`
-- `shoppro_order_status_sync`
-- `shoppro_payment_status_sync`
-- `shipment_tracking_sync`
-- `automation_history_cleanup`
-- `order_status_aged`
-
-## Notatki kompatybilnosci
-- Migracje `ensure_` i `000100` sa idempotentne i kompensuja roznice miedzy srodowiskami.
-- Rename `orders.external_status_id -> status_code` wymaga, aby nowe query i dokumentacja uzywaly tylko `status_code`.
-- `delivery_price` jest backfillowane z JSON payloadow importu (Allegro/shopPRO).
-
-## Zmiany 2026-04-19
-- Brak zmian schematu bazy danych dla funkcji `Statystyki -> Zamowienia`.
-- Raport korzysta z istniejacych kolumn i tabel: `orders`, `integrations`, `order_status_groups`, `order_statuses`, `allegro_order_status_mappings`.
diff --git a/.paul/docs/DECISIONS.md b/.paul/docs/DECISIONS.md
deleted file mode 100644
index 59239f4..0000000
--- a/.paul/docs/DECISIONS.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# DECISIONS
-
-> Kluczowe decyzje techniczne i ich uzasadnienia.
diff --git a/.paul/docs/STACK.md b/.paul/docs/STACK.md
deleted file mode 100644
index bad9fe6..0000000
--- a/.paul/docs/STACK.md
+++ /dev/null
@@ -1,3 +0,0 @@
-# STACK
-
-> Stack technologiczny, wersje, zaleznosci, srodowisko.
diff --git a/.paul/docs/TECH_CHANGELOG.md b/.paul/docs/TECH_CHANGELOG.md
deleted file mode 100644
index eade7e5..0000000
--- a/.paul/docs/TECH_CHANGELOG.md
+++ /dev/null
@@ -1,128 +0,0 @@
-# TECH_CHANGELOG
-
-> Chronologiczny log zmian technicznych — co i dlaczego.
-
-## 2026-04-25 - Fix: order_status condition for order.status_aged
-
-Powod: reguly order.status_aged z warunkiem order_status nie wykonywaly akcji, bo warunek sprawdzal tylko context.new_status, a ten event przekazuje context.current_status.
-
-Zmiany:
-- src/Modules/Automation/AutomationService.php
- - evaluateOrderStatusCondition: fallback z new_status na current_status.
-- tests/Unit/AutomationServiceTest.php
- - nowy test regresyjny: order.status_aged + current_status spelnia warunek order_status i wykonuje akcje.
-
-Efekt:
-- reguly order.status_aged z warunkiem statusu zamowienia dzialaja poprawnie,
-- eventy zmianowe order.status_changed nadal korzystaja z new_status bez regresji.
-## 2026-04-25 - Automatyzacja: jednorazowa wysylka e-mail per zamowienie (Phase 107)
-
-**Powod**: event `order.status_aged` jest cykliczny, przez co ta sama regula mogla wysylac klientowi ten sam e-mail przy kazdym przebiegu crona. Potrzebna byla kontrola "wyslij tylko raz dla tego zamowienia".
-
-**Zmiany**:
-- `database/migrations/20260425_000102_create_automation_email_once_deliveries_table.sql`:
- - nowa tabela `automation_email_once_deliveries` z FK do `automation_rules`, `automation_actions`, `orders`;
- - `UNIQUE (rule_id, action_id, order_id)` - twarda deduplikacja.
-- `src/Modules/Automation/AutomationEmailOnceRepository.php` (nowy):
- - `wasSent(ruleId, actionId, orderId)` - sprawdzenie czy akcja e-mail byla juz wykonana jednorazowo;
- - `markSent(ruleId, actionId, orderId)` - zapis idempotentny (`INSERT ... ON DUPLICATE KEY UPDATE`).
-- `src/Modules/Automation/AutomationController.php`:
- - `parseActionConfig(send_email)` rozszerzone o `send_once_per_order` (0/1), domyslnie `0`.
-- `resources/views/automation/form.php` i `public/assets/js/modules/automation-form.js`:
- - dodany checkbox w akcji `Wyslij e-mail`: "Wyslij tylko raz dla tego zamowienia".
-- `src/Modules/Automation/AutomationService.php`:
- - akcja `send_email` uwzglednia `rule_id` i `action_id`;
- - przy `send_once_per_order=1` pomija wysylke, gdy `wasSent(...) = true`;
- - `markSent(...)` wykonywany tylko po udanej wysylce (`success=true`), wiec blad SMTP nie blokuje kolejnej proby.
-- `src/Modules/Cron/CronHandlerFactory.php` i `routes/web.php`:
- - podpiecie nowego repozytorium do konstruktora `AutomationService`.
-- `tests/Unit/AutomationServiceTest.php` (nowy):
- - test scenariusza jednorazowego (drugi trigger nie wysyla),
- - test scenariusza domyslnego (bez flagi wysyla wielokrotnie).
-
-**Efekt**:
-- Operator moze zaznaczyc jednorazowosc na poziomie konkretnej akcji e-mail.
-- Dla jednego zamowienia i jednej akcji reguly mail nie duplikuje sie przy kolejnych uruchomieniach crona.
-- Zachowanie domyslne pozostaje bez zmian dla istniejacych regul bez zaznaczonej opcji.
-## 2026-04-22 - Alert klienta z historia zwrotow (Phase 106)
-
-**Powod**: Operator wysylkowy nie widzial wczesniej, ze kupujacy juz raz nie odebral przesylki (`delivery_status='returned'`) zanim wyslal kolejna paczke — generowalo to kolejne koszty wysylki i magazynowania.
-
-**Zmiany**:
-- `src/Modules/Orders/OrdersRepository.php`:
- - nowa metoda prywatna `customerReturnedCountSubquerySql(orderAlias, addressAlias)` — generuje correlated subquery zliczajaca inne zamowienia klienta biezacego wiersza z paczka `returned`.
- - `buildListSql()` — dodana kolumna `customer_returned_count` (EXISTS-style COUNT DISTINCT) do SELECT listy zamowien.
- - `transformOrderRow()` — przekazuje `customer_returned_count` do wiersza.
- - `findDetails()` — JOIN `order_addresses` typu customer + subquery `customer_returned_count`; zwraca rowniez `buyer_email`, `buyer_phone`, `buyer_name` w `$order`.
-- `src/Modules/Shipments/ShipmentPackageRepository.php`:
- - nowa metoda `findReturnedByCustomer(array customer, int excludeOrderId, int limit=10)` — lista zwroconych paczek klienta (match OR: email lower+trim, phone tylko cyfry >=6, name lower+trim), sortowana po dacie malejaco.
-- `src/Modules/Orders/OrdersController.php`:
- - `toTableRow()` — dodano badge `zwroty: N` w kolumnie buyer + klasa `is-risk-return` na `
` gdy `customer_returned_count >= 1` (kompozycja z klasa aged orders z Phase 101).
- - `show()` — oblicza `$customerRiskInfo` i przekazuje do widoku.
- - nowe metody prywatne: `buildCustomerRiskInfo(order, orderId)`, `composeCustomerRiskText(count, email, phone, name)` — budowa tresci alertu zaleznie od dostepnosci pol (phone+email / email / phone / name).
-- `resources/views/orders/show.php` — banner `customer-risk-banner` u samej gory karty szczegolow (pod naglowkiem, nad flash messages i status change), z `` rozwijajacym liste zamowien ze zwrotem (order_id, data, tracking, provider).
-- `resources/scss/modules/_customer-risk-alert.scss` (nowy modul):
- - `.customer-risk-banner` + `__icon`, `__body`, `__text`, `__list`, `__table` — czerwony banner z pastelowym tlem i lewym paskiem 4px.
- - `.risk-return-badge` — maly inline badge przy buyer name.
- - `tr.is-risk-return` — lewy pasek wiersza w tabeli zamowien.
-- `resources/scss/app.scss` — `@use "modules/customer-risk-alert"`.
-- `public/assets/css/app.css` — rebuild przez `npm run build:css`.
-
-**Wymagania**:
-- MySQL 8.0+ (REGEXP_REPLACE w subquery matching phone).
-- Wynik licznika wyliczany on-the-fly (brak migracji DB, brak materializacji). Indeksy na `order_addresses(order_id, address_type)` i `shipment_packages(order_id, delivery_status)` sugerowane jesli lista zamowien przekroczy ~50k wierszy — zglosic w kolejnym planie.
-
-**Anti-fraud/false positive**:
-- Self-exclusion: `sp.order_id != o.id` — biezace zamowienie nie wlicza sie do licznika.
-- Minimum phone length 6 cyfr — eliminuje match na "", "+48", krotkich fragmentach.
-- OR matching po email/phone/name moze dac fałszywe pozytywy dla popularnych imion; swiadome odstepstwo (user wymagal szerokiego matchingu).
-
-## 2026-04-22 - Mapowanie statusow dostawy: wykrywanie niezmapowanych + runtime overrides
-
-**Powod**: zamowienia (np. OP000000357, OP000000638) pokazywaly `delivery_status=unknown`, mimo ze apaczka API zwracala `RETURNED_TO_SHIPPER`. UI `/settings/delivery-status-mappings` pokazywalo wylacznie statusy obecne w defaultach kodu — nowe raw statusy kuriera nie mialy gdzie zostac przypisane bez zmiany kodu.
-
-**Faza A — quick fix (defaulty + backfill)**:
-- `src/Modules/Shipments/DeliveryStatus.php`: dodano 3 brakujace mapowania:
- - apaczka `RETURNED_TO_SHIPPER` -> `returned`
- - apaczka `PICKUP` -> `in_transit`
- - allegro_wza `collected_from_sender` -> `in_transit`
-- `database/migrations/20260422_000101_backfill_delivery_status_unknowns.sql`: backfill 11 paczek (3 + 7 + 1). Bez trigger `shipment.status_changed` (backfill starych rekordow, nie runtime event).
-
-**Faza B — rozwiazanie systemowe**:
-- `DeliveryStatusMappingRepository::listUnmappedRawStatuses(provider, knownKeys)` — zwraca raw statusy z `shipment_packages` ktore nie wystepuja w defaultach ani overrides DB; z licznikiem paczek i ostatnim wystapieniem.
-- `DeliveryStatusMappingController::index` — przekazuje `unmappedRawStatuses` do widoku; rowniez wlacza do listy overrides, ktore nie maja odpowiadajacego defaultu (user moze dodac completely custom raw statusy).
-- `resources/views/settings/delivery-status-mappings.php` — nowa sekcja „Niezmapowane statusy wykryte w systemie (N)" z form submit do `save-bulk`. Pomaranczowy akcent aby wyroznic od defaultow.
-- `ShipmentTrackingHandler` — dostal `?DeliveryStatusMappingRepository` w konstruktorze; po kazdym `service->getDeliveryStatus()` wywoluje `DeliveryStatus::normalizeWithOverrides(provider, raw, overrides)` jesli overrides istnieja. Dzieki temu override z UI dziala runtime bez zmian kodu.
-- `CronHandlerFactory` — przekazuje `DeliveryStatusMappingRepository` do `ShipmentTrackingHandler`.
-
-**Faza C — badge w menu**:
-- `Application` — dodano statyczny holder `self::$instance` + `Application::instance()`, aby layout mial dostep do kontenera.
-- `DeliveryStatusMappingRepository::countAllUnmappedForBadge()` — zlicza niezmapowane raw statusy dla wszystkich providerow UI (inpost, apaczka, allegro_wza); cache per-request.
-- `resources/views/layouts/app.php` — badge pomaranczowy przy linku „Mapowanie statusow dostawy" z liczba niezmapowanych statusow (jesli > 0). Try/catch — brak badge'a nie psuje layoutu.
-- `resources/scss/app.scss` — klasa `.sidebar__badge`.
-
-**Efekt**: user nie musi modyfikowac kodu przy kazdym nowym statusie kuriera. Badge sygnalizuje pojawienie sie nieznanych statusow; sekcja na stronie mapowan pozwala przypisac je do znormalizowanych kategorii. Cron po nastepnym tick'u automatycznie przeliczy istniejace paczki zgodnie z override.
-
-## 2026-04-19 - Statystyki zamowien (menu + raport dzienny)
-
-- Dodano nowy modul `Statistics`:
- - `OrdersStatisticsController` (obsluga filtrow i render strony `/statistics/orders`).
- - `OrdersStatisticsRepository` (agregacje dzienne po kanalach i grupach statusow).
-- Dodano nowa pozycje menu: `Statystyki -> Zamowienia`.
-- Dodano widok raportowy z filtrem zakresu dat, multiselectem kanalow i multiselectem grup statusow.
-- Dodano tabele dzienna z metrykami `Ilosc`, `Netto`, `Brutto` per kanal oraz stopka `Razem`.
-- Dodano tlumaczenia `statistics.orders.*` i `navigation.statistics*`.
-- Brak zmian migracyjnych i brak zmian schematu bazy danych.
-
-## 2026-04-19 - Fix: Statystyki nie pokazywaly zamowien (kolizja collation)
-
-- `OrdersStatisticsRepository::channelSql()` generowal wyrazenie `CONCAT("shoppro:", CAST(integration_id AS CHAR))`, ktore w MySQL dawalo wynik z collation `utf8mb4_bin`. W zestawieniu z parametrami bindowanymi (`utf8mb4_general_ci`) MySQL rzucal `SQLSTATE[HY000] 1271 Illegal mix of collations for operation 'in'`.
-- Blad byl polykany przez `try/catch (Throwable)` w `aggregateByDay()`, przez co widok dostawal pusta tablice i nie pokazywal zadnych zamowien.
-- Fix: dodano jawne `COLLATE utf8mb4_unicode_ci` na `CAST(integration_id AS CHAR)` oraz na calym wyrazeniu `CASE` zwracajacym `channel_key`, tak aby klucz kanalu mial spojne collation zgodne z `orders.source`.
-
-## 2026-04-19 - Statystyki: fallback netto 23% VAT
-
-- `OrdersStatisticsRepository::netAmountSql()` dostal fallback: jesli `orders.total_without_tax` jest `NULL` lub `0`, a `orders.total_with_tax` ma wartosc, netto wyliczane jest jako `ROUND(total_with_tax / 1.23, 2)`.
-- Uzasadnienie: shopPRO nie wysyla netto ani na zamowieniu ani w pozycjach (`order_items.original_price_without_tax` jest puste), wiec bez fallbacku kolumna `Netto` w statystykach pokazywala 0.
-- Uwaga: fallback zaklada 23% VAT. Ostateczne rozwiazanie (prawidlowy netto z shopPRO / z `order_items.tax_rate`) opisane w `.paul/TODO.md` (tag `STAT-NET`).
-
diff --git a/.paul/docs/TODO.md b/.paul/docs/TODO.md
deleted file mode 100644
index 2911138..0000000
--- a/.paul/docs/TODO.md
+++ /dev/null
@@ -1,233 +0,0 @@
-# TODO
-
-> Luzny parking pomyslow, rzeczy do sprawdzenia.
-
-15. [x] W tym miejscu odwróć kolejność: najpierw źródło potem ID, f6079660-1af8-11f1-a7c9-231cf6ef29d1allegro
-17. [x] Na liście zamówien jak jest źródło i id zamówienia to zamiast shopPRO musi pisać która integracja konkretnie. Oraz dodajemy napis ID: ...D
-
-## SonarQube — post plany 02-02 i 02-03 (skan 2026-03-13)
-30. [] [Sonar 2026-03-13] Brak nowych issues — AllegroStatusSyncService i ShopproOrderSyncStateRepository czyste. Pre-existing issues w ShopproOrdersSyncService (god class) i Application.php niezmienione przez nasze modyfikacje.
-
-## SonarQube — post plan 01-01 (skan 2026-03-12)
-28. [] [Sonar 2026-03-12] php:S1142 — AllegroTokenManager::resolveToken() ma 4 returny (powyżej limitu 3) (1x nowe)
-29. [] [Sonar 2026-03-12] php:S112 — AllegroTokenManager rzuca generic RuntimeException zamiast dedykowanej klasy wyjątku (3x nowe)
-
-## SonarQube — code quality (327 issues, skan 2026-03-12)
-18. [] php:S112 (95x) — zastąpić generic `new \Exception` konkretnymi klasami wyjątków
-19. [] php:S1142 (57x) — zredukować liczbę `return` w metodach (early return › wydzielić metody)
-20. [] php:S1192 (40x) — wyciągnąć powtarzające się string literals do stałych
-21. [] php:S3776 (31x) — obniżyć złożoność kognitywną metod (wydzielić logikę do pomocniczych metod)
-22. [] Web:S6827 (15x) — dodać brakujące atrybuty `alt` na tagach `
`
-23. [] Web:S6819 (12x) — poprawić dostępność HTML (accessibility)
-24. [] php:S1172 (11x) — usunąć nieużywane parametry funkcji
-25. [] php:S3358 (11x) — rozwinąć zagnieżdżone operatory ternarne
-26. [] php:S1448 (6x) — podzielić klasy z za dużą liczbą metod
-27. [] php:S138 (4x) — skrócić zbyt długie metody
-
-
-31. [x] blokować wystawienie kolejnego paragonu do tego samego zamówienia, nie całkowicie, ale powinno ono wymagać wyrażnego potwierdzenia w formie alertu
-
-## SonarQube — post plan 19-01 (skan 2026-03-22)
-32. [] [Sonar 2026-03-22] php:S4833 — show.php:696 Replace `require` with namespace import `use` keyword (1x)
-33. [] [Sonar 2026-03-22] php:S2003 — show.php:696 Replace `require` with `require_once` (1x)
-34. [] [Sonar 2026-03-22] php:S1448 — OrdersController ma 22 metody (limit 20) — rozdzielić (1x)
-35. [] [Sonar 2026-03-22] php:S1142 — OrdersController::bulkPrint() ma 5 returnów (limit 3) (1x)
-36. [] [Sonar 2026-03-22] php:S1068 — AllegroIntegrationController nieużywane pole $statusDiscoveryService (1x, pre-existing)
-
-37. [x] Nie działa zapisywanie numer REGON
-38. [x] Customowe przyciski paczek
-39. [x] Zmiana głównego koloru przycisków z niebieskiego na inny (bo się z nagłówkami myli)
-40. [x] Usunąć przycisk "Drukuj etykiety" z widoku https://orderpro.projectpro.pl/orders/list razem z mechanizmem, który to obsługuje
-41. [x] Jaki jest sens tylu logów z importu allegro np w tym zamówieniu https://orderpro.projectpro.pl/orders/29, skąd taka ilość, co jest pobierane i sprawdzane?
-42. [x] Nowy zdarzenie w zadaniach automatyczny -> zmiana statusu przesyłki, oraz nowe waruneki dla zdarzenia "zmiana statusu przesyłki": przesyłka zarejestrowana, przesyłka do odbioru, przesyłka nadana w punkcie, przesyłka odebrana, przesyłka anulowana, przesyłka nieodebrana, przesyłka odebrana (zwrot), chyba że takich statusów się nie da to trzeba sprawdzić jakie się da.
-43. [x] Usuwanie wpisu z kolejki druku etykiet
-
-## SonarQube — pełna lista błędów (new code period, skan 2026-03-28)
-
-
-- Źródło: SonarQube API `issues/search` dla `orderPRO` (`inNewCodePeriod=true`)
-- Razem issue: 174
-- Severity: MAJOR=110, CRITICAL=47, MINOR=16, BLOCKER=1
-- Typy: CODE_SMELL=170, BUG=3, VULNERABILITY=1
-
-### Lista issue
-- [ ] [MINOR][BUG][php:S2003] resources/views/accounting/index.php:31 - Replace "require" with "require_once". (key: 6fe7d2de-4802-459e-a5a7-f9f1be183b8e)
-- [ ] [MINOR][BUG][php:S2003] resources/views/orders/show.php:780 - Replace "require" with "require_once". (key: 98cef6cd-bb23-4bc8-acd9-01d4417f25e6)
-- [ ] [MINOR][CODE_SMELL][Web:S6827] resources/views/layouts/app.php:80 - Anchors must have content and the content must be accessible by a screen reader. (key: 64d29d8b-146d-4a20-803d-4aeb035b0391)
-- [ ] [MINOR][CODE_SMELL][Web:S6827] resources/views/orders/receipt-create.php:123 - Anchors must have content and the content must be accessible by a screen reader. (key: bbd01366-d6f2-4745-b5b2-8b06c3aec574)
-- [ ] [MINOR][CODE_SMELL][Web:S6827] resources/views/orders/show.php:669 - Anchors must have content and the content must be accessible by a screen reader. (key: 351a396c-239c-468d-a1bf-391adabd1b0a)
-- [ ] [MINOR][CODE_SMELL][Web:S6827] resources/views/receipts/show.php:19 - Anchors must have content and the content must be accessible by a screen reader. (key: cb8922ca-ccc4-4518-9466-e9c40d0aec4b)
-- [ ] [MINOR][CODE_SMELL][Web:S6827] resources/views/receipts/show.php:20 - Anchors must have content and the content must be accessible by a screen reader. (key: 29dd7510-9b95-4f90-9f47-0cf39d6318f2)
-- [ ] [MINOR][CODE_SMELL][Web:S6827] resources/views/receipts/show.php:21 - Anchors must have content and the content must be accessible by a screen reader. (key: 15deb0d4-dae8-4ede-b371-969ed668e0b7)
-- [ ] [MINOR][CODE_SMELL][Web:S6827] resources/views/settings/accounting.php:50 - Anchors must have content and the content must be accessible by a screen reader. (key: cffe0ae9-1c3f-4e5b-99d9-3dd6d528252b)
-- [ ] [MINOR][CODE_SMELL][Web:S6827] resources/views/settings/accounting.php:133 - Anchors must have content and the content must be accessible by a screen reader. (key: 816ae9c0-c782-406f-a3b4-d6d810119ebd)
-- [ ] [MINOR][CODE_SMELL][Web:S6827] resources/views/settings/delivery-status-mappings.php:24 - Anchors must have content and the content must be accessible by a screen reader. (key: a6e860d2-54dd-485b-82db-79415b2d4cb7)
-- [ ] [MINOR][CODE_SMELL][Web:S6827] resources/views/settings/printing.php:138 - Anchors must have content and the content must be accessible by a screen reader. (key: 43949459-6186-48cf-b099-36064429e0dc)
-- [ ] [MINOR][CODE_SMELL][php:S1488] src/Modules/Accounting/ReceiptRepository.php:139 - Immediately return this expression instead of assigning it to the temporary variable "$number". (key: 4cf8b055-d030-4fe5-b917-c4eae64c2e4d)
-- [ ] [MINOR][CODE_SMELL][php:S1481] src/Modules/Settings/EmailTemplateController.php:91 - Remove this unused "$t" local variable. (key: 5e00928d-3bfa-40cb-82e3-f6d1886f8b09)
-- [ ] [MINOR][CODE_SMELL][php:S1481] src/Modules/Settings/ShopproIntegrationsController.php:118 - Remove this unused "$redirectBase" local variable. (key: 22a0c0d1-5edf-4a80-8e42-dcab51ec880b)
-- [ ] [MINOR][CODE_SMELL][php:S1481] src/Modules/Settings/ShopproIntegrationsController.php:185 - Remove this unused "$redirectBase" local variable. (key: 2d95f5c7-5f6b-4e60-a48e-59fe991831f3)
-- [ ] [MAJOR][CODE_SMELL][php:S4833] resources/views/accounting/index.php:31 - Replace "require" with namespace import mechanism through the "use" keyword. (key: 349e8aeb-dc6d-4ac9-9c7e-f9b4cab594aa)
-- [ ] [MAJOR][CODE_SMELL][php:S3358] resources/views/automation/form.php:6 - Extract this nested ternary operation into an independent statement. (key: d9b92d37-73d9-4d70-804a-bde593b3253f)
-- [ ] [MAJOR][CODE_SMELL][php:S3358] resources/views/automation/form.php:7 - Extract this nested ternary operation into an independent statement. (key: 21a944af-e4fe-427a-9b30-4fedfb9f2211)
-- [ ] [MAJOR][CODE_SMELL][php:S3358] resources/views/automation/form.php:64 - Extract this nested ternary operation into an independent statement. (key: e253095f-e15e-468a-ac77-e143109b17fc)
-- [ ] [MAJOR][CODE_SMELL][Web:S6819] resources/views/automation/index.php:21 - Use