This commit is contained in:
2026-04-19 22:43:02 +02:00
parent 10cba24727
commit fd1e23eb26
23 changed files with 2320 additions and 72 deletions

View File

@@ -1,7 +1,7 @@
# ARCHITECTURE
## Zakres
- Dokument opisuje aktualna architekture kodu (stan repo: 2026-04-18).
- Dokument opisuje aktualna architekture kodu (stan repo: 2026-04-19).
- Zrodlem prawdy sa: `src/`, `routes/web.php`, `database/migrations/`.
## Warstwy systemu
@@ -21,6 +21,7 @@
- `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`.
@@ -35,6 +36,8 @@
- `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.
@@ -47,6 +50,18 @@
- 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`.

View File

@@ -2,7 +2,7 @@
## Zakres i zrodlo prawdy
- Schemat wynika z migracji SQL w `database/migrations`.
- Dokument odzwierciedla stan repo na 2026-04-18 (migracje do `20260413_000100`).
- Dokument odzwierciedla stan repo na 2026-04-19 (migracje do `20260413_000100`).
## Ostatnie istotne migracje
- `20260413_000100_ensure_orders_delivery_payment_columns.sql`
@@ -176,3 +176,7 @@
- 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`.

View File

@@ -1,3 +1,26 @@
# TECH_CHANGELOG
> Chronologiczny log zmian technicznych — co i dlaczego.
## 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`).