Trường Số · Product Requirements · 09/2026

PRD 09 · Reports and dashboards

An executive dashboard across admissions, students, classes, attendance and finance with drill-downs, a library of standard reports per module, scheduled digests, and exports. Extends the existing sales dashboard and drill-down page.

Key facts, origin and limits
Status
Draft v1
Owner module
Báo cáo
Backend
EXISTING 5 CRM dashboard endpoints, tuition stats, rollups · NEW cross-module aggregates
Phase
P1 executive dashboard · P2 report library, digests
Depends on
all modules

Drafted by an AI assistant in a single session on 10/09/2026, from the original request quoted verbatim on the hub page; the Proposed design section was added on 16/09/2026. A proposal for team discussion, not a decision of the product team.

Sources

  • Public competitor research (PSE ONE, pse4.one), the center-crm-frontend codebase and the staging /v3 OpenAPI specification (182 paths), as of 10/09/2026.
  • The existing / extend / new tags on this page come from a comparison with the staging /v3 specification at that date.

Limits

  • Verification pending in-app survey, because automated login to the reference product was not authorised in the drafting session:
    • Competitor's report list ("thống kê danh sách nhân sự / lớp / học sinh / buổi học còn lại / doanh số tư vấn / thu chi / công nợ / kho") and their column sets.
    • Whether they have a dashboard with charts or only tabular reports.
    • Export formats offered.

Proposed design

The overall layout is a four-row executive dashboard in the Cloud theme, role home pages that reuse the same tiles and tables, and every figure is a link to the list that produced it.

1 · Executive dashboard

/dashboard · desktop

Executive dashboard
Filter bar with branch, period (this week, this month, last month, this quarter, custom) and the compare-to-previous-period toggle. Four rows of tiles (Money, Students, Classes, Admissions) follow the table in section 3; each tile shows value, delta and a drill-down link, the overdue-debt tile carries aging mini-bars, and the unmarked-sessions and low-balance tiles carry status chips. Below are the two charts, daily collections (bars) against billed (line) and students by month, then the per-branch table with the Cầu Giấy row selected to switch the branch filter (REP-01, REP-02).

2 · Academic admin home

/dashboard?role=academic_admin · desktop

Academic admin home
Five tiles summarise today's sessions, students waiting for placement, near-full classes, classes ending within 14 days and open parent requests. The today's-sessions table shows marked, unmarked, in-progress and substitute-needed states when a teacher is on leave; the rail lists waiting students by level, near-full or ending classes, and parent requests (section 4).

3 · Accountant home

/dashboard?role=accountant · desktop

Accountant home
Tiles for today's collections, unreconciled transfers, invoices pending approval, overdue debt and e-invoice errors. The unreconciled-transfers table shows invoice-match suggestions in three states (matched one invoice, needs choice, no match); the rail shows overdue debt by aging bucket, cash-close status per branch (closed, not closed, mismatch) and invoices pending approval; e-invoice issuing errors appear in a warning callout (section 4).

4 · Teacher home (mobile)

/dashboard?role=teacher · mobile

Teacher home
The teacher's mobile home: an unmarked-session banner, today's sessions with attendance state, the week's schedule by day, students to watch (absent, low balance, late) and FLYER assignments due, from existing data (section 4).

5 · Report library

/reports · desktop

Report library
The 16 standard reports grouped by module exactly as in the section 5 table; each row states its row unit and filters and has an Export Excel action; the Saved filter chip reflects per-user filters kept in view-configs. The Recent exports card shows a 20,164-row export running as a job and one job still processing (REP-04).

6 · Lead sources and conversion report

/reports/lead-sources · desktop

Lead sources and conversion
A sample report page: filter bar with branch, period, channel and saved filters; totals row; table with every column (leads, trials, placement tests, converted, rate, revenue from conversions) and a Total row. Figures are drill-down links, and the tooltip shows the /crm/customers target with the same period applied (REP-01); 100 rows per page with a sticky header (section 5).

7 · Weekly digest settings

/reports/digest · desktop

Weekly digest
Delivery settings: enable toggle, weekday and hour (Monday 07:30), recipients limited to the owner and branch managers, data scope by permission, and the content sections. The rail previews last week's email per branch with a link to the dashboard, and the send history includes one failed delivery (REP-03, endpoint /v3/school/digest-settings).

1Purpose

The owner's question is "how is the center doing this month" and the branch manager's is "what do I fix today". The existing dashboard answers the sales part (funnel, won/lost, top sales, today's tasks). This PRD adds the operational and financial picture with the same drill-down discipline: every number links to the list that produced it. Reports are lists with filters and totals, exportable; no report builder in P1.

In scope

Out of scope

2What exists today

WidgetEndpointKeep
Việc tôi cần làm hôm nay: overdue tasks, due today, pending calls, closing soon, cold customersGET /v3/crm/dashboard/sale-summary?periodyes, admissions home
Manager card: pipeline value, open deals, won count and amount, lost, conversion rate, avg deal/manager-summaryyes, admissions section of executive dashboard
Won/lost trend, funnel, top sales (ECharts)/won-lost-trend, /funnel, /top-salesyes
Drill-down page with category map (overdue_tasks, due_today, pending_calls, closing_soon, cold_customers, pipeline_open, won_period, lost_period)customers and interactions list endpointsyes; pattern extended
Tuition stats (total, paid, unpaid, overdue counts)/school-finance/tuitions/statsyes
Teacher rollup (students, tests, completion, growth)/v3/teacher/viewer/rollup-teachersyes
Today plan widget/me/today-planyes; gains attendance and finance items
Demo mode with fake data when tenant has zero customersclientkeep for empty tenants

3Executive dashboard

Route /dashboard for owner and branch_manager; filters: branch (all or one), period (this week, this month, last month, this quarter, custom), compare to previous period toggle. Layout: four rows of tiles and charts; each tile shows value, delta versus previous period, and a link. Widgets load independently.

RowWidgetDefinitionDrill-down
MoneyDoanh thu lập hoá đơnΣ invoice totals created in period (excluding void)/finance/tuition?created
Thực thuΣ valid payments in period/finance/cashbook?type=in
Công nợ quá hạnΣ remaining on invoices past due at period end; aging mini-bars/finance/debt
Chi phíΣ approved expenses in period/finance/cashbook?type=out
StudentsHọc viên đang họccount status active at period end; delta/students?status=active
Nhập học mớifirst enrollment start in period/students?enrolled_from
Nghỉ họcwithdrawn in period; churn rate = withdrawn / active at start/students?status=withdrawn
Sắp hết buổi / hết hạnbalance ≤ 3 or expiring within 14 days/students?low_balance
ClassesTỷ lệ lấp đầyΣ active enrollments / Σ capacity of active classes/classes?tab=active
Chuyên cầnattendance rate in period; late share/attendance?tab=report
Buổi chưa điểm danhsessions ended > 2 h without sheet/attendance?tab=unmarked
AdmissionsKhách mớileads created in period by source (stacked bar)/crm/customers?created
Chuyển đổiconversions / leads created; trial to enrolled rate/crm/customers?status=won
Pipeline value and funnelexisting manager summary and funnelexisting drill-down
ChartsThu theo ngàydaily collected (bar) vs billed (line), period
Học viên theo thángactive, new, withdrawn per month, 12 months
TableTheo chi nhánhrows per branch: students, new, withdrawn, fill rate, attendance, billed, collected, overduerow switches branch filter

Chart rules (house dataviz): brand purple for the primary series, grey for comparison, status colours only for status meaning; no 3D, no pie for more than 5 slices; axis labels 11.5 px; tooltips list value and delta.

4Role home pages

RoleHome content
AdmissionsExisting sale cards and today plan; plus Học thử tuần này, Gọi lại quá hạn.
Academic adminToday's sessions with unmarked count, waiting students by level, classes near capacity, classes ending in 14 days, parent requests open, substitute needed (sessions with teacher on leave).
AccountantToday's payments, unmatched transfers, invoices pending approval, overdue by bucket, cash close status per branch, e-invoice failures.
TeacherToday's sessions, unmarked sessions, my week, students needing attention (absences, low balance), FLYER assignments due (existing data).

5Report library

ModuleReportRowsKey columnsFilters
AdmissionsNguồn khách và chuyển đổisource × periodleads, trials, placements, converted, rate, revenue from convertedbranch, period, channel
AdmissionsHiệu suất tư vấnconsultantcalls, talk time, trials booked, conversions, won amountperiod
StudentsDanh sách học viênstudentall profile columns, status, class, balance, debtstatus, class, level, branch
StudentsNghỉ học và lý dowithdrawalstudent, date, reason, months studied, refundperiod, branch
StudentsSắp hết hạnstudentbalance, expiry, class, payer, last reminderthreshold
ClassesLấp đầy lớpclasscapacity, enrolled, waiting, fill %, sessions left, end datebranch, level
ClassesSử dụng phòngroom × weekdayhours booked / availablebranch, week
AttendanceChuyên cần theo lớp / học viên / giáo viênper groupmarked, present, late, absent, excused, rate, unmarkedperiod, branch
FinanceDoanh thu và thực thuday or monthbilled, collected by method, refunds, netbranch, period
FinanceCông nợ theo tuổi nợstudentbuckets, oldest due, promise datebranch
FinanceDoanh thu theo khoá / góicourse, fee planinvoices, amount, discount total, avg priceperiod
FinanceDoanh thu hoãn lạistudentunused sessions × unit price, expirybranch
FinanceSổ quỹentrycash bookaccount, period
StaffGiờ dạy giáo viênteacher × monthsessions, hours, substitutes, paybranch, month
InventoryTồn kho và nhập xuấtitemon hand, in, out, valuebranch, period
CommunicationTin đã gửitype × channelsent, delivered, failed, costperiod

Every report page: title, filter bar (Cloud dropdown-buttons), totals row, table with sticky header, pagination 100, buttons Xuất Excel and Lưu bộ lọc (per user, stored in view-configs). Exports run as jobs above 5,000 rows.

6User stories and acceptance criteria

REP-01Owner reads the month
  • Given the executive dashboard with period This month and All branches
  • When it loads
  • Then every tile shows within 1.5 s p95, deltas versus last month, and clicking a tile opens the filtered list with the same period applied.
REP-02Numbers reconcile
  • Given the Thực thu tile
  • When compared to the cash book total for the same filters
  • Then they are equal; the test plan includes this reconciliation for every money tile.
REP-03Weekly digest
  • Given owner and branch managers with digest enabled
  • When Monday 07:30
  • Then an email with last week's key numbers per branch and links is sent; the same content is available at /reports/digest.
REP-04Export
  • Given a report with 20,000 rows
  • When I export
  • Then a job runs, a notification delivers a signed link within 60 s, and the export is audited as a personal-data export where applicable.

7Data and API

Dashboards read from maintained daily aggregates (agg_daily_school: date, school_id, billed, collected, refunds, expenses, active_students, new_enrollments, withdrawals, sessions_held, present, late, absent, excused, unmarked, leads_new, conversions) refreshed on write and recomputed nightly. Real-time tiles (unmarked sessions, unmatched transfers, pending approvals) query live tables.

MethodPathRequest / responseStatus
GET/v3/crm/dashboard/*unchangedexisting
GET/v3/school/dashboard/executiveschool_id?, from, to, compare=true → {tiles: {key: {value, prev, delta_pct, link}}, series: {...}, by_school: [...]}new
GET/v3/school/dashboard/home?role=role home widgetsnew
GET/v3/school/reports/{key}filters per report; page, limit; format=xlsx → rows + totals or job idnew
GET/v3/school/reports/jobs/{id}status, download urlnew
GET/PUT/v3/crm/view-configs/{view}saved filters per report view keyexisting
GET/PUT/v3/school/digest-settings{enabled, recipients, weekday, hour}new

8Permissions

Codeownerbranch_manageraccountantacademic_adminadmissionsteacher
reports.executiveallbranchfinance sectionnonono
reports.admissionsyesbranchnonoownno
reports.academicyesbranchnobranchnoown classes
reports.financeyesbranchbranchnonono
reports.exportyesyesfinanceacademicnono

9Analytics events

EventProperties
dashboard_viewedrole, period, branch_scope, load_ms
tile_drilldowntile_key
report_viewedkey, filters_count
report_exportedkey, rows, job
digest_sent / digest_opened

10Edge cases and open questions

Trường Số (truongso.net) · FLYER internal