Trường Số QA/Regression
Trường Số · QA test suite · Phase 1 · 10/09/2026
Regression pack
The minimal set to rerun after every fix: every case flagged for regression (all P0 blockers plus the P1 cases that guard money, attendance, permissions, tenancy and the ten decisions) and the end-to-end flows. Run in the order below; module pages hold the full steps.
Key facts, origin and limits
Drafted by an AI assistant in a single session on 10/09/2026 as part of the Trường Số QA suite, under the request quoted verbatim on the dashboard. A proposal for team review, not a sign-off.
Sources
- The Trường Số PRD set (Draft v1, 10/09/2026): user stories, screen tables, business rules and permission matrices, plus the Cloud theme reference.
Limits
- Phase 1 (authoring) only. Cases are executed in Phase 2 against the local build; results are recorded in
testcases.jsonandruns/run-1/, and every result field is stillnot_run. - Cases inherit any open question or inconsistency in the PRDs they trace to.
1Run order
- Tenancy, roles and shell (00) and security cases from 12.
- Settings (10) so catalogs, roles and branches exist.
- Students (02), Classes (03), Attendance (04).
- Finance (05) and Communication (07).
- Admissions (01) conversion into the above.
- Reports (09) reconciliation last, then the flows.
2Cases
00 · Shell, tenancy, roles and decisions (17)
| ID | Title | Priority | Type | Trace | Run 1 |
|---|---|---|---|---|---|
| TS-OVW-001 | Sidebar shows the target navigation tree in the specified order | P1 | functional | 00 §5 navigation map, D8 | Not run |
| TS-OVW-002 | Each sidebar item routes to the specified path | P1 | functional | 00 §5, D8 | Not run |
| TS-OVW-003 | Legacy /crm/settings/* routes redirect to /settings | P1 | functional | 00 §5 route prefix note, 10 §3 | Not run |
| TS-OVW-004 | Existing CRM routes remain under /crm and old bookmarks keep working | P1 | regression | D8 | Not run |
| TS-OVW-008 | Branch switcher lists exactly the user's accessible branches | P0 | functional | D1, 00 §3 | Not run |
| TS-OVW-009 | Switching branch filters every branch-scoped list | P0 | functional | D1, 02 §5 Chi nhánh column | Not run |
| TS-OVW-012 | Branch-A user cannot read branch-B rows by URL | P0 | security | 12 §3 authorisation, 00 §3 | Not run |
| TS-OVW-013 | Default roles exist and are locked | P1 | functional | D2, 10 §4 default roles | Not run |
| TS-OVW-016 | Viewer role is read-only everywhere | P1 | security | 10 §4 viewer | Not run |
| TS-OVW-017 | Permission change takes effect on the next request without re-login | P1 | functional | 00 §4, 10 SET-03, test seed 00/10 | Not run |
| TS-OVW-018 | Stub PermissionGate is removed: Kanban actions respect real permissions | P0 | security | 00 §6 known inconsistencies | Not run |
| TS-OVW-020 | D3: every new module ships a table view and no board | P1 | ui-ux | D3 | Not run |
| TS-OVW-021 | D4: an enrolled student always has a FLYER learner profile | P0 | functional | D4, 02 STU-02 | Not run |
| TS-OVW-022 | D5: sessions are materialised rows | P1 | functional | D5, 03 §6 | Not run |
| TS-OVW-025 | D9: switching locale to en translates every visible string | P1 | i18n | D9, 12 §8 | Not run |
| TS-OVW-028 | Unauthenticated access redirects to login and back | P0 | security | 11 §1 auth 401 redirects | Not run |
| TS-OVW-030 | Onboarding checklist appears for a new tenant | P1 | functional | 10 SET-01 | Not run |
01 · Admissions CRM (22)
| ID | Title | Priority | Type | Trace | Run 1 |
|---|---|---|---|---|---|
| TS-ADM-001 | Create a lead with guardian and prospective learner block | P0 | functional | ADM-01 | Not run |
| TS-ADM-002 | Duplicate check by phone still blocks on create | P0 | regression | ADM-01, 01 §6 rule 1 | Not run |
| TS-ADM-011 | Callback queue orders overdue, today, upcoming | P0 | functional | ADM-02 | Not run |
| TS-ADM-012 | One-click Gọi opens the quick-log dialog preselected; logging removes the row | P0 | functional | ADM-02 | Not run |
| TS-ADM-017 | Mark do-not-call with reason | P0 | functional | ADM-03 | Not run |
| TS-ADM-019 | Quick-log-call guard on a DNC lead | P0 | functional | ADM-03, 01 §6 rule 4 | Not run |
| TS-ADM-023 | Book a trial into a real session | P0 | functional | ADM-04 | Not run |
| TS-ADM-026 | No trial seats left returns 409 NO_TRIAL_SEATS | P0 | negative | ADM-04, 01 §6 rule 3 | Not run |
| TS-ADM-029 | Trial status updates when the teacher marks attendance | P0 | flow | ADM-04, ATT-07 | Not run |
| TS-ADM-035 | Placement test status labels match the API enum | P0 | i18n | ADM-05, 00 §6 inconsistency | Not run |
| TS-ADM-036 | Create a placement test without a linked learner and submit manual scores | P0 | functional | ADM-05 | Not run |
| TS-ADM-042 | Wizard step 1: learner and branch | P0 | functional | ADM-06 step 1 | Not run |
| TS-ADM-044 | Wizard step 2: guardian prefill and consent | P0 | functional | ADM-06 step 2 | Not run |
| TS-ADM-046 | Wizard step 3: class picker filtered by branch shows seats and schedule | P0 | functional | ADM-06 step 3 | Not run |
| TS-ADM-048 | Wizard step 3: discount above consultant limit shows "Cần duyệt" | P0 | functional | ADM-06 step 3, 05 §6 discount limits | Not run |
| TS-ADM-051 | Confirm conversion creates all records in one transaction | P0 | flow | ADM-06 Then | Not run |
| TS-ADM-052 | Conversion atomicity: failure in step 3 leaves nothing | P0 | negative | ADM-06 failure, test seed 01 | Not run |
| TS-ADM-055 | Converting the same prospect twice is blocked | P0 | negative | 01 §6 rule 2 | Not run |
| TS-ADM-056 | Discount above limit: approval request created, sessions not credited | P0 | functional | ADM-06, FIN-02, test seed 01 | Not run |
| TS-ADM-061 | Transfer a lead to another branch | P1 | functional | ADM-07 | Not run |
| TS-ADM-063 | Sources settings page reads and writes the API | P0 | functional | ADM-08 | Not run |
| TS-ADM-064 | Channels settings page reads and writes the API | P0 | functional | ADM-08 | Not run |
02 · Students (SIS) (18)
| ID | Title | Priority | Type | Trace | Run 1 |
|---|---|---|---|---|---|
| TS-STU-001 | Student list header, tabs and counts | P0 | functional | STU list §5 | Not run |
| TS-STU-003 | Row formatting rules | P1 | ui-ux | 02 §5 notes | Not run |
| TS-STU-005 | Search by name without accents, guardian phone, code, username | P0 | functional | STU-01 | Not run |
| TS-STU-007 | Empty state text | P1 | ui-ux | 02 §5 empty state | Not run |
| TS-STU-010 | Teacher sees only students of own classes | P0 | security | 02 §9 students.view own classes | Not run |
| TS-STU-012 | Create a walk-in student with all required fields | P0 | functional | STU-02, 12 §8 phone | Not run |
| TS-STU-019 | Profile header and right rail | P0 | functional | 02 §5 profile | Not run |
| TS-STU-023 | Add a second guardian with flags | P0 | functional | STU-03 | Not run |
| TS-STU-030 | Enroll a Waiting student from the profile | P0 | functional | STU-04 | Not run |
| TS-STU-033 | Pause a student (Bảo lưu) | P0 | functional | STU-05 | Not run |
| TS-STU-036 | Resume asks for the class and re-activates | P0 | functional | STU-05 resume, 02 §11 pause overlapping expiry | Not run |
| TS-STU-037 | Pausing a Waiting student is an invalid transition | P1 | negative | 02 §3 lifecycle, 02 §8 409 | Not run |
| TS-STU-038 | Withdraw with reason shows refund estimate | P0 | functional | STU-06 | Not run |
| TS-STU-041 | Transfer a student to another branch with package balance | P0 | functional | STU-07 | Not run |
| TS-STU-044 | Học tập empty state | P1 | ui-ux | STU-08 empty | Not run |
| TS-STU-047 | Upload a document with type | P1 | functional | STU-09, 12 §3 uploads | Not run |
| TS-STU-049 | Flagged note appears on roster and attendance sheet for teachers | P0 | functional | STU-09, 02 §6 rule 8 | Not run |
| TS-STU-052 | Anonymise a withdrawn student | P0 | functional | STU-10, 12 §4 deletion | Not run |
03 · Classes and scheduling (19)
| ID | Title | Priority | Type | Trace | Run 1 |
|---|---|---|---|---|---|
| TS-CLS-001 | Create a course with extension fields | P0 | functional | CLS-01 | Not run |
| TS-CLS-003 | Class form step 1 fields and auto values | P0 | functional | CLS-02, 03 §5 form | Not run |
| TS-CLS-005 | Step 2 preview lists generated sessions and conflicts | P0 | functional | CLS-02, 03 §8 dry_run | Not run |
| TS-CLS-006 | Create class generates sessions and appears in the list | P0 | functional | CLS-02 | Not run |
| TS-CLS-010 | Room conflict shown inline with override for permitted roles | P0 | functional | CLS-03 | Not run |
| TS-CLS-011 | Teacher conflict is checked across branches | P0 | functional | CLS-03, 03 §6 teacher conflict any branch | Not run |
| TS-CLS-014 | Edit one session marks it adjusted | P0 | functional | CLS-04 | Not run |
| TS-CLS-015 | Apply to following regenerates future planned sessions only | P0 | functional | CLS-04, 03 §6 regeneration | Not run |
| TS-CLS-017 | Concurrent session edit returns STALE | P1 | edge | 03 §11 optimistic concurrency | Not run |
| TS-CLS-018 | Cancel a session with make-up appended | P0 | functional | CLS-05 | Not run |
| TS-CLS-021 | Assign a substitute | P0 | functional | CLS-06 | Not run |
| TS-CLS-023 | Add student to class up to capacity then waiting list | P0 | functional | CLS-07 | Not run |
| TS-CLS-025 | Transfer class ends and starts on the same day | P0 | functional | CLS-07 transfer, 04 §10 transferred out on the date | Not run |
| TS-CLS-029 | Book a make-up into another class of the same level | P0 | functional | CLS-08 | Not run |
| TS-CLS-032 | Timetable week grid by room | P0 | functional | CLS-09 | Not run |
| TS-CLS-039 | Close a class | P0 | functional | CLS-10 | Not run |
| TS-CLS-041 | Class list tabs, columns and status chips | P0 | functional | 03 §5 class list | Not run |
| TS-CLS-043 | Class list empty state | P1 | ui-ux | 03 §5 empty | Not run |
| TS-CLS-046 | Regenerate never touches held or cancelled sessions | P0 | functional | 03 §6 rules 1–2 | Not run |
04 · Attendance (18)
| ID | Title | Priority | Type | Trace | Run 1 |
|---|---|---|---|---|---|
| TS-ATT-001 | Teacher today list on mobile | P0 | functional | ATT §4 /teach/today | Not run |
| TS-ATT-002 | Open the sheet: all rostered students default to Có mặt | P0 | functional | ATT-01 | Not run |
| TS-ATT-004 | Mark exceptions and save in one request | P0 | functional | ATT-01 | Not run |
| TS-ATT-008 | Offline save is queued and synced | P0 | functional | ATT-01 offline | Not run |
| TS-ATT-010 | Version conflict between main and substitute | P0 | edge | 04 §10 two teachers, 04 §4 conflict state | Not run |
| TS-ATT-013 | Teacher edit after 24 h is blocked | P0 | negative | 04 §5 rule 4 | Not run |
| TS-ATT-014 | Teacher can mark only own sessions | P0 | security | 04 §8 attendance.mark own sessions | Not run |
| TS-ATT-018 | Add an excuse in advance pre-marks Có phép | P0 | functional | ATT-02 | Not run |
| TS-ATT-022 | Absent triggers ZNS within 2 minutes with the exact template | P0 | functional | ATT-03 | Not run |
| TS-ATT-026 | Guardian without consent: skipped with reason and fallback | P0 | functional | ATT-03 fallback, 04 §10 guardian without consent | Not run |
| TS-ATT-028 | Quiet hours hold non-urgent, evening absence sends immediately | P1 | edge | 04 §5 rule 6 | Not run |
| TS-ATT-031 | Admin correction after the session day requires reason and writes audit | P0 | functional | ATT-04 | Not run |
| TS-ATT-035 | Unmarked tab lists sessions ended > 2 h | P0 | functional | ATT-05 | Not run |
| TS-ATT-040 | Two consecutive absences create a follow-up task | P0 | functional | ATT-06 | Not run |
| TS-ATT-042 | Trial and make-up rows at the bottom under Khách | P0 | functional | ATT-07 | Not run |
| TS-ATT-045 | Attendance report by class | P1 | functional | ATT-08 | Not run |
| TS-ATT-046 | Attendance rate formula check | P0 | functional | 04 §5 rule 7 | Not run |
| TS-ATT-050 | Absent consumes per tenant setting | P0 | functional | 04 §5 rule 5, FIN-07 | Not run |
05 · Tuition and finance (26)
| ID | Title | Priority | Type | Trace | Run 1 |
|---|---|---|---|---|---|
| TS-FIN-001 | Add fee plans of each type to a course | P0 | functional | FIN-01 | Not run |
| TS-FIN-004 | Create an invoice from a fee plan with QR | P0 | functional | FIN-02 | Not run |
| TS-FIN-005 | Invoice total formula with line discount, invoice discount and VAT | P0 | functional | 05 §6 rule 1 | Not run |
| TS-FIN-006 | Discount above role limit sets pending approval | P0 | functional | FIN-02 | Not run |
| TS-FIN-007 | Approve and reject a pending invoice | P0 | functional | 05 §8 approve/reject | Not run |
| TS-FIN-010 | Session package credits on full payment by default | P0 | functional | FIN-02 Then, 05 §6 rule 4 | Not run |
| TS-FIN-014 | Invoice list KPI tiles and tabs | P0 | functional | 05 §5 Học phí | Not run |
| TS-FIN-019 | Bulk monthly billing preview and commit with proration | P0 | functional | FIN-03 | Not run |
| TS-FIN-021 | Record a cash payment and issue a numbered receipt | P0 | functional | FIN-04 | Not run |
| TS-FIN-022 | Partial cash payment | P0 | functional | FIN-04 partial | Not run |
| TS-FIN-023 | Overpayment refused | P0 | negative | 05 §6 rule 2 | Not run |
| TS-FIN-025 | Receipt numbering is sequential under concurrency | P0 | edge | 05 §6 rule 3, test seed 05 | Not run |
| TS-FIN-027 | Void a payment keeps the number and requires reason | P0 | functional | 05 §6 rule 3, 05 §8 payments void | Not run |
| TS-FIN-031 | SePay transfer with payment code auto-matches | P0 | functional | FIN-05 | Not run |
| TS-FIN-032 | Transfer without code lands in Chưa đối soát | P0 | functional | FIN-05 | Not run |
| TS-FIN-033 | Manual match of an unmatched transfer to an invoice | P0 | functional | FIN-05, 05 §11 early payment credit | Not run |
| TS-FIN-035 | Duplicate SePay webhook deduped | P0 | edge | 05 §11 dedupe | Not run |
| TS-FIN-037 | Debt list aging buckets and columns | P0 | functional | FIN-06 | Not run |
| TS-FIN-040 | Debt reconciliation with invoice list | P0 | functional | REP-02 style reconciliation | Not run |
| TS-FIN-041 | Package consumption FIFO by expiry and low-balance alert at 3 | P0 | functional | FIN-07 | Not run |
| TS-FIN-046 | Refund estimate on withdrawal | P1 | functional | FIN-08 | Not run |
| TS-FIN-047 | Credit note and refund with approval threshold | P0 | functional | FIN-08 | Not run |
| TS-FIN-049 | Create an expense and see it in the cash book | P1 | functional | FIN-10 | Not run |
| TS-FIN-051 | Daily cash close with difference | P1 | functional | FIN-10, 05 §6 rule 10 | Not run |
| TS-FIN-055 | Finance report tiles and reconciliation | P0 | functional | FIN-12, REP-02 | Not run |
| TS-FIN-058 | Every money write is audited with before/after | P0 | security | 05 §6 rule 11, 12 §6 | Not run |
06 · Teachers and staff (P2 smoke) (4)
| ID | Title | Priority | Type | Trace | Run 1 |
|---|---|---|---|---|---|
| TS-STF-001 | Create a staff record with account and teaching role | P0 | functional | STF-01 | Not run |
| TS-STF-006 | Contract with pay rule; overlap refused; expiry warning | P1 | functional | STF-03 | Not run |
| TS-STF-008 | Generate monthly timesheet from held sessions | P0 | functional | STF-05, 06 §6 rules | Not run |
| TS-STF-011 | Approve locks lines; export payroll xlsx | P0 | functional | STF-07 | Not run |
07 · Parent communication (11)
| ID | Title | Priority | Type | Trace | Run 1 |
|---|---|---|---|---|---|
| TS-COM-001 | Zalo OA connection card and template registry | P0 | functional | COM-01 | Not run |
| TS-COM-002 | Secrets masked after save | P0 | security | 12 §3 secrets | Not run |
| TS-COM-005 | Transactional message per event, per guardian flag | P0 | functional | COM-02, 07 §6 rule 1 | Not run |
| TS-COM-008 | Message log columns, filters and empty state | P1 | functional | 07 §5 message log | Not run |
| TS-COM-016 | Teacher class note to parents via OA/push only | P1 | functional | COM-04 | Not run |
| TS-COM-018 | Announcement composer with audience preview and unreachable list | P1 | functional | COM-03 | Not run |
| TS-COM-022 | Progress report batch: draft, comment, publish, PDF | P1 | functional | COM-05 | Not run |
| TS-COM-024 | Parent OTP login and children switcher | P0 | functional | COM-06 | Not run |
| TS-COM-025 | Portal login error states and rate limits | P1 | negative | 07 §5 login, 12 §3 rate limits | Not run |
| TS-COM-026 | Portal invoice with QR and post-payment update | P1 | flow | COM-07 | Not run |
| TS-COM-029 | Portal shows only linked children | P0 | security | 12 §3 parents see only linked learners | Not run |
08 · Inventory (P2 smoke) (4)
| ID | Title | Priority | Type | Trace | Run 1 |
|---|---|---|---|---|---|
| TS-INV-001 | Create a catalog item; duplicate SKU rejected | P0 | functional | INV-01 | Not run |
| TS-INV-002 | Stock-in document increases on-hand and becomes read-only | P0 | functional | INV-02 | Not run |
| TS-INV-003 | Issue to a student creates a finance line | P0 | functional | INV-03 | Not run |
| TS-INV-004 | Insufficient stock blocks the issue | P0 | negative | INV-03 | Not run |
09 · Reports and dashboards (8)
| ID | Title | Priority | Type | Trace | Run 1 |
|---|---|---|---|---|---|
| TS-REP-001 | Executive dashboard layout and filters | P0 | functional | 09 §3 | Not run |
| TS-REP-003 | Every tile drills down to the matching filtered list | P0 | functional | REP-01, 09 §3 drill-down | Not run |
| TS-REP-004 | Money tiles reconcile with cash book and invoice list | P0 | functional | REP-02 | Not run |
| TS-REP-005 | Student counts reconcile with list counts | P0 | functional | REP-02, test seed 09 | Not run |
| TS-REP-014 | Demo mode only in the admissions section for empty tenants | P1 | functional | 09 §10 demo mode | Not run |
| TS-REP-015 | Role home: academic admin | P1 | functional | 09 §4 | Not run |
| TS-REP-020 | Report library page pattern | P1 | functional | 09 §5 | Not run |
| TS-REP-022 | Export above 5,000 rows runs as a job with a signed link | P1 | functional | REP-04 | Not run |
10 · Settings and administration (13)
| ID | Title | Priority | Type | Trace | Run 1 |
|---|---|---|---|---|---|
| TS-SET-001 | Settings left sub-navigation lists every page in order | P0 | functional | 10 §3 | Not run |
| TS-SET-002 | Settings navigation is role-filtered | P1 | security | 10 §9 | Not run |
| TS-SET-004 | Invite a user with role and branches | P0 | functional | SET-02 | Not run |
| TS-SET-005 | Accept an invitation creates memberships | P0 | flow | SET-02, D2 derived school role | Not run |
| TS-SET-009 | Deactivate and reactivate a user | P0 | functional | 10 §4 deactivation | Not run |
| TS-SET-010 | Last owner cannot be removed or deactivated | P0 | negative | 10 §6 last owner, 12 §5 | Not run |
| TS-SET-014 | Clone Giáo vụ into Lễ tân and remove a permission | P0 | functional | SET-03 | Not run |
| TS-SET-020 | Branch profile fields persist and are used on receipts and messages | P0 | functional | SET-04 | Not run |
| TS-SET-021 | Add a branch creates a school and updates the switcher | P0 | functional | SET-05 | Not run |
| TS-SET-024 | Tenant profile persists | P0 | functional | 10 §2 tenant not persisted | Not run |
| TS-SET-026 | Generic master-data page behaviour (levels, rooms, job titles, expense categories) | P1 | functional | 10 §6 generic MasterDataPage | Not run |
| TS-SET-028 | Finance settings: receipt prefix, discount limits, thresholds, VAT defaults, credit rule, refund policy | P0 | functional | 10 §6 Tài chính | Not run |
| TS-SET-033 | Audit log viewer filters and diff | P0 | functional | SET-06 | Not run |
11 · Data model, API and imports (8)
| ID | Title | Priority | Type | Trace | Run 1 |
|---|---|---|---|---|---|
| TS-DAT-001 | List endpoints paginate with the standard envelope | P1 | functional | 11 §1 envelopes, 12 §2 limit ≤ 200 | Not run |
| TS-DAT-004 | Cross-tenant ids return 404 on every new /v3/school endpoint | P0 | security | 12 §3 authorisation, test seed 00/10 | Not run |
| TS-DAT-005 | Tenant is resolved from the token, not from client ids | P0 | security | 12 §3 | Not run |
| TS-DAT-008 | Import templates per entity download with allowed values | P0 | functional | 11 §4 templates | Not run |
| TS-DAT-010 | Validation preview with errors, warnings, error file, skip toggle | P0 | functional | 11 §4 validation preview | Not run |
| TS-DAT-015 | Dedupe strategies for students: skip, merge, overwrite | P0 | functional | 11 §4 dedupe | Not run |
| TS-DAT-017 | Rollback within 24 h when unmodified | P1 | functional | 11 §4 rollback | Not run |
| TS-DAT-018 | Full import order on Empty Center | P0 | flow | 11 §4 import order | Not run |
12 · Non-functional requirements (9)
| ID | Title | Priority | Type | Trace | Run 1 |
|---|---|---|---|---|---|
| TS-NFR-005 | Login lockout after 5 failures | P1 | security | 12 §3 rate limits | Not run |
| TS-NFR-009 | Security headers present | P1 | security | 12 §3 application security | Not run |
| TS-NFR-010 | Server-side permission checks (UI hiding is not relied on) | P0 | security | 12 §3 authorisation | Not run |
| TS-NFR-014 | Consent captured at every guardian entry point | P0 | security | 12 §4 Art. 11, 12 §11 | Not run |
| TS-NFR-020 | Mandatory audited actions all write entries | P0 | security | 12 §6, 12 §11 | Not run |
| TS-NFR-023 | Date and time formats | P1 | i18n | 12 §8 | Not run |
| TS-NFR-026 | No raw i18n keys anywhere | P1 | i18n | 12 §8 | Not run |
| TS-NFR-029 | axe run with zero serious violations on main screens | P1 | a11y | 12 §11 | Not run |
| TS-NFR-031 | Keyboard walkthrough of the daily loop | P1 | a11y | 12 §9, 12 §11 | Not run |
3Flows
| ID | Flow | Priority | Phase | Steps |
|---|---|---|---|---|
| TS-FLW-01 | Lead to first payment (the daily loop) | P0 | P1 | 9 |
| TS-FLW-02 | Walk-in student without a lead | P0 | P1 | 4 |
| TS-FLW-03 | Pause and return | P0 | P1 | 5 |
| TS-FLW-04 | Withdrawal with refund | P0 | P1/P2 | 6 |
| TS-FLW-05 | Teacher substitution | P0 | P1/P2 | 4 |
| TS-FLW-06 | Branch transfer of a student with package balance | P1 | P1/P2 | 5 |
| TS-FLW-07 | Multi-branch user day | P1 | P1 | 5 |
| TS-FLW-08 | Role escalation attempts | P0 | P1 | 8 |
| TS-FLW-09 | Month close | P1 | P1/P2 | 6 |
| TS-FLW-10 | Class lifecycle | P0 | P1 | 6 |
| TS-FLW-11 | Absence follow-up loop | P1 | P1 | 5 |
| TS-FLW-12 | Onboarding an empty tenant to first attendance | P0 | P1 | 5 |
| TS-FLW-13 | Invoice and payment reversals | P0 | P1 | 5 |
| TS-FLW-14 | Parent portal journey | P1 | P2 | 5 |
Trường Số (truongso.net) · FLYER internal