Files
orderPRO/.paul/phases/110-statistics-summary/110-01-PLAN.md
Jacek Pyziak 0b4ffb7146 feat(110): statistics summary
Phase 110 complete:
- add Statistics -> Podsumowanie page
- add monthly order count and value charts per integration plus total
- use Chart.js with table fallback and 04-2026 default history start
- update PAUL and DOCS technical documentation
2026-04-28 22:48:31 +02:00

13 KiB

phase, plan, type, wave, depends_on, files_modified, autonomous, delegation
phase plan type wave depends_on files_modified autonomous delegation
110-statistics-summary 01 execute 1
src/Modules/Statistics/OrdersStatisticsController.php
src/Modules/Statistics/OrdersStatisticsRepository.php
routes/web.php
resources/views/layouts/app.php
resources/views/statistics/summary.php
resources/lang/pl.php
public/assets/js/modules/statistics-summary-charts.js
resources/scss/app.scss
public/assets/css/app.css
DOCS/ARCHITECTURE.md
DOCS/DB_SCHEMA.md
DOCS/TECH_CHANGELOG.md
.paul/codebase/architecture.md
.paul/codebase/db_schema.md
.paul/codebase/tech_changelog.md
false off
## Goal Add a new first submenu item `Statystyki -> Podsumowanie` with two monthly line charts: - monthly order count per integration plus a total line, - monthly order value per integration plus a total line.

Purpose

The operator needs a quick trend view before opening detailed daily order statistics. The summary should show how each sales integration contributes month by month and how the total business volume changes over time.

Output

  • New authenticated endpoint /statistics/summary.
  • Sidebar order: Podsumowanie first, existing Zamowienia second.
  • New summary view with compact filters and two charts.
  • Backend monthly aggregation using existing orders data, grouped by integration/channel.
  • Technical documentation updates. No database migration is expected.
## Project Context @.paul/PROJECT.md @.paul/ROADMAP.md @.paul/STATE.md @AGENTS.md @.paul/codebase/architecture.md @.paul/codebase/db_schema.md

Prior Work

@.paul/phases/105-orders-statistics/105-01-SUMMARY.md @.paul/phases/109-checkbox-multiselect-filters/109-01-SUMMARY.md

Source Files

@src/Modules/Statistics/OrdersStatisticsController.php @src/Modules/Statistics/OrdersStatisticsRepository.php @resources/views/statistics/orders.php @resources/views/layouts/app.php @routes/web.php @resources/lang/pl.php @resources/scss/app.scss @package.json

Notes

  • DOCS/DB_SCHEMA.md and DOCS/ARCHITECTURE.md are required by AGENTS.md, but they are currently missing in the repo. APPLY should create them or reconcile them from .paul/codebase/* before documenting this feature.
  • Existing statistics code already has filter parsing patterns, channel labels, status group defaults, collation handling, and amount fallback logic. Reuse those rather than creating a separate query style.
  • SPECIAL-FLOWS.md requires sonar-scanner after APPLY and before UNIFY; frontend-design is optional for this UI work.
## Required Skills (from SPECIAL-FLOWS.md)
Skill Priority When to Invoke Loaded?
sonar-scanner required After APPLY, before UNIFY o
/frontend-design optional During chart UI implementation/review o

BLOCKING: sonar-scanner must be run before UNIFY unless the environment blocks it.

<acceptance_criteria>

AC-1: Sidebar Navigation

Given the user is authenticated
When the sidebar statistics section is visible
Then the first item under "Statystyki" is "Podsumowanie"
And the second item remains "Zamowienia"
And clicking "Podsumowanie" opens `/statistics/summary`
And the active state highlights "Podsumowanie" on that page

AC-2: Monthly Order Count Chart

Given orders exist across multiple months and integrations
When the user opens `/statistics/summary`
Then the page shows an order count chart grouped by month
And each integration has its own line
And an additional "Razem" line sums all selected integrations per month

AC-3: Monthly Order Value Chart

Given orders exist across multiple months and integrations
When the user opens `/statistics/summary`
Then the page shows an order value chart grouped by month
And each integration has its own line
And an additional "Razem" line sums all selected integrations per month
And values are displayed as money with two decimal places

AC-4: Existing Statistics Semantics Reused

Given the user changes the date range, channel selection, or status group selection
When the summary page reloads
Then both charts use the same selected filters
And channel labels match existing statistics labels
And default status groups still exclude the cancelled group

AC-5: Empty and Degraded States

Given the selected filters return no orders
When the user opens `/statistics/summary`
Then the page shows a clear empty state instead of broken charts

Given JavaScript fails to load
When the user opens `/statistics/summary`
Then the monthly data remains visible in an HTML table fallback

</acceptance_criteria>

Task 1: Add monthly statistics backend and route src/Modules/Statistics/OrdersStatisticsController.php, src/Modules/Statistics/OrdersStatisticsRepository.php, routes/web.php Extend the existing Statistics module with a new summary action: - Add `summary(Request $request): Response` to `OrdersStatisticsController`. - Reuse or extract existing filter helpers for date range, channel options, selected channels, status groups, selected status groups, and status-code resolution. - Use a useful monthly default range: first day of January of the current year through the current date, unless GET filters are supplied. - Add repository method `aggregateByMonth(string $dateFrom, string $dateTo, array $channels, array $statusCodes): array`. - The query must reuse the existing effective date, channel, gross amount, and status SQL semantics from `aggregateByDay()`. - Group rows by `DATE_FORMAT(effective_date, "%Y-%m")` and channel key. - Build a controller view-model with ordered month labels, per-channel count series, per-channel value series, and total series for both charts. - Add route `GET /statistics/summary` behind `AuthMiddleware` using the existing controller instance.
Avoid: no schema changes, no raw user input in SQL strings, no duplicate channel/status logic that can drift from `/statistics/orders`.
- `php -l src/Modules/Statistics/OrdersStatisticsController.php` - `php -l src/Modules/Statistics/OrdersStatisticsRepository.php` - `php -l routes/web.php` - Manual check that `/statistics/summary` returns HTTP 200 for an authenticated session. AC-2, AC-3, and AC-4 satisfied at backend/view-model level. Task 2: Add summary UI, charts, menu item, and translations resources/views/layouts/app.php, resources/views/statistics/summary.php, resources/lang/pl.php, public/assets/js/modules/statistics-summary-charts.js, resources/scss/app.scss, public/assets/css/app.css Create the visible statistics summary experience: - Add `Podsumowanie` translation keys under navigation and `statistics.summary.*`. - In the sidebar statistics group, place `Podsumowanie` before `Zamowienia`, link it to `/statistics/summary`, and use `activeStatistics='summary'`. - Create `resources/views/statistics/summary.php` with compact filters matching `/statistics/orders`: date from/to, channels multiselect, status groups multiselect, submit/reset actions. - Render two chart panels: order count and order value. Each panel must include a `` or SVG/chart container plus a table fallback with monthly rows and per-series columns. - Add `public/assets/js/modules/statistics-summary-charts.js` to render the two charts from JSON embedded in the page after escaping through `json_encode(..., JSON_HEX_*)`. - Keep chart rendering small and local. Do not add a package dependency unless implementation discovers existing project-approved chart tooling. - Include the module in `resources/views/layouts/app.php` with `filemtime()` cache busting. - Add compact SCSS in `resources/scss/app.scss`, then build `public/assets/css/app.css` with `npm run build:css`.
Avoid: no inline CSS in PHP views, no native `alert()`/`confirm()`, no decorative oversized dashboard layout. The page should stay dense and operational.
- `php -l resources/views/layouts/app.php` - `php -l resources/views/statistics/summary.php` - `php -l resources/lang/pl.php` - `npm run build:css` - Browser/manual check confirms two non-empty charts render when data exists and fallback tables are present in the DOM. AC-1, AC-2, AC-3, and AC-5 satisfied at UI level. Task 3: Update technical documentation DOCS/ARCHITECTURE.md, DOCS/DB_SCHEMA.md, DOCS/TECH_CHANGELOG.md, .paul/codebase/architecture.md, .paul/codebase/db_schema.md, .paul/codebase/tech_changelog.md Update documentation required by `AGENTS.md` and PAUL: - If root `DOCS/` files are still missing, create `DOCS/ARCHITECTURE.md`, `DOCS/DB_SCHEMA.md`, and `DOCS/TECH_CHANGELOG.md` using the current `.paul/codebase/*` documents as the baseline where appropriate. - Document the new `/statistics/summary` route, controller action, repository monthly aggregation method, chart frontend module, and sidebar change in architecture docs. - Document that the feature uses existing `orders`, `integrations`, `order_status_groups`, and `order_statuses` tables without migration changes. - Add a dated technical changelog entry explaining the new summary charts and why no DB schema change was needed. - Keep `.paul/codebase/*` in sync with the same architecture/schema/changelog facts. - `git diff -- DOCS .paul/codebase` shows architecture/changelog updates and no false DB migration claim. - Documentation mentions `/statistics/summary`, `aggregateByMonth()`, and `statistics-summary-charts.js`. Documentation requirements from `AGENTS.md` and PAUL are satisfied. `Statystyki -> Podsumowanie` with two monthly charts 1. Open `/statistics/summary`. 2. Confirm the sidebar shows `Podsumowanie` as the first item under `Statystyki`. 3. Confirm chart 1 shows monthly order counts with one line per integration plus `Razem`. 4. Confirm chart 2 shows monthly order values with one line per integration plus `Razem`. 5. Change filters and confirm both charts update consistently. Type "approved" to continue to UNIFY, or describe visual/data issues to fix.

DO NOT CHANGE

  • Import/synchronization modules for Allegro/shopPRO.
  • Existing /statistics/orders route contract and GET parameter names.
  • Database migrations unless a blocker proves the existing schema cannot support the charts.
  • Runtime DB env behavior: do not wire DB_HOST_REMOTE into application runtime.

SCOPE LIMITS

  • This plan adds only summary charts for orders. It does not add exports, product charts, inventory charts, or accounting reports.
  • Values chart uses the existing gross amount semantics from current order statistics unless the user explicitly asks for net values.
  • Chart interactivity is limited to readable lines/legend/tooltips if implemented locally; advanced drill-down is out of scope.
  • No new native alerts or confirms.
Before declaring plan complete: - [ ] `php -l src/Modules/Statistics/OrdersStatisticsController.php` - [ ] `php -l src/Modules/Statistics/OrdersStatisticsRepository.php` - [ ] `php -l routes/web.php` - [ ] `php -l resources/views/layouts/app.php` - [ ] `php -l resources/views/statistics/summary.php` - [ ] `php -l resources/lang/pl.php` - [ ] `npm run build:css` - [ ] Manual/browser check: `/statistics/summary` renders two charts and table fallbacks. - [ ] Manual/browser check: sidebar order and active states are correct. - [ ] Manual data check: monthly total equals sum of integration values for at least one month. - [ ] Documentation updated in `DOCS/` and `.paul/codebase/`. - [ ] `sonar-scanner` run before UNIFY, or blocker recorded if unavailable. - [ ] All acceptance criteria met.

<success_criteria>

  • Statystyki -> Podsumowanie is the first statistics submenu item.
  • /statistics/summary displays two monthly charts: order count and order value.
  • Each chart includes separate integration series and a Razem series.
  • Filters are consistent with existing order statistics behavior.
  • No database schema change is introduced.
  • Technical documentation is updated. </success_criteria>
After completion, create `.paul/phases/110-statistics-summary/110-01-SUMMARY.md`.