3.2 KiB
3.2 KiB
Merchant Dashboard Capability Spec
- Status: Draft — not approved for implementation
- Capability: Merchant dashboard
- Last updated: 2026-08-20
Objective
Give a non-technical merchant a fast, trustworthy Persian RTL view of payment performance, problems, opportunities, and anonymized peer context, with every claim traceable to deterministic metrics.
Actors
- Demo merchant user: signs in with assigned username/password and sees one merchant.
- Merchant user: same MVP permissions; broader roles are out of scope until specified.
- Judge/operator: can use different seeded merchant accounts but receives no hidden cross-tenant browser privilege.
Functional requirements
- Login establishes a secure backend session and returns a generic failure for invalid credentials.
- The app shell identifies the active merchant and offers logout.
- Overview shows data freshness, selected period, primary outcomes, trend, and prioritized deterministic insights.
- Payment performance supports success/failure/retry/timing analysis and traceable drill-downs.
- Peer comparison exposes only eligible anonymized cohort aggregates and explains suppression/limitations.
- Filters and pagination are reflected in the URL where sharing/reload is useful.
- Every screen implements loading, empty, partial-data, stale, unauthorized, forbidden, and recoverable-error behavior as applicable.
- Responsive behavior and component contracts follow
DESIGN.md. - Merchant-facing dates use the Jalali calendar in
Asia/Tehran; API instants remain explicit ISO-8601 UTC and filtering sends unambiguous boundaries.
Frontend architecture baseline
- SvelteKit 2 + Svelte 5 runes + strict TypeScript + Tailwind CSS v4.
- Static/client-rendered application behind Nginx, consuming the Go API under the same origin where practical.
- Route groups separate authentication and authenticated application layouts.
- Server state belongs to a typed API layer; local UI state uses the smallest appropriate Svelte primitive/context.
- No SvelteKit server endpoints, database access, or private secrets in the frontend baseline.
- API types should be generated from the approved interface description.
Acceptance criteria
- A user can authenticate as at least two distinct seeded merchants and each dashboard shows different, correctly isolated data.
- Direct URL/API manipulation cannot expose another merchant's details.
- Critical flows work at 360 px, 768 px, 1024 px, and a wide desktop viewport in RTL.
- Login, navigation drawer, filters, chart alternatives, and logout are keyboard complete and screen-reader understandable.
- Values visibly specify period and unit; missing/suppressed/zero states are distinct.
- Production build passes type checking, linting, unit/component tests, and Playwright critical-flow tests.
- No raw dataset record, payer-card key, credential, or AvalAI key enters client bundles/logging/storage.
Unresolved dependencies
- Approved analytics metric catalogue and cohort suppression policy
- Approved authentication/session API
- OpenAPI/interface contract and error format
- Decisions listed in
DESIGN.md - Static adapter fallback/routing behavior under the final Nginx configuration