Dựng lại màn mời thành viên của teacher.flyer.us theo cách Claude làm: một ô dán danh sách, thêm lựa chọn mời qua liên kết, và trả kết quả theo từng dòng thay vì một thông báo chung.
anh muốn PRD một ideas mời giáo viên vào trường, giống style của Claude này
Tài liệu do trợ lý AI soạn trong một phiên làm việc, dựa trên mã nguồn partner-web (hộp thoại ModalInviteUser, trang quản lý tài khoản) và bảng school_invited_teachers, school_teacher_profiles trên read-replica production. Đây là bản đề xuất để thảo luận, chưa phải kết luận của đội sản phẩm.
Trường nhiều giáo viên gần như không tồn tại: 322/22.287 trường (1,44%) có từ hai giáo viên. Tính năng mời có từ lâu nhưng dùng rất ít — 2.071 lời mời toàn lịch sử từ 364 trường, và 83% lượt mời chỉ mời một người. Lượng mời đang tăng (tháng 9/2026: 224 lời mời từ 51 trường, cao nhất 12 tháng), nên đây là lúc sửa.
| Trạng thái lời mời | Số lượng | Tỷ lệ | Thời gian chờ trung bình |
|---|---|---|---|
| ACTIVE — đã vào trường | 1.795 | 86,7% | — |
| PENDING_APPROVAL — chờ trường duyệt | 150 | 7,2% | 177 ngày |
| PENDING — chờ giáo viên nhận | 126 | 6,1% | 411 ngày |
Hộp thoại ModalInviteUser gọi viewerPartnerSchoolInviteTeacher với danh sách identifier và một roleId chung cho cả lượt.
| Phần | Cách hoạt động hiện nay |
|---|---|
| Cách xác định người nhận | Ba lựa chọn loại trừ nhau: email, số điện thoại, tên tài khoản. Đổi lựa chọn là xoá trắng ô vừa nhập. |
| Nhập nhiều người | Chỉ nhận dấu phẩy. Dán một cột từ bảng tính — mỗi dòng một email — sẽ không tách đúng. |
| Vị trí | Một vị trí cho cả lượt mời. Mặc định TEACHER, bỏ OWNER khỏi danh sách. |
| Kết quả trả về | Một thông báo chung. Khi có lỗi, giao diện chỉ đọc userErrors[0] — dán 30 email mà hỏng 2 thì không biết hỏng dòng nào. |
| Quản lý sau khi mời | Đã có tab Hoạt động / Chờ xác nhận, cột vị trí, tìm kiếm theo email và số điện thoại, xuất CSV. |
school_invited_teachers.teacher_profile_id không cho rỗng, và 2.071/2.071 lời mời đều trỏ tới tài khoản đã tồn tại — tức chỉ mời được người đã có tài khoản FLYER, người mới trả lỗi NotFound. Ngược lại, cột code 32 ký tự đã có đủ trên cả 2.071 dòng: cơ chế mã mời nằm sẵn trong dữ liệu, chỉ chưa có giao diện dùng tới.Giữ nguyên bố cục Claude dùng: một ô dán duy nhất, hai cách mời đặt cạnh nhau, vị trí chọn bên dưới. Bỏ ba nút chọn loại trừ nhau, thay bằng một ô nhận cả email và số điện thoại — hệ thống tự nhận dạng từng dòng.
Bản bấm thử được — nhập liệu, gửi và xem kết quả chạy thật trong trình duyệt, không gọi máy chủ.
Người mở liên kết mà chưa có tài khoản sẽ được đăng ký rồi vào thẳng trường. Quản trị trường vẫn duyệt ở tab Chờ xác nhận.
Thử dán thêm dòng sai định dạng, hoặc email đã ở trong trường ([email protected]), để xem cách báo lỗi theo từng dòng.
| Thay đổi | Giải quyết | Làm gì | Độ nặng |
|---|---|---|---|
| Dán hàng loạt và tải CSV | Dán từ bảng tính không tách đúng dòng | Nhận dấu phẩy, chấm phẩy và xuống dòng; tự nhận dạng email hay số điện thoại, bỏ ba nút chọn loại trừ nhau. | Nhẹ |
| Kết quả theo từng dòng | Hỏng 2 trong 30 dòng mà không biết dòng nào | Trả trạng thái cho từng dòng thay vì một thông báo chung. | Nhẹ |
| Vòng đời lời mời | 256 lời mời treo quá 30 ngày | Hạn mặc định 14 ngày, nhắc một lần trước hạn, gửi lại và thu hồi ngay ở tab Chờ xác nhận. | Vừa |
| Liên kết mời | Trường không có sẵn danh sách email | Sinh liên kết theo trường từ cột code có sẵn, kèm hạn dùng, vị trí mặc định, thu hồi và tạo lại. | Vừa |
| Mời người chưa có tài khoản | Không nạp được giáo viên mới vào hệ thống | Lưu lời mời theo email hoặc số điện thoại khi chưa có tài khoản, gắn vào lúc người đó đăng ký. Nặng nhất nhưng giá trị nhất. | Nặng |
| Chỗ đụng tới | Thay đổi |
|---|---|
| school_invited_teachers | Cho teacher_profile_id nhận giá trị rỗng; thêm email, phone_number, expires_at, invited_by. Ràng buộc: một trong ba cột định danh phải có giá trị. |
| viewerPartnerSchoolInviteTeacher | Trả kết quả theo từng phần tử identifier thay vì một mảng lỗi chung, để giao diện dựng được bảng kết quả ở mục 3. |
| ModalInviteUser.tsx | Bỏ ba nút chọn loại trừ nhau, một ô nhập chung, tách theo dấu phẩy và xuống dòng, thêm tải CSV và bảng kết quả. |
| Luồng đăng ký | Khi tài khoản mới được tạo, tra lời mời đang treo theo email hoặc số điện thoại và gắn vào trường. |
| Liên kết mời | Đường dẫn công khai đọc code, kiểm tra hạn, dẫn sang đăng ký hoặc đăng nhập rồi vào trường. |
| Tác vụ định kỳ | Nhắc lời mời sắp hết hạn, chuyển lời mời quá hạn sang EXPIRED. Dùng lại loại SCHOOL_INVITE và mẫu thư school_invite_teacher đã có. |
| Chỉ số | Hiện tại | Mục tiêu |
|---|---|---|
| Tỷ lệ lời mời được nhận | 86,7% | Trên 92% |
| Lời mời treo quá 30 ngày | 256 | Dưới 30 |
| Thời gian chờ trung bình khi chưa nhận | 411 ngày | Dưới 14 ngày, do có hạn dùng |
| Lượt mời từ hai người trở lên | 17% | Trên 40% |
| Trường có từ hai giáo viên | 322 (1,44%) | Tăng theo quý, đo sau khi mở liên kết mời |
Chỉ số cuối là chỉ số kết quả, không phải chỉ số của riêng màn mời: trường nhiều giáo viên còn phụ thuộc cách bán hàng và loại khách. Nên đọc kèm nguồn đăng ký.
teacher_subscription_schools nhưng tài liệu này chưa rà phần gói và chỗ ngồi. Cần xác nhận thêm giáo viên có làm thay đổi hoá đơn không, trước khi viết câu thông báo trong hộp thoại.OWNER đều hiện trong danh sách chọn. Cần chốt vị trí nào được phép mời người khác.Nguồn: partner-web (ModalInviteUser.tsx, src/locales/vi/common.json), read-replica production (school_invited_teachers 2.071 dòng, school_teacher_profiles), ảnh chụp hộp thoại Add member của Claude · Tài liệu liên quan: Bản đồ báo cáo và thông báo · Danh mục PRD · Roadmap