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
13 KiB
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 |
|
false | off |
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:
Podsumowaniefirst, existingZamowieniasecond. - 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.
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.mdandDOCS/ARCHITECTURE.mdare required byAGENTS.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.mdrequiressonar-scannerafter APPLY and before UNIFY; frontend-design is optional for this UI work.
| 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/ordersroute 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_REMOTEinto 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.
<success_criteria>
Statystyki -> Podsumowanieis the first statistics submenu item./statistics/summarydisplays two monthly charts: order count and order value.- Each chart includes separate integration series and a
Razemseries. - Filters are consistent with existing order statistics behavior.
- No database schema change is introduced.
- Technical documentation is updated. </success_criteria>