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
Cases
74
P0 / P1
22 / 35
Regression pack
22
PRD
01 Admissions CRM
Phase
P1

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.json and runs/run-1/, and every result field is still not_run.
  • Cases inherit any open question or inconsistency in the PRDs they trace to.

1Summary

P0
22
P1
35
P2
15
P3
2
Typefunctionalui-uxedgenegativeregressionflowa11yperfsecurityi18n
Count433511321042

2Test cases

IDTitleTypePriorityPhasePreconditionsStepsExpected resultPRD traceData neededRun 1
TS-ADM-001Create a lead with guardian and prospective learner blockfunctionalP0P1As U-ADM on /crm/customers.
  1. Click + Thêm khách hàng.
  2. Enter Họ tên "Nguyễn Thị Mai", SĐT 0988111222, source Facebook, channel Zalo OA.
  3. Under "Học viên dự kiến" enter Tên "Nguyễn Gia Bảo", Năm sinh 2017, Trường "TH Lê Lợi", Trình độ Starters.
  4. Save.
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-01Fixtures belowNot run
TS-ADM-002Duplicate check by phone still blocks on createregressionP0P1As U-ADM.
  1. Open the create drawer.
  2. Enter phone 0987000001 (L1) and a different name.
  3. Blur the phone field / press Save.
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 1Fixtures belowNot run
TS-ADM-003Soft duplicate warning on child name + birth yearfunctionalP1P1As U-ADM; L1 has prospect "Phạm Minh" 2018.
  1. Open the create drawer with a new phone 0988111333.
  2. Enter prospect Tên "Phạm Minh", Năm sinh 2018.
  3. Save.
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 warningFixtures belowNot run
TS-ADM-004Prospect birth year validationnegativeP2P1As U-ADM in the create drawer.
  1. Enter Năm sinh 1899, then 2031, then "abc".
Each is rejected inline with a message like "Năm sinh không hợp lệ (1950–<current year>)"; Save disabled while invalid.ADM-01Fixtures belowNot run
TS-ADM-005Returning family: guardian phone already belongs to an enrolled studentedgeP1P1As U-ADM; G1 phone 0901234567 is guardian of S1.
  1. Open the create drawer and enter phone 0901234567.
Banner "Phụ huynh đã có học viên" with a link to S1 appears; consultant can continue and save the lead.01 §11 returning familyFixtures belowNot run
TS-ADM-006Siblings are additional prospect entries on one leadfunctionalP1P1As U-ADM on L1 detail.
  1. In group Học viên dự kiến click + Thêm.
  2. Add "Phạm Lan" 2020.
Group lists two prospects; GET returns prospect_learners length 2 with distinct keys.01 §6 rule 1Fixtures belowNot run
TS-ADM-007Lead table shows new columns Học viên dự kiến, Học thử, Xếp lớpfunctionalP1P1As U-ADM in table view.
  1. Open column settings.
  2. Enable the three columns.
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 adjustmentsFixtures belowNot run
TS-ADM-008Quick filters above the tablefunctionalP1P1As U-ADM.
  1. Click each quick filter: Tất cả · Của tôi · Gọi lại hôm nay · Học thử tuần này · Thắng tháng này.
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 §5Fixtures belowNot run
TS-ADM-009Filters "Có gọi lại" and "Không gọi"functionalP1P1As U-OWNER.
  1. Apply filter Có gọi lại.
  2. Clear; apply filter Không gọi.
Có gọi lại lists L4; Không gọi lists L3 only; counts match.01 §5Fixtures belowNot run
TS-ADM-010Empty state of the lead listui-uxP2P1As owner of tenant EMPTY.
  1. Open /crm/customers table view.
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 modeFixtures belowNot run
TS-ADM-011Callback queue orders overdue, today, upcomingfunctionalP0P1As U-ADM; L4 has overdue callback; create another lead with callback at today 17:00 and one at tomorrow.
  1. Open /crm/schedules, tab Gọi lại.
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-02Fixtures belowNot run
TS-ADM-012One-click Gọi opens the quick-log dialog preselected; logging removes the rowfunctionalP0P1As U-ADM on tab Gọi lại.
  1. Click Gọi on L4.
  2. Choose outcome Quan tâm, save.
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-02Fixtures belowNot run
TS-ADM-013Callback queue empty stateui-uxP2P1As a consultant with no callbacks.
  1. Open tab Gọi lại.
Text exactly "Không có yêu cầu gọi lại."01 §5 Lịch hẹn & cuộc gọiFixtures belowNot run
TS-ADM-014Callback queue filters by assignee and date rangefunctionalP2P1As U-OWNER.
  1. Filter assignee = U-ADM.
  2. Set date range to yesterday only.
Only L4 remains; clearing filters restores all rows.ADM-02, 01 §8 interactions queryFixtures belowNot run
TS-ADM-015Callback queue respects own scopesecurityP1P1As U-ADM (own scope); a callback exists on a lead assigned to another consultant.
  1. Open tab Gọi lại.
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 ownFixtures belowNot run
TS-ADM-016Schedules tabs Hôm nay, Gọi lại, Cuộc hẹn, Học thửfunctionalP1P1As U-ADM.
  1. Open /crm/schedules and click each tab.
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 §5Fixtures belowNot run
TS-ADM-017Mark do-not-call with reasonfunctionalP0P1As U-ADM on L1 detail.
  1. Open the kebab and choose Đánh dấu không gọi.
  2. Enter reason "Khách yêu cầu" and confirm.
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-03Fixtures belowNot run
TS-ADM-018DNC reason is requirednegativeP1P1As U-ADM.
  1. Open Đánh dấu không gọi and confirm with an empty reason.
Confirm disabled or inline error "Vui lòng nhập lý do"; no flag set.ADM-03Fixtures belowNot run
TS-ADM-019Quick-log-call guard on a DNC leadfunctionalP0P1As U-ADM on L3.
  1. Click Gọi (quick log call).
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 4Fixtures belowNot run
TS-ADM-020Force call requires customers.force_callsecurityP1P1U-ADM and U-BM-A on L3.
  1. As U-ADM try to remove the DNC mark; call DELETE /customers/{L3}/do-not-call.
  2. As U-BM-A remove the mark from the UI.
U-ADM: no remove action in UI; API returns 403. U-BM-A: mark removed, audit entry written, chip disappears.ADM-03, 01 §9Fixtures belowNot run
TS-ADM-021DNC lead is skipped in bulk ZNSfunctionalP1P1As U-OWNER; L3 has Zalo consent but DNC.
  1. Select L3 and L1 in the table, click bulk Gửi ZNS, send an approved template.
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 reasonFixtures belowNot run
TS-ADM-022DNC does not block transactional messages to the guardian of an enrolled studentedgeP2P1A lead marked DNC whose phone equals G2's phone; G2 child S6 is enrolled.
  1. Save attendance on SES-TODAY with S6 absent.
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 §3Fixtures belowNot run
TS-ADM-023Book a trial into a real sessionfunctionalP0P1As 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.
  1. Open tab Học thử & xếp lớp, click Đặt lịch học thử.
  2. Pick class C1 (dialog shows level Movers, teacher T1, "Chỗ học thử: 2").
  3. Pick the next session from the list of 5.
  4. Enter note "Bé nhút nhát", leave Gửi xác nhận Zalo on. Confirm.
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-04Fixtures belowNot run
TS-ADM-024Trial dialog lists only next 5 sessions of the classfunctionalP2P1As U-ADM in the trial dialog with C1 selected.
  1. Open the session picker.
Exactly 5 future sessions, ascending by date, each "T3 dd/MM · 18:00–19:30 · P.201"; past sessions absent.01 §5 trial dialogFixtures belowNot run
TS-ADM-025Trial validation: session must be in the futurenegativeP1P1As U-ADM.
  1. Call POST /v3/crm/trial-bookings with session_id of SES-PAST.
HTTP 400/422 with a message naming the session date; no booking created.01 §5 validationFixtures belowNot run
TS-ADM-026No trial seats left returns 409 NO_TRIAL_SEATSnegativeP0P1C1 next session already has 2 trial bookings.
  1. As U-ADM book a third trial on that session.
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 3Fixtures belowNot run
TS-ADM-027Same prospect cannot hold two bookings on the same daynegativeP1P1L1 prospect already booked on the next C1 session.
  1. Book the same prospect into a C2 session on the same date.
API returns 409 DUPLICATE_TRIAL; UI shows "Học viên đã có lịch học thử ngày này".01 §5 validationFixtures belowNot run
TS-ADM-028Class without allow_trial is not offeredfunctionalP1P1Class C4 has allow_trial false.
  1. Open the trial dialog and search "Flyers 3".
C4 does not appear in the picker (or appears disabled with "Không nhận học thử").ADM-04 GivenFixtures belowNot run
TS-ADM-029Trial status updates when the teacher marks attendanceflowP0P1Trial booked for L1 on SES-TODAY; U-TEACH.
  1. As U-TEACH open /teach/sessions/<SES-TODAY>/attendance.
  2. Mark "Phạm Minh" (Khách section) Có mặt, choose quick note Phù hợp, save.
  3. As U-ADM check /crm/trials and the notification bell.
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-07Fixtures belowNot run
TS-ADM-030Trial no-showfunctionalP1P1Trial booked; teacher marks the trial student Vắng.
  1. Save the sheet with the trial row Vắng.
Booking status Vắng (no_show); consultant notified; lead activity written.04 §10 trial absentFixtures belowNot run
TS-ADM-031Trials page columns and actionsfunctionalP1P1As U-ADM with bookings in every status.
  1. Open /crm/trials.
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ử tableFixtures belowNot run
TS-ADM-032Reschedule a trial (Đổi buổi)functionalP1P1A booked trial.
  1. Click Đổi buổi, pick another future session with seats, confirm.
session_id updated (PATCH), the old session roster no longer lists the prospect, the new one does; status stays Đã đặt.01 §8 PATCH trial-bookingsFixtures belowNot run
TS-ADM-033Cancel a trialfunctionalP1P1A booked trial.
  1. Click Huỷ, confirm.
Status Đã huỷ; trial seat released (seat count back to 2); Chuyển đổi still available.01 §8Fixtures belowNot run
TS-ADM-034School cancels a session with trial bookingsedgeP1P1Trial booked on the next C1 session; U-ACAD-A.
  1. As U-ACAD-A cancel that session with reason.
  2. As U-ADM check notifications.
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 cancelledFixtures belowNot run
TS-ADM-035Placement test status labels match the API enumi18nP0P1Tests exist in each API status.
  1. Open /crm/placement-tests.
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 inconsistencyFixtures belowNot run
TS-ADM-036Create a placement test without a linked learner and submit manual scoresfunctionalP0P1As U-ADM on L1 (no linked learner).
  1. Click Tạo bài kiểm tra; fill Trình độ Movers, Thời gian kiểm tra tomorrow 09:00, Giám khảo T1, Ghi chú.
  2. Save; then open Nhập kết quả.
  3. Enter Điểm tổng 72, Nghe 80, Nói 60, Đọc 75, Viết 70, Link kết quả, Ghi chú; save.
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-05Fixtures belowNot run
TS-ADM-037Placement test with linked learner sends the FLYER testfunctionalP1P1Lead with linked learner (L2).
  1. Create a placement test on L2 with Mã đề FLYER.
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-05Fixtures belowNot run
TS-ADM-038All placement form labels are localisedi18nP1P1As U-ADM in en locale.
  1. Open the placement test form and the result modal.
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 §5Fixtures belowNot run
TS-ADM-039Placement result submitted twice: last write wins with auditedgeP2P1A completed test.
  1. Submit the result again with Điểm tổng 55.
Result shows 55 and suggested level recomputed (Starters band); lead audit log has two placement_result_submitted entries.01 §11Fixtures belowNot run
TS-ADM-040Placement scores validationnegativeP2P1Result modal open.
  1. Enter Điểm tổng 101, then -1, then blank.
Each rejected inline ("0–100"); save disabled.ADM-05Fixtures belowNot run
TS-ADM-041Chuyển đổi button visibility and primary statefunctionalP1P1L1 open (not won); L2 won.
  1. As U-ADM open L1 detail.
  2. Open L2 detail.
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 detailFixtures belowNot run
TS-ADM-042Wizard step 1: learner and branchfunctionalP0P1As U-ADM on L1.
  1. Click Chuyển đổi.
  2. Step 1: choose "Tạo học viên mới"; verify the name prefills "Phạm Minh"; enter Ngày sinh 15/03/2018, Giới tính Nam, Trường TH Lê Lợi; Chi nhánh defaults to Quận 1.
  3. Click Tiếp.
Step title "1 Học viên"; validation passes; step indicator advances to 2 of 4.ADM-06 step 1Fixtures belowNot run
TS-ADM-043Wizard step 1 validation: birthday required under 18, branch requirednegativeP1P1In step 1 with "Tạo học viên mới".
  1. Leave Ngày sinh empty, click Tiếp.
  2. Clear Chi nhánh, click Tiếp.
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 validationFixtures belowNot run
TS-ADM-044Wizard step 2: guardian prefill and consentfunctionalP0P1Step 2 reached.
  1. Verify SĐT prefilled 0987000001 and Họ tên prefilled from lead.
  2. Set Quan hệ Mẹ; tick "Đồng ý nhận thông báo" (Zalo); enter Email.
  3. Click Tiếp.
Consent text version is displayed next to the checkbox (e.g. v1.0); step 3 opens.ADM-06 step 2Fixtures belowNot run
TS-ADM-045Wizard step 2 phone validationnegativeP1P1Step 2.
  1. Change SĐT to "12345" and click Tiếp.
Inline error "Số điện thoại không hợp lệ"; cannot proceed.01 §5Fixtures belowNot run
TS-ADM-046Wizard step 3: class picker filtered by branch shows seats and schedulefunctionalP0P1Step 3, branch Quận 1.
  1. Open the Lớp picker.
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 3Fixtures belowNot run
TS-ADM-047Wizard step 3: fee plan options come from the coursefunctionalP0P1Step 3 with C1 selected.
  1. Open Gói học phí.
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 moneyFixtures belowNot run
TS-ADM-048Wizard step 3: discount above consultant limit shows "Cần duyệt"functionalP0P1Step 3; admissions limit 10%.
  1. Enter Giảm giá 15%, reason "Anh chị em".
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 limitsFixtures belowNot run
TS-ADM-049Wizard step 3: full class blocks enrollment with waiting optionnegativeP1P1Step 3.
  1. Select C2 (12/12).
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-07Fixtures belowNot run
TS-ADM-050Wizard step 4 summary and togglesfunctionalP1P1Step 4.
  1. Read the summary.
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 4Fixtures belowNot run
TS-ADM-051Confirm conversion creates all records in one transactionflowP0P1Steps 1–4 completed with C1, FP1, no discount, Tạo hoá đơn ngay on.
  1. Click Xác nhận.
  2. Follow the three result links.
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 ThenFixtures belowNot run
TS-ADM-052Conversion atomicity: failure in step 3 leaves nothingnegativeP0P1Stub configured so enrollment creation fails (e.g. class deleted between steps or stub error flag).
  1. Run the wizard to Xác nhận.
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 01Fixtures belowNot run
TS-ADM-053Convert with "Chờ xếp lớp"functionalP1P1Wizard step 3.
  1. Choose Chờ xếp lớp, FP3, confirm.
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ớpFixtures belowNot run
TS-ADM-054Convert a second prospect on an already-won leadfunctionalP1P1L2 (p1 converted, p2 not).
  1. Click Chuyển đổi on L2.
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 §11Fixtures belowNot run
TS-ADM-055Converting the same prospect twice is blockednegativeP0P1L2 p1 already converted.
  1. Call POST /v3/crm/customers/{L2}/convert with prospect_key p1.
HTTP 409 with a code such as ALREADY_CONVERTED; no new student created.01 §6 rule 2Fixtures belowNot run
TS-ADM-056Discount above limit: approval request created, sessions not creditedfunctionalP0P1Wizard with FP3 package and 15% discount by U-ADM.
  1. Confirm the wizard.
  2. Open the invoice and the student's Học phí tab.
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 01Fixtures belowNot run
TS-ADM-057Reuse existing guardian record by phonefunctionalP1P1Lead whose phone equals G1 phone.
  1. Run the wizard; in step 2 observe the guardian block.
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 guardianFixtures belowNot run
TS-ADM-058Wizard "Chuyển đổi tiếp" for siblingsfunctionalP2P1Result screen after converting p1 of a two-prospect lead.
  1. Click Chuyển đổi tiếp.
Wizard reopens at step 1 with the remaining prospect preselected and guardian data prefilled.01 §5 result screenFixtures belowNot run
TS-ADM-059Wizard keyboard and focus ordera11yP2P1Wizard open.
  1. Tab through step 1 from the first field.
  2. Press Escape.
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 §9Fixtures belowNot run
TS-ADM-060Wizard at 390 px is usableui-uxP3P1Mobile viewport.
  1. Open the wizard on a 390 px 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 §9Fixtures belowNot run
TS-ADM-061Transfer a lead to another branchfunctionalP1P1As U-BM-A on L1 (school A). Note: U-BM-A needs customers.transfer.
  1. Kebab → Chuyển chi nhánh; choose Thủ Đức and assignee (a branch-B consultant); note "Gần nhà".
  2. Confirm.
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-07Fixtures belowNot run
TS-ADM-062Admissions cannot transfersecurityP1P1As U-ADM.
  1. Look for Chuyển chi nhánh in the kebab.
  2. Call POST /v3/crm/customers/{L1}/transfer-school.
Action absent; API 403.01 §9 customers.transferFixtures belowNot run
TS-ADM-063Sources settings page reads and writes the APIfunctionalP0P1As U-OWNER.
  1. Open /settings/sources; add "TikTok" with colour; rename to "TikTok Ads"; drag to reorder; deactivate "Tờ rơi".
  2. Reload the page in a fresh browser session.
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-08Fixtures belowNot run
TS-ADM-064Channels settings page reads and writes the APIfunctionalP0P1As U-OWNER.
  1. Repeat the previous case on /settings/channels with "Hotline".
Same persistence and picker behaviour for /v3/crm/channels.ADM-08Fixtures belowNot run
TS-ADM-065Non-owner cannot manage sourcessecurityP1P1As U-BM-A.
  1. Open /settings/sources.
  2. Call POST /v3/crm/sources.
Page hidden or read-only (no add/edit controls); API 403.01 §9 config.manage owner onlyFixtures belowNot run
TS-ADM-066Won requires conversion or an explicit reasonfunctionalP1P1As U-ADM on L1.
  1. Click Thắng (Won) without converting.
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 7Fixtures belowNot run
TS-ADM-067Lead retention warning chip 30 days before anonymisationfunctionalP2P1Seeded lead with last activity 23 months and 5 days ago, not won.
  1. Open the lead in the table and detail.
Chip "Sắp ẩn danh hoá" (yellow) with the date; leads with recent activity have no chip.01 §6 rule 5, 12 §4 retentionFixtures belowNot run
TS-ADM-068Stage automation only for trial and conversionfunctionalP2P1Pipeline with trial_stage_id set.
  1. Book a trial for a lead in stage Liên hệ mới.
  2. Log a call outcome Quan tâm on another lead.
The first lead moves to the trial stage; the second lead does not move.01 §6 rule 8Fixtures belowNot run
TS-ADM-069Pipeline settings expose trial stage and terminal statusesfunctionalP2P1As U-OWNER in the pipeline editor.
  1. Open pipeline settings.
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 extendFixtures belowNot run
TS-ADM-070Kanban drag with stale cursoredgeP2P1Two browsers as U-ADM and U-OWNER.
  1. Browser 1 loads the Kanban.
  2. Browser 2 moves L1 to another stage.
  3. Browser 1 drags L1 (stale position) to a third stage.
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 cursorFixtures belowNot run
TS-ADM-071Bulk export xlsx of the lead table includes new columnsregressionP2P1As U-OWNER.
  1. Click Xuất Excel on the table with the new columns visible.
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 exportFixtures belowNot run
TS-ADM-072Import dedupe strategies still workregressionP1P1As U-OWNER with a 3-row xlsx including L1 phone.
  1. Run the import wizard with strategy Bỏ qua, then Gộp, then Ghi đè.
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 dedupeFixtures belowNot run
TS-ADM-073Lead detail tab "Học thử & xếp lớp"functionalP1P1L1 with one trial and one placement test.
  1. Open the tab.
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 detailFixtures belowNot run
TS-ADM-074Analytics events fire for lead_created and lead_convertedfunctionalP3P1Analytics stub enabled.
  1. Create a lead via form; convert it.
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 §10Fixtures belowNot run

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