Trường Số QA/01 Admissions CRM
Trường Số · QA test suite · Phase 1 · 10/09/2026
01 · Admissions CRM
Test cases for PRD 01. Every case names the fixture data it needs (see the dashboard fixtures table), numbered steps, and one observable expected result. Trace points to the user story or rule in the PRD.
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.
1Summary
P0
22
P1
35
P2
15
P3
2
| Type | functional | ui-ux | edge | negative | regression | flow | a11y | perf | security | i18n |
|---|---|---|---|---|---|---|---|---|---|---|
| Count | 43 | 3 | 5 | 11 | 3 | 2 | 1 | 0 | 4 | 2 |
2Test cases
| ID | Title | Type | Priority | Phase | Preconditions | Steps | Expected result | PRD trace | Data needed | Run 1 |
|---|---|---|---|---|---|---|---|---|---|---|
| TS-ADM-001 | Create a lead with guardian and prospective learner block | functional | P0 | P1 | As U-ADM on /crm/customers. |
| Lead created; detail sidebar shows group "Học viên dự kiến" with the four values; GET /customers/{id} returns prospect_learners[0] = {name, birth_year 2017, school, level "starters"}. | ADM-01 | Fixtures below | Not run |
| TS-ADM-002 | Duplicate check by phone still blocks on create | regression | P0 | P1 | As U-ADM. |
| Duplicate modal appears naming L1 ("Phạm Thu Hà") with link; Save is blocked until the user chooses an action (open existing / cancel). | ADM-01, 01 §6 rule 1 | Fixtures below | Not run |
| TS-ADM-003 | Soft duplicate warning on child name + birth year | functional | P1 | P1 | As U-ADM; L1 has prospect "Phạm Minh" 2018. |
| A yellow warning "Có học viên dự kiến trùng tên và năm sinh" with link to L1 is shown; Save is still allowed and the lead is created. | ADM-01 soft warning | Fixtures below | Not run |
| TS-ADM-004 | Prospect birth year validation | negative | P2 | P1 | As U-ADM in the create drawer. |
| Each is rejected inline with a message like "Năm sinh không hợp lệ (1950–<current year>)"; Save disabled while invalid. | ADM-01 | Fixtures below | Not run |
| TS-ADM-005 | Returning family: guardian phone already belongs to an enrolled student | edge | P1 | P1 | As U-ADM; G1 phone 0901234567 is guardian of S1. |
| Banner "Phụ huynh đã có học viên" with a link to S1 appears; consultant can continue and save the lead. | 01 §11 returning family | Fixtures below | Not run |
| TS-ADM-006 | Siblings are additional prospect entries on one lead | functional | P1 | P1 | As U-ADM on L1 detail. |
| Group lists two prospects; GET returns prospect_learners length 2 with distinct keys. | 01 §6 rule 1 | Fixtures below | Not run |
| TS-ADM-007 | Lead table shows new columns Học viên dự kiến, Học thử, Xếp lớp | functional | P1 | P1 | As U-ADM in table view. |
| Columns render: Học viên dự kiến shows "Phạm Minh (2018)" for L1; Học thử shows next/last trial with chip (Đã đặt / Đã học / Vắng); Xếp lớp shows placement level or "-". Column visibility persists after reload (view-configs). | 01 §5 list adjustments | Fixtures below | Not run |
| TS-ADM-008 | Quick filters above the table | functional | P1 | P1 | As U-ADM. |
| Each click updates the list and the count badge; Của tôi shows L1 and L4 only; Gọi lại hôm nay includes L4; the active filter is visually distinct; URL query reflects the filter. | 01 §5 | Fixtures below | Not run |
| TS-ADM-009 | Filters "Có gọi lại" and "Không gọi" | functional | P1 | P1 | As U-OWNER. |
| Có gọi lại lists L4; Không gọi lists L3 only; counts match. | 01 §5 | Fixtures below | Not run |
| TS-ADM-010 | Empty state of the lead list | ui-ux | P2 | P1 | As owner of tenant EMPTY. |
| Empty state with a short sentence and a primary "+ Thêm khách hàng" button (existing copy retained); demo mode fake data appears only in the dashboard admissions section, not in this list. | 09 §10 demo mode | Fixtures below | Not run |
| TS-ADM-011 | Callback queue orders overdue, today, upcoming | functional | P0 | P1 | As U-ADM; L4 has overdue callback; create another lead with callback at today 17:00 and one at tomorrow. |
| Rows ordered: L4 (overdue, red chip "Quá hạn" with elapsed time), then today, then tomorrow. Columns: Khách hàng, SĐT, Giờ hẹn gọi, Quá hạn, Người phụ trách, Lần gọi gần nhất, action Gọi. | ADM-02 | Fixtures below | Not run |
| TS-ADM-012 | One-click Gọi opens the quick-log dialog preselected; logging removes the row | functional | P0 | P1 | As U-ADM on tab Gọi lại. |
| Dialog opens with L4 preselected and phone visible; after save the row disappears from the queue without reload and an interaction appears on L4's timeline. | ADM-02 | Fixtures below | Not run |
| TS-ADM-013 | Callback queue empty state | ui-ux | P2 | P1 | As a consultant with no callbacks. |
| Text exactly "Không có yêu cầu gọi lại." | 01 §5 Lịch hẹn & cuộc gọi | Fixtures below | Not run |
| TS-ADM-014 | Callback queue filters by assignee and date range | functional | P2 | P1 | As U-OWNER. |
| Only L4 remains; clearing filters restores all rows. | ADM-02, 01 §8 interactions query | Fixtures below | Not run |
| TS-ADM-015 | Callback queue respects own scope | security | P1 | P1 | As U-ADM (own scope); a callback exists on a lead assigned to another consultant. |
| Only callbacks on U-ADM's leads are listed; the other consultant's row is absent; API with assignee_id of the other user returns 403 or an empty list. | 01 §9 customers.view own | Fixtures below | Not run |
| TS-ADM-016 | Schedules tabs Hôm nay, Gọi lại, Cuộc hẹn, Học thử | functional | P1 | P1 | As U-ADM. |
| Four tabs exist in this order; Hôm nay shows today-plan items; Cuộc hẹn lists meetings; Học thử lists trial bookings with the same columns as /crm/trials. | 01 §5 | Fixtures below | Not run |
| TS-ADM-017 | Mark do-not-call with reason | functional | P0 | P1 | As U-ADM on L1 detail. |
| L1 shows a "Không gọi" chip; GET returns do_not_call_at, do_not_call_by (U-ADM) and reason; an audit entry exists. | ADM-03 | Fixtures below | Not run |
| TS-ADM-018 | DNC reason is required | negative | P1 | P1 | As U-ADM. |
| Confirm disabled or inline error "Vui lòng nhập lý do"; no flag set. | ADM-03 | Fixtures below | Not run |
| TS-ADM-019 | Quick-log-call guard on a DNC lead | functional | P0 | P1 | As U-ADM on L3. |
| Dialog shows a red guard "Khách hàng đã yêu cầu không gọi" and the call log form is blocked; no "Vẫn gọi" button for admissions. | ADM-03, 01 §6 rule 4 | Fixtures below | Not run |
| TS-ADM-020 | Force call requires customers.force_call | security | P1 | P1 | U-ADM and U-BM-A on L3. |
| U-ADM: no remove action in UI; API returns 403. U-BM-A: mark removed, audit entry written, chip disappears. | ADM-03, 01 §9 | Fixtures below | Not run |
| TS-ADM-021 | DNC lead is skipped in bulk ZNS | functional | P1 | P1 | As U-OWNER; L3 has Zalo consent but DNC. |
| Result summary shows L1 sent and L3 "Bỏ qua: Không gọi"; no message row for L3 with status sent. | ADM-03, 07 skip reason | Fixtures below | Not run |
| TS-ADM-022 | DNC does not block transactional messages to the guardian of an enrolled student | edge | P2 | P1 | A lead marked DNC whose phone equals G2's phone; G2 child S6 is enrolled. |
| Absence message to G2 is attempted per consent (skipped only for missing Zalo consent, reason "Chưa có kênh liên lạc" and email fallback), never with reason "Không gọi". | 01 §6 rule 4, 07 §3 | Fixtures below | Not run |
| TS-ADM-023 | Book a trial into a real session | functional | P0 | P1 | As U-ADM on L1; C1 has allow_trial and 2 free trial seats; SES-TODAY is in the future (run before 18:00) or use the next C1 session. |
| Booking row appears with status Đã đặt; /crm/trials lists it; the session roster (/classes/C1 tab Buổi học > session drawer) shows "Phạm Minh" with chip Học thử; a message row type trial_confirm is created for the lead phone if consent exists; lead moves to the pipeline's trial stage if configured. | ADM-04 | Fixtures below | Not run |
| TS-ADM-024 | Trial dialog lists only next 5 sessions of the class | functional | P2 | P1 | As U-ADM in the trial dialog with C1 selected. |
| Exactly 5 future sessions, ascending by date, each "T3 dd/MM · 18:00–19:30 · P.201"; past sessions absent. | 01 §5 trial dialog | Fixtures below | Not run |
| TS-ADM-025 | Trial validation: session must be in the future | negative | P1 | P1 | As U-ADM. |
| HTTP 400/422 with a message naming the session date; no booking created. | 01 §5 validation | Fixtures below | Not run |
| TS-ADM-026 | No trial seats left returns 409 NO_TRIAL_SEATS | negative | P0 | P1 | C1 next session already has 2 trial bookings. |
| Dialog shows "Hết chỗ học thử" (or the class shows 0 seats and is not selectable); API returns 409 code NO_TRIAL_SEATS. | ADM-04, 01 §6 rule 3 | Fixtures below | Not run |
| TS-ADM-027 | Same prospect cannot hold two bookings on the same day | negative | P1 | P1 | L1 prospect already booked on the next C1 session. |
| API returns 409 DUPLICATE_TRIAL; UI shows "Học viên đã có lịch học thử ngày này". | 01 §5 validation | Fixtures below | Not run |
| TS-ADM-028 | Class without allow_trial is not offered | functional | P1 | P1 | Class C4 has allow_trial false. |
| C4 does not appear in the picker (or appears disabled with "Không nhận học thử"). | ADM-04 Given | Fixtures below | Not run |
| TS-ADM-029 | Trial status updates when the teacher marks attendance | flow | P0 | P1 | Trial booked for L1 on SES-TODAY; U-TEACH. |
| Booking status Đã học; lead timeline has activity "Học thử: đã học"; U-ADM receives notification "Học thử xong: Phạm Minh (Movers 2A)" with the teacher note. | ADM-04, ATT-07 | Fixtures below | Not run |
| TS-ADM-030 | Trial no-show | functional | P1 | P1 | Trial booked; teacher marks the trial student Vắng. |
| Booking status Vắng (no_show); consultant notified; lead activity written. | 04 §10 trial absent | Fixtures below | Not run |
| TS-ADM-031 | Trials page columns and actions | functional | P1 | P1 | As U-ADM with bookings in every status. |
| Columns: Học viên (link to lead), Phụ huynh / SĐT, Lớp (name + level chip), Buổi, Trạng thái chips Đã đặt (blue) · Đã học (green) · Vắng (red) · Đã huỷ (grey), Nhận xét GV (truncated with tooltip), Người phụ trách, Thao tác with Đổi buổi · Huỷ · Chuyển đổi. | 01 §5 Học thử table | Fixtures below | Not run |
| TS-ADM-032 | Reschedule a trial (Đổi buổi) | functional | P1 | P1 | A booked trial. |
| session_id updated (PATCH), the old session roster no longer lists the prospect, the new one does; status stays Đã đặt. | 01 §8 PATCH trial-bookings | Fixtures below | Not run |
| TS-ADM-033 | Cancel a trial | functional | P1 | P1 | A booked trial. |
| Status Đã huỷ; trial seat released (seat count back to 2); Chuyển đổi still available. | 01 §8 | Fixtures below | Not run |
| TS-ADM-034 | School cancels a session with trial bookings | edge | P1 | P1 | Trial booked on the next C1 session; U-ACAD-A. |
| Booking becomes Đã huỷ; U-ADM gets a notification with a "Đặt lại" action that opens the trial dialog for the same prospect. | 01 §11 trial session cancelled | Fixtures below | Not run |
| TS-ADM-035 | Placement test status labels match the API enum | i18n | P0 | P1 | Tests exist in each API status. |
| Labels are exactly Chưa bắt đầu (not_started), Đang làm (in_progress), Hoàn thành (completed), Đã huỷ (cancelled); no "Đã lên lịch"/"scheduled" label anywhere. In en: Not started, In progress, Completed, Cancelled. | ADM-05, 00 §6 inconsistency | Fixtures below | Not run |
| TS-ADM-036 | Create a placement test without a linked learner and submit manual scores | functional | P0 | P1 | As U-ADM on L1 (no linked learner). |
| Status Chưa bắt đầu after create; after submit status Hoàn thành; result block shows the five scores and read-only "Đề xuất lớp: Movers" computed from the level mapping (72 in Movers band). | ADM-05 | Fixtures below | Not run |
| TS-ADM-037 | Placement test with linked learner sends the FLYER test | functional | P1 | P1 | Lead with linked learner (L2). |
| POST /v3/teacher/placement-test/send is called (stub log shows it); status Chưa bắt đầu; result fields are read-only pending auto-fill. | ADM-05 | Fixtures below | Not run |
| TS-ADM-038 | All placement form labels are localised | i18n | P1 | P1 | As U-ADM in en locale. |
| No Vietnamese text appears; labels Level, Test time, Deadline, Examiner, FLYER test code, Note; result modal Overall, Listening, Speaking, Reading, Writing, Result link, Note. | ADM-05, 01 §5 | Fixtures below | Not run |
| TS-ADM-039 | Placement result submitted twice: last write wins with audit | edge | P2 | P1 | A completed test. |
| Result shows 55 and suggested level recomputed (Starters band); lead audit log has two placement_result_submitted entries. | 01 §11 | Fixtures below | Not run |
| TS-ADM-040 | Placement scores validation | negative | P2 | P1 | Result modal open. |
| Each rejected inline ("0–100"); save disabled. | ADM-05 | Fixtures below | Not run |
| TS-ADM-041 | Chuyển đổi button visibility and primary state | functional | P1 | P1 | L1 open (not won); L2 won. |
| L1: Chuyển đổi present as a secondary button (U-ADM has customers.convert). L2: Chuyển đổi rendered as the primary button. No feature-flag gating. | ADM-06, 01 §5 lead detail | Fixtures below | Not run |
| TS-ADM-042 | Wizard step 1: learner and branch | functional | P0 | P1 | As U-ADM on L1. |
| Step title "1 Học viên"; validation passes; step indicator advances to 2 of 4. | ADM-06 step 1 | Fixtures below | Not run |
| TS-ADM-043 | Wizard step 1 validation: birthday required under 18, branch required | negative | P1 | P1 | In step 1 with "Tạo học viên mới". |
| Inline errors "Bắt buộc với học viên dưới 18 tuổi" and "Chọn chi nhánh"; cannot proceed. | 01 §5 wizard validation | Fixtures below | Not run |
| TS-ADM-044 | Wizard step 2: guardian prefill and consent | functional | P0 | P1 | Step 2 reached. |
| Consent text version is displayed next to the checkbox (e.g. v1.0); step 3 opens. | ADM-06 step 2 | Fixtures below | Not run |
| TS-ADM-045 | Wizard step 2 phone validation | negative | P1 | P1 | Step 2. |
| Inline error "Số điện thoại không hợp lệ"; cannot proceed. | 01 §5 | Fixtures below | Not run |
| TS-ADM-046 | Wizard step 3: class picker filtered by branch shows seats and schedule | functional | P0 | P1 | Step 3, branch Quận 1. |
| Only branch A classes appear (C1, C2, C4; not C3); each shows "11/12", "T3, T5 · 18:00–19:30", level chip; C2 shows "12/12 · Đầy"; option "Chờ xếp lớp" is present at the top. Level suggestion (from placement) sorts matching level first. | ADM-06 step 3 | Fixtures below | Not run |
| TS-ADM-047 | Wizard step 3: fee plan options come from the course | functional | P0 | P1 | Step 3 with C1 selected. |
| FP1 "Movers 2 trọn khoá · 9,600,000 đ", FP3 "Gói 24 buổi · 6,000,000 đ" listed; FP2 monthly if attached; each shows price formatted with "." thousands and trailing "đ". | ADM-06, FIN-01, 12 §8 money | Fixtures below | Not run |
| TS-ADM-048 | Wizard step 3: discount above consultant limit shows "Cần duyệt" | functional | P0 | P1 | Step 3; admissions limit 10%. |
| Chip "Cần duyệt" appears next to the discount; summary in step 4 states an approval request will be created. | ADM-06 step 3, 05 §6 discount limits | Fixtures below | Not run |
| TS-ADM-049 | Wizard step 3: full class blocks enrollment with waiting option | negative | P1 | P1 | Step 3. |
| Inline message "Lớp đã đầy" and an offer to add to Danh sách chờ or choose Chờ xếp lớp; Tiếp blocked until resolved. | 01 §5 capacity check, CLS-07 | Fixtures below | Not run |
| TS-ADM-050 | Wizard step 4 summary and toggles | functional | P1 | P1 | Step 4. |
| Summary lists learner, branch, guardian with consent state, class, start date, fee plan, discount, total; toggles "Tạo hoá đơn ngay" default ON and "Gửi thông báo nhập học" present. | ADM-06 step 4 | Fixtures below | Not run |
| TS-ADM-051 | Confirm conversion creates all records in one transaction | flow | P0 | P1 | Steps 1–4 completed with C1, FP1, no discount, Tạo hoá đơn ngay on. |
| Result screen shows three link cards Học viên · Lớp · Hoá đơn and "Chuyển đổi tiếp". Student exists with status Đang học, code HV-0001xx, guardian G with phone 0987000001; C1 roster shows the student from start date (12/12 now); invoice exists unpaid 9,600,000 with QR; lead status won with won_at; activity "Đã chuyển thành học viên" on timeline; a CustomerLearner link exists. | ADM-06 Then | Fixtures below | Not run |
| TS-ADM-052 | Conversion atomicity: failure in step 3 leaves nothing | negative | P0 | P1 | Stub configured so enrollment creation fails (e.g. class deleted between steps or stub error flag). |
| Error toast names the failed step ("Không tạo được đăng ký lớp"); no student, guardian, invoice or lead status change persisted; lead still open; wizard stays on step 4 for retry. | ADM-06 failure, test seed 01 | Fixtures below | Not run |
| TS-ADM-053 | Convert with "Chờ xếp lớp" | functional | P1 | P1 | Wizard step 3. |
| Student status Chờ xếp lớp; no enrollment; invoice created; result screen shows Lớp card as "Chưa xếp lớp" link to /students/:id. | 01 §11 Chờ xếp lớp | Fixtures below | Not run |
| TS-ADM-054 | Convert a second prospect on an already-won lead | functional | P1 | P1 | L2 (p1 converted, p2 not). |
| Step 1 lists only p2; p1 is shown as "Đã chuyển đổi" with a link to S9; lead stays won after converting p2. | 01 §6 rule 2, 01 §11 | Fixtures below | Not run |
| TS-ADM-055 | Converting the same prospect twice is blocked | negative | P0 | P1 | L2 p1 already converted. |
| HTTP 409 with a code such as ALREADY_CONVERTED; no new student created. | 01 §6 rule 2 | Fixtures below | Not run |
| TS-ADM-056 | Discount above limit: approval request created, sessions not credited | functional | P0 | P1 | Wizard with FP3 package and 15% discount by U-ADM. |
| Invoice status Chờ duyệt; approval_request_id returned; U-BM-A sees a notification; student balance shows 0 sessions (package pending) until approval and payment. | ADM-06, FIN-02, test seed 01 | Fixtures below | Not run |
| TS-ADM-057 | Reuse existing guardian record by phone | functional | P1 | P1 | Lead whose phone equals G1 phone. |
| Step 2 shows "Phụ huynh đã có: Trần Thị Hoa" and reuses guardian G1 (no duplicate guardian row; G1 now linked to the new student and S1, S2). | 01 §11, STU-03 shared guardian | Fixtures below | Not run |
| TS-ADM-058 | Wizard "Chuyển đổi tiếp" for siblings | functional | P2 | P1 | Result screen after converting p1 of a two-prospect lead. |
| Wizard reopens at step 1 with the remaining prospect preselected and guardian data prefilled. | 01 §5 result screen | Fixtures below | Not run |
| TS-ADM-059 | Wizard keyboard and focus order | a11y | P2 | P1 | Wizard open. |
| Focus moves top-to-bottom through fields then Tiếp; focus trapped inside the modal; Escape asks for confirmation before discarding ("Huỷ chuyển đổi?"). | 12 §9 | Fixtures below | Not run |
| TS-ADM-060 | Wizard at 390 px is usable | ui-ux | P3 | P1 | Mobile viewport. |
| Steps render full-screen, controls ≥ 44 px, no horizontal scroll; the console minimum is 1280 so a graceful "Dùng máy tính để chuyển đổi" message is also acceptable. | 12 §9 | Fixtures below | Not run |
| TS-ADM-061 | Transfer a lead to another branch | functional | P1 | P1 | As U-BM-A on L1 (school A). Note: U-BM-A needs customers.transfer. |
| L1 school_id = B; assignments at A ended with reason "transfer"; new assignee receives a notification; audit entry lead_transferred; U-BM-A (branch A) can no longer open L1 (404). | ADM-07 | Fixtures below | Not run |
| TS-ADM-062 | Admissions cannot transfer | security | P1 | P1 | As U-ADM. |
| Action absent; API 403. | 01 §9 customers.transfer | Fixtures below | Not run |
| TS-ADM-063 | Sources settings page reads and writes the API | functional | P0 | P1 | As U-OWNER. |
| All changes persist after reload (no localStorage); network shows POST/PATCH /v3/crm/sources and reorder call; deactivated "Tờ rơi" no longer in the lead form picker but still displayed on historical leads. | ADM-08 | Fixtures below | Not run |
| TS-ADM-064 | Channels settings page reads and writes the API | functional | P0 | P1 | As U-OWNER. |
| Same persistence and picker behaviour for /v3/crm/channels. | ADM-08 | Fixtures below | Not run |
| TS-ADM-065 | Non-owner cannot manage sources | security | P1 | P1 | As U-BM-A. |
| Page hidden or read-only (no add/edit controls); API 403. | 01 §9 config.manage owner only | Fixtures below | Not run |
| TS-ADM-066 | Won requires conversion or an explicit reason | functional | P1 | P1 | As U-ADM on L1. |
| Dialog offers "Chuyển đổi ngay" or "Thắng không chuyển đổi" with a required reason; choosing the latter with reason "Học ở chi nhánh ngoài hệ thống" sets status won and logs event lead_won_without_conversion. | 01 §6 rule 7 | Fixtures below | Not run |
| TS-ADM-067 | Lead retention warning chip 30 days before anonymisation | functional | P2 | P1 | Seeded lead with last activity 23 months and 5 days ago, not won. |
| Chip "Sắp ẩn danh hoá" (yellow) with the date; leads with recent activity have no chip. | 01 §6 rule 5, 12 §4 retention | Fixtures below | Not run |
| TS-ADM-068 | Stage automation only for trial and conversion | functional | P2 | P1 | Pipeline with trial_stage_id set. |
| The first lead moves to the trial stage; the second lead does not move. | 01 §6 rule 8 | Fixtures below | Not run |
| TS-ADM-069 | Pipeline settings expose trial stage and terminal statuses | functional | P2 | P1 | As U-OWNER in the pipeline editor. |
| Fields Giai đoạn học thử, Trạng thái thành công, Trạng thái thất bại are editable selects; saved via PATCH /v3/crm/pipelines/{id}. | 01 §8 pipelines extend | Fixtures below | Not run |
| TS-ADM-070 | Kanban drag with stale cursor | edge | P2 | P1 | Two browsers as U-ADM and U-OWNER. |
| Either the move succeeds with a refreshed position or a toast "Dữ liệu đã thay đổi, tải lại" appears; no duplicate card, no lost card. | test seed 01 kanban stale cursor | Fixtures below | Not run |
| TS-ADM-071 | Bulk export xlsx of the lead table includes new columns | regression | P2 | P1 | As U-OWNER. |
| Downloaded xlsx contains columns Học viên dự kiến, Học thử, Xếp lớp matching the screen; row count equals the filtered count. | 01 §2 export | Fixtures below | Not run |
| TS-ADM-072 | Import dedupe strategies still work | regression | P1 | P1 | As U-OWNER with a 3-row xlsx including L1 phone. |
| Bỏ qua: 2 created, 1 skipped; Gộp: L1 blank fields filled; Ghi đè: L1 fields replaced; the error report lists the reason for each skipped row. | test seed 01 import dedupe | Fixtures below | Not run |
| TS-ADM-073 | Lead detail tab "Học thử & xếp lớp" | functional | P1 | P1 | L1 with one trial and one placement test. |
| Two sections listing the trial booking (status, session, note) and the placement test (status, score, suggested level) with buttons Đặt lịch học thử and Tạo bài kiểm tra. | 01 §5 lead detail | Fixtures below | Not run |
| TS-ADM-074 | Analytics events fire for lead_created and lead_converted | functional | P3 | P1 | Analytics stub enabled. |
| Stub log contains lead_created {source, channel, has_prospect true, via form} and lead_converted {with_class, with_tuition, discount_pct_bucket, days_from_lead_created, trial_before}. No student personal data in payloads. | 01 §10, 12 §10 | Fixtures below | Not run |
Trường Số (truongso.net) · FLYER internal