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
267 lines
13 KiB
Markdown
267 lines
13 KiB
Markdown
---
|
|
phase: 110-statistics-summary
|
|
plan: 01
|
|
type: execute
|
|
wave: 1
|
|
depends_on: []
|
|
files_modified:
|
|
- 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
|
|
autonomous: false
|
|
delegation: off
|
|
---
|
|
|
|
<objective>
|
|
## 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.
|
|
</objective>
|
|
|
|
<context>
|
|
## 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.
|
|
</context>
|
|
|
|
<skills>
|
|
## 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.
|
|
</skills>
|
|
|
|
<acceptance_criteria>
|
|
|
|
## AC-1: Sidebar Navigation
|
|
```gherkin
|
|
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
|
|
```gherkin
|
|
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
|
|
```gherkin
|
|
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
|
|
```gherkin
|
|
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
|
|
```gherkin
|
|
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>
|
|
|
|
<tasks>
|
|
|
|
<task type="auto">
|
|
<name>Task 1: Add monthly statistics backend and route</name>
|
|
<files>src/Modules/Statistics/OrdersStatisticsController.php, src/Modules/Statistics/OrdersStatisticsRepository.php, routes/web.php</files>
|
|
<action>
|
|
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`.
|
|
</action>
|
|
<verify>
|
|
- `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.
|
|
</verify>
|
|
<done>AC-2, AC-3, and AC-4 satisfied at backend/view-model level.</done>
|
|
</task>
|
|
|
|
<task type="auto">
|
|
<name>Task 2: Add summary UI, charts, menu item, and translations</name>
|
|
<files>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</files>
|
|
<action>
|
|
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 `<canvas>` 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.
|
|
</action>
|
|
<verify>
|
|
- `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.
|
|
</verify>
|
|
<done>AC-1, AC-2, AC-3, and AC-5 satisfied at UI level.</done>
|
|
</task>
|
|
|
|
<task type="auto">
|
|
<name>Task 3: Update technical documentation</name>
|
|
<files>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</files>
|
|
<action>
|
|
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.
|
|
</action>
|
|
<verify>
|
|
- `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`.
|
|
</verify>
|
|
<done>Documentation requirements from `AGENTS.md` and PAUL are satisfied.</done>
|
|
</task>
|
|
|
|
<task type="checkpoint:human-verify" gate="blocking">
|
|
<what-built>`Statystyki -> Podsumowanie` with two monthly charts</what-built>
|
|
<how-to-verify>
|
|
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.
|
|
</how-to-verify>
|
|
<resume-signal>Type "approved" to continue to UNIFY, or describe visual/data issues to fix.</resume-signal>
|
|
</task>
|
|
|
|
</tasks>
|
|
|
|
<boundaries>
|
|
|
|
## 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.
|
|
|
|
</boundaries>
|
|
|
|
<verification>
|
|
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.
|
|
</verification>
|
|
|
|
<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>
|
|
|
|
<output>
|
|
After completion, create `.paul/phases/110-statistics-summary/110-01-SUMMARY.md`.
|
|
</output>
|