1 Tổng quan hệ thống
PhimFlix là nền tảng bán tài khoản Netflix chia sẻ (mỗi tài khoản gốc chia thành nhiều slot / profile bán cho nhiều khách). Nguồn tài khoản gồm SELF (công ty tự mua thẻ gia hạn) và CTV (cộng tác viên góp tài khoản, được hoàn tiền theo chu kỳ).
1.1 Các bên tham gia
| Vai | Là ai | Làm gì trên hệ thống |
|---|---|---|
| Khách hàng | Người mua gói Netflix | Đăng nhập, mua gói, nạp ví, lấy mã OTP Netflix, xác nhận hộ gia đình, gửi đánh giá, mở ticket hỗ trợ. |
| CTV | Người góp tài khoản Netflix vào kho | Xem tài khoản mình quản lý, xác nhận đã gia hạn Netflix (kèm bill), lấy mã / xác nhận hộ gia đình cho profile của mình, nhận tiền hoàn theo chu kỳ. |
| Admin | Nhân sự công ty | Vận hành kho, xử lý đơn, đối soát, duyệt bill CTV, chăm sóc khách, quản lý nội dung, xem tài chính. Phân quyền theo vai trò — xem mục 2. |
1.2 Luồng cốt lõi
CTV/Công ty gia hạn Netflix → Admin thêm tài khoản vào Kho tài khoản, khai báo nguồn & số slot → khách mua gói → hệ thống tự cấp 1 profile trống đúng nhóm gói → khách nhận email & PIN → khi cần đăng nhập Netflix, khách bấm “Lấy mã” → hệ thống đọc email OTP từ Netflix và trả về.
Tiền vào: khách trả qua MoMo / chuyển khoản VietQR / Ví PhimFlix → đơn chuyển PAID → ghi WalletTransaction loại PURCHASE.
Tiền ra: hoàn tiền CTV theo chu kỳ (VietQR), thưởng đánh giá cho khách (cộng ví).
Giá vốn = tiền công ty trả Netflix (SELF) + tiền hoàn CTV → dùng để tính lợi nhuận gộp (mục 5.5).
1.3 Địa chỉ & kênh vận hành
| Hạng mục | Địa chỉ / kênh |
|---|---|
| Website khách | https://phimflix.com |
| Khu quản trị | https://phimflix.com/admin |
| API | https://api.phimflix.com |
| Công cụ QA (chỉ khi test) | /qa-dev — chỉ bật trong đợt kiểm thử, tắt khi vận hành thật |
| Cảnh báo & vận hành | Telegram, chia 4 nhóm/topic: Đơn hàng · Cảnh báo · Hỗ trợ · CTV (mục 8) |
| Máy chủ | VPS riêng · PM2: phimflix-api, phimflix-web · CSDL PostgreSQL phimflix_prod |
2 Vai trò & phân quyền nội bộ (RBAC)
Khu Admin → Cài đặt → Phân Quyền & Quyền. Máy chủ chặn truy cập theo vai trò — không chỉ ẩn menu. Mỗi thay đổi đều có hộp xác nhận.
2.1 Bốn vai trò mặc định
| Vai trò | Phạm vi |
|---|---|
| SUPER_ADMIN Quản trị tối cao | Toàn quyền, gồm cả cấp/thu quyền admin và tạo vai trò tùy biến. |
| INVENTORY Vận hành kho & đơn | Kho tài khoản, đơn hàng, CTV (đầy đủ). Xem thống kê & nhật ký. Không vào Tài chính, Cài đặt, Người dùng, Đánh giá. |
| ACCOUNTANT Kế toán / Tài chính | Tài chính, cổng thanh toán (đầy đủ). Xem đơn hàng, CTV, thống kê, nhật ký. Không xem Kho tài khoản (chứa mật khẩu/PIN). |
| SUPPORT Chăm sóc khách hàng | Phiếu hỗ trợ, đánh giá, nội dung blog/hướng dẫn (đầy đủ). Xem người dùng & đơn hàng. Không xem Kho tài khoản, Tài chính, Cài đặt. |
2.2 Vai trò tùy biến
SUPER_ADMIN bấm “+ Thêm vai trò tùy biến” → đặt tên + chọn mức truy cập cho từng trong 14 hạng mục (Không / Chỉ xem / Toàn quyền) → dùng lại cho nhiều người. Sửa vai trò tùy biến ảnh hưởng ngay tới mọi người đang giữ nó. Không xoá được vai trò đang có người dùng.
2.3 Tùy chỉnh quyền cho một người
Trong danh sách quản trị viên, bấm “Tùy chỉnh quyền” ở dòng của người đó. Panel cho:
- Đổi vai trò — chọn vai trò khác → bấm “Đổi vai trò” (xoá mọi tùy chỉnh riêng cũ).
- Tinh chỉnh từng hạng mục — chọn mức riêng cho người này; danh sách này đè lên vai trò, có hiệu lực ngay ở request kế tiếp.
1. Cấp ít nhất có thể — chỉ đủ để làm việc. 2. Không cấp SUPER_ADMIN cho quá 2–3 người. 3. Việc nhạy cảm (gán quyền admin, chỉnh số dư ví khách) chỉ SUPER_ADMIN. 4. Nhân sự nghỉ việc → “Thu hồi” ngay (nút đỏ) — người đó biến mất khỏi danh sách và mọi phiên đăng nhập bị chặn ở request kế tiếp.
3 Tính năng phía khách hàng
Nắm rõ phần này để trả lời khách và tự thao tác kiểm tra khi cần.
3.1 Đăng nhập & tài khoản
- Magic link: khách nhập email → nhận mail có link → bấm vào là đăng nhập. Email chưa có sẽ được tạo tài khoản mới.
- Google: đăng nhập bằng Google. Nếu email đã dùng magic link thì không tạo tài khoản trùng.
- Phiên đăng nhập kéo dài 7 ngày. Thu hồi quyền / xoá tài khoản có hiệu lực ngay ở request kế tiếp (đọc thẳng từ CSDL).
- 2FA: khách tự bật trong Tài khoản → Bảo mật, quét mã bằng app Authenticator. Nhập sai mã 5 lần → khoá tạm ~15 phút.
- Tự yêu cầu xoá tài khoản: khách nhập mã 6 số gửi về email. Tài khoản bị ẩn danh hoá (không xoá cứng) — đơn hàng, đánh giá, giao dịch ví vẫn giữ cho kế toán. Sau khi xoá, không đăng nhập lại được. Tài khoản admin / CTV không tự xoá được.
3.2 Bảng giá & mã giảm giá
- Bảng giá lấy trực tiếp từ cấu hình Gói cước (mục 5.3). Gói bị admin tắt sẽ biến mất và không mua được.
- Mã giảm giá có thể ràng buộc: đơn tối thiểu, chỉ đơn đầu tiên. Mã sai / hết hạn / chưa đạt điều kiện → báo lỗi, không làm hỏng trang.
3.3 Thanh toán mua gói
| Cách trả | Cơ chế | Lưu ý CSKH |
|---|---|---|
| MoMo | Trang MoMo (QR + ví + deeplink). Nhận kết quả qua IPN, và hệ thống tự hỏi lại MoMo khi khách quay về + tự đối soát mỗi 5 phút. | Đóng tab giữa chừng: không bị trừ oan, đơn ở trạng thái chờ, tự kích hoạt khi đối soát hoặc khách bấm lại. |
| Chuyển khoản (VietQR / Pay2S) | QR có logo VietQR, đủ số tài khoản + nội dung. Hệ thống nhận webhook và giao tài khoản trong ~15 giây. | Phải chuyển đúng số tiền + đúng nội dung. Sai nội dung → không tự khớp, cần đối soát tay (mục 6.7). |
| Ví PhimFlix | Trả 100% bằng ví → xong ngay. Trả một phần bằng ví → phần còn lại qua cổng, tổng tiền khớp. | Order.totalAmount = giá cuối sau giảm; walletDeducted = phần trừ từ ví. |
Nếu lúc kích hoạt đơn mà kho hết profile trống đúng nhóm gói → đơn chuyển FAILED (mã OUT_OF_INVENTORY) và bắn cảnh báo. INVENTORY phải bổ sung kho rồi kích hoạt lại thủ công. Xem playbook 7.5.
3.4 Ví tiền & nạp tiền
- Nạp qua MoMo / VietQR. Có mức tối thiểu / tối đa — nhập ngoài khoảng thì khoá nút.
- Lệnh nạp không thanh toán trong 15 phút → tự chuyển “Đã huỷ (quá hạn)”. Nếu tiền về muộn vẫn được cộng lại.
- Màu & nhãn trạng thái: Đang xử lý = cam · Thành công = xanh lá · Thưởng = xanh dương.
- Loại giao dịch:
DEPOSIT(nạp) ·PURCHASE(mua, số âm) ·REFUND(hoàn) ·REWARD(thưởng).
3.5 Gói của tôi & lấy mã Netflix
- Danh sách gói + lọc theo tab. Mở rộng thẻ để xem email Netflix, tên profile, PIN, ngày hết hạn.
- Lấy mã OTP đăng nhập Netflix (Request Gate): khách bấm “Lấy mã” → hệ thống khoá (mỗi tài khoản chỉ 1 yêu cầu chờ tại một thời điểm) → khi khách đăng nhập Netflix, Netflix gửi email mã → hệ thống đọc qua Gmail API + bóc tách → trả mã 6 số. Khách đóng modal mà chưa lấy được → khoá tự nhả.
- Xác nhận hộ gia đình (Smart TV): tab riêng. Khách gửi yêu cầu → nhận link xác nhận từ Netflix.
- Lịch sử yêu cầu: xem lại thời gian / loại / trạng thái các lần lấy mã.
- Yêu cầu đổi tài khoản: khách gửi kèm lý do → tự tạo ticket hỗ trợ (playbook 7.3 / SOP-8).
- Gia hạn gói: cộng thêm số ngày của gói, KHÔNG đổi tài khoản Netflix khách đang dùng.
3.6 Đánh giá & chương trình thưởng
- Khách gửi đánh giá — có bộ đếm ký tự và ngưỡng thưởng hiển thị theo cấu hình.
- Đánh giá “sạch” được đăng ngay. Đánh giá có link / số điện thoại / từ khoá cấm → vào hàng chờ duyệt.
- Sau thời gian giữ, thưởng cộng vào ví khách + gửi thông báo & email. Số tiền thưởng tính trên giá trị đơn sau khi trừ mã giảm.
3.7 Live chat, thông báo
- Live chat (khung “Cần hỗ trợ” góc dưới phải) — tự xây, có AI chatbot. CSKH trực và trả lời các hội thoại vượt khả năng bot.
- Trung tâm thông báo — lọc theo nhóm, đánh dấu đã đọc / tất cả.
- Web push — khách bật trong Cài đặt, nhận thông báo khi có mã OTP hoặc giao dịch (iOS cần cài PWA vào màn hình chính).
4 Tính năng phía CTV
CTV là “người thứ 6” trên tài khoản Netflix — đi qua đúng cơ chế Request Gate như khách.
- Bảng điều khiển CTV: hồ sơ nhận tiền (mã hoá), danh sách tài khoản đang quản lý, lịch sử hoàn tiền.
- Xác nhận đã thanh toán Netflix: CTV tải ảnh bill + gửi → chờ Admin duyệt (SOP-3) → được hoàn tiền theo chu kỳ.
- Lấy mã / xác nhận hộ gia đình cho CTV: 2 tab (mã đăng nhập / hộ gia đình); hiển thị danh sách PIN các profile của CTV.
Mỗi tài khoản Netflix chỉ gắn một CTV đang hoạt động. Muốn chuyển sang CTV khác phải qua thao tác “Đổi CTV A → B” có xác nhận (mục 5.2). Cộng tác đã kết thúc không còn hiển thị như đang gắn.
5 Tính năng phía Admin
5.1 Đơn hàng & đối soát INVENTORY ACCOUNTANT (xem)
- Danh sách đơn: lọc theo trạng thái / ngày / từ khoá, xem chi tiết, xuất Excel.
- Đối soát MoMo: với đơn đã trả tiền thật nhưng còn “chờ”, mở chi tiết đơn → bấm “Đối soát MoMo”. Ngoài ra có bộ quét tự động mỗi 5 phút cho đơn/nạp ví MoMo tuổi 3 phút – 6 giờ.
- Đơn qua cổng khác (Pay2S/Stripe/…) treo > 30 phút → hệ thống cảnh báo để đối soát thủ công.
5.2 Kho tài khoản Netflix INVENTORY
- Thẻ tài khoản: ruy-băng chéo tình trạng góc trên trái, tag Nguồn CTV / SELF, dòng “Còn trống X/Y”, email Netflix đầy đủ.
- Thêm tài khoản: nhập thông tin, chọn Nguồn = SELF hoặc CTV; nếu CTV thì chọn CTV cụ thể (tự tạo cộng tác).
- Import hàng loạt: theo cú pháp có giải thích sẵn; tự tạo
Usernếu email chưa tồn tại. - Xem chi tiết → Chỉnh sửa: mở ở chế độ xem (khoá sửa), có dòng “Nguồn: CTV [tên] / SELF” và tình trạng tô màu. Bấm “Chỉnh sửa” mới sửa được.
- Đổi CTV A → B: hộp thoại xác nhận rõ. Xác nhận xong: kết thúc cộng tác cũ, tạo cộng tác mới.
- Gia hạn tài khoản + ghi giá vốn: modal gia hạn có ô “Số tiền trả Netflix chu kỳ này” → nhập vào tạo một dòng giá vốn (mục 5.5).
5.3 Gói cước · Khuyến mãi · Đánh giá · Cổng thanh toán SUPER
- Gói cước: tạo / sửa / bật / tắt. Gói tắt biến mất khỏi bảng giá khách.
- Mã giảm giá: tạo (điều kiện đơn tối thiểu, đơn đầu tiên), sửa, tắt.
- Duyệt đánh giá & thưởng SUPPORT: duyệt / từ chối đánh giá, duyệt / trả / từ chối thưởng, trả lời đánh giá. Trả thưởng = cộng ví khách.
- Auto-duyệt đánh giá: có tuỳ chọn “Tất cả (1–5★)” — vẫn chặn nếu chứa link / số điện thoại / từ khoá cấm.
- Cổng thanh toán: 5 tab (MoMo, Pay2S, VTCPay, Alepay, Stripe). Mỗi cổng có công tắc + nút Lưu riêng; khoá bí mật hiển thị dạng ẩn; nút “Kiểm tra kết nối” gọi thật.
- Mẫu email: sửa nội dung, gửi thử.
5.4 Thông báo vận hành & nội dung
- Định tuyến Telegram: 4 ô Chat ID theo nhóm (Đơn hàng / Cảnh báo / Hỗ trợ / CTV). Nhập dạng
chatIdhoặcchatId:threadId. Ô trống → tin loại đó về nhóm mặc định. Có nút kiểm tra bắn tin thật. - Blog / Hướng dẫn: thêm / sửa / xoá. Nội dung soạn trên Airtable (Blog · Guide · FAQ · Kịch bản CSKH) rồi bấm “Kéo từ Airtable”. FAQ & kịch bản CSKH đã xuất bản được trợ lý AI dùng để trả lời.
5.5 Tài chính — Lợi nhuận gộp ACCOUNTANT
Admin → Tài chính. Chọn kỳ (tháng này / tháng trước / 30 ngày / tuỳ chọn). Báo cáo: Doanh thu · Giá vốn (tách CTV / SELF) · Chi phí tồn kho nhàn rỗi · Lợi nhuận gộp · biên %.
Chi phí một tài khoản được rải đều theo ngày trong chu kỳ. Mỗi ngày, phần “burn” của tài khoản chia cho số slot bán được trong ngày đó. Ngày bán đủ slot → giá vốn/slot thấp; ngày bán ít → giá vốn/slot cao hơn; ngày không bán được slot nào → khoản đó rơi vào “chi phí tồn kho nhàn rỗi”. Doanh thu cũng phân bổ theo ngày.
- Bảng lãi/lỗ theo từng tài khoản: tài khoản lỗ nặng xếp lên đầu — ưu tiên xem để quyết định tiếp tục hay không.
- Cảnh báo thiếu dữ liệu giá vốn: liệt kê tài khoản có doanh thu nhưng chưa ghi giá vốn. Còn cảnh báo → lợi nhuận đang bị tính cao hơn thực tế. Kế toán phải nhắc Vận hành kho nhập giá vốn khi gia hạn.
5.6 CTV · Người dùng · Hỗ trợ
- Duyệt bill & hoàn tiền CTV INVENTORY: xác minh bill → “Hoàn tiền” (hiện VietQR) → “Xác nhận đã chuyển”. Hệ thống tự: cộng 1 tháng hạn cho tài khoản + thông báo CTV + sinh dòng giá vốn.
- Hồ sơ CTV & tài khoản gắn: chỉ hiện cộng tác đang hoạt động; bấm 1 tài khoản mở được thông tin đầy đủ.
- Ticket hỗ trợ SUPPORT: xem / trả lời / đóng. Loại đặc biệt: “Yêu cầu đổi tài khoản”, “Yêu cầu xoá tài khoản”.
- Người dùng & phân quyền SUPER: tìm người dùng, cấp / thu quyền admin, chỉnh số dư ví (thận trọng — có ghi audit).
- Nhật ký hoạt động (Audit log): ghi lại các thao tác quan trọng — đổi CTV, ghi giá vốn, đổi vai trò admin, khách tự xoá tài khoản… Dùng để truy vết khi có sự cố hoặc tranh chấp.
6 Quy trình nghiệp vụ chuẩn (SOP)
Mỗi quy trình: mục tiêu → các bước (kèm vai trò) → lưu ý. Ký hiệu vai trò: SUPER Vận hành kho Kế toán CSKH
SOP-1 · Xử lý đơn hàng mới
Mục tiêu: khách trả tiền xong nhận được tài khoản trong vài phút, không sót đơn.
- Đơn tự kích hoạt khi cổng thanh toán báo thành công — không cần thao tác tay trong trường hợp bình thường.
- Vận hành kho mỗi ca mở Admin → Đơn hàng, lọc
PENDINGtuổi > 15 phút. Đơn MoMo: bấm “Đối soát MoMo”. Đơn chuyển khoản: đối chiếu sao kê (SOP-7). - Đơn
FAILED / OUT_OF_INVENTORY→ bổ sung kho (SOP-2) rồi kích hoạt lại; báo khách thời gian dự kiến. - Đơn đã
PAID: kiểm tra khách đã nhận email biên nhận + thông tin tài khoản. Chưa nhận → gửi lại từ chi tiết đơn.
Toàn bộ đơn PENDING > 30 phút phải được xử lý hoặc ghi chú trong ca. Không để đơn treo qua đêm.
SOP-2 · Nạp / bổ sung kho tài khoản Netflix
- Vận hành kho xác định nguồn: SELF (công ty vừa mua thẻ) hay CTV (CTV vừa xác nhận bill).
- Admin → Kho tài khoản → “Thêm tài khoản”. Nhập email/mật khẩu Netflix, số slot (Y), chọn Nguồn. Nếu CTV: chọn đúng CTV.
- Tài khoản SELF vừa gia hạn: mở modal gia hạn, nhập “Số tiền trả Netflix chu kỳ này” → tạo dòng giá vốn.
- Kiểm tra thẻ mới hiện “Còn trống Y/Y” và tình trạng xanh (Active).
- Nhiều tài khoản một lúc → dùng Import hàng loạt.
SOP-3 · Duyệt bill & hoàn tiền CTV
- CTV gửi bill gia hạn Netflix qua Cổng CTV → tin về topic CTV trên Telegram.
- Vận hành kho mở Admin → CTV → bill chờ duyệt, đối chiếu: đúng tài khoản, đúng chu kỳ, số tiền hợp lý, ảnh bill rõ.
- Hợp lệ → bấm “Hoàn tiền” (hiện VietQR của CTV) → chuyển khoản → bấm “Xác nhận đã chuyển”.
- Hệ thống tự: cộng 1 tháng hạn cho tài khoản, thông báo CTV, sinh dòng giá vốn
CTV_REFUND. - Bill sai / mờ / nghi ngờ → bấm “Từ chối” kèm lý do; nhắn CTV gửi lại.
Không hoàn tiền khi chưa nhìn thấy bill. Số tiền hoàn bất thường (cao/thấp hơn giá Netflix niêm yết nhiều) → hỏi lại trước khi duyệt.
SOP-4 · Đối soát thanh toán cuối ngày Kế toán
- Cuối ngày mở Admin → Đơn hàng, lọc theo ngày. Đối chiếu tổng doanh thu với báo cáo cổng MoMo và sao kê ngân hàng.
- Chạy kiểm tra toàn vẹn dữ liệu tiền (SOP-11) — không phát sinh dòng lệch mới.
- Đơn
PENDINGcòn sót → chuyển Vận hành kho; đơnFAILED→ xác định lý do. - Ghi nhận chênh lệch (nếu có) vào sổ theo dõi.
SOP-5 · Xử lý ticket hỗ trợ CSKH
- Ticket mới → tin về topic Hỗ trợ. Mở Admin → Hỗ trợ & Khiếu nại.
- Phân loại: Kỹ thuật · Yêu cầu đổi tài khoản · Yêu cầu xoá tài khoản · Thanh toán · Khác.
- Trả lời trong SLA: phản hồi đầu ≤ [điền] phút giờ hành chính; giải quyết ≤ [điền] giờ với vấn đề thường, ≤ [điền] giờ với vấn đề cần đổi tài khoản.
- Vấn đề vượt quyền CSKH (đổi tài khoản, hoàn tiền, lỗi hệ thống) → chuyển đúng bộ phận, ghi chú rõ, không đóng ticket khi chưa xong.
- Xử lý xong → tóm tắt cách giải quyết trong ticket → đóng.
SOP-6 · Duyệt đánh giá & trả thưởng CSKH
- Admin → Đánh giá dịch vụ, xem hàng chờ duyệt.
- Duyệt nếu: đúng khách có đơn thật, nội dung không spam / không chèn link liên hệ ngoài / không xúc phạm.
- Từ chối kèm lý do nếu vi phạm. Nghi nhiều đánh giá từ một người / một mẫu câu → playbook 7.10.
- Thưởng đến hạn trả → kiểm tra rồi bấm trả (cộng ví khách). Từ chối thưởng nếu đánh giá bị gỡ sau đó.
SOP-7 · Đối soát chuyển khoản sai nội dung Vận hành kho
- Khách báo đã chuyển khoản nhưng đơn chưa lên → xin ảnh biên lai + 4 số cuối tài khoản gửi + thời gian chuyển.
- Đối chiếu sao kê ngân hàng công ty: tìm giao dịch đúng số tiền + thời gian.
- Khớp được → mở chi tiết đơn của khách → đối soát / kích hoạt thủ công.
- Không khớp (chuyển nhầm số tài khoản / chưa chuyển) → hướng dẫn khách và ghi ticket.
SOP-8 · Yêu cầu đổi tài khoản CSKH + Vận hành kho
- Ticket “Yêu cầu đổi tài khoản” — xác minh lý do (tài khoản lỗi Netflix, bị đăng xuất liên tục, sai gói…).
- Lý do chính đáng → Vận hành kho cấp 1 profile trống khác cùng nhóm gói, cập nhật thông tin trong gói của khách.
- Ghi rõ tài khoản cũ có vấn đề gì để cách ly / kiểm tra lại.
- Báo khách thông tin mới, đóng ticket.
SOP-9 · Yêu cầu xoá tài khoản khách CSKH
- Khách tự xoá được qua trang Tài khoản (nhập mã email). CSKH chỉ hỗ trợ khi khách gặp trục trặc thao tác.
- Giải thích trước: dữ liệu bị ẩn danh, mất gói đang dùng và số dư ví, không hoàn lại.
- Không tự ý xoá hộ khách trừ khi có yêu cầu bằng văn bản/email từ chính khách. Ghi lại trong ticket.
SOP-10 · Onboard / offboard nhân sự admin SUPER
- Vào: nhân sự tạo tài khoản PhimFlix bằng email công ty → SUPER vào Phân Quyền & Quyền → Thêm nhân sự → nhập email, chọn vai trò tối thiểu đủ việc → xác nhận.
- Bàn giao tài liệu này + kèm 1–2 ca đầu có người hướng dẫn thực tế.
- Ra: ngay ngày cuối làm việc, SUPER bấm “Thu hồi” ở dòng của người đó. Kiểm tra người đó biến mất khỏi danh sách.
- Nghi tài khoản bị lộ: thu hồi + đổi các khoá bí mật liên quan (playbook 7.14).
SOP-11 · Kiểm tra toàn vẹn dữ liệu tiền Kế toán + kỹ thuật
- Định kỳ (hằng tuần) chạy script kiểm tra: mọi đơn
PAIDqua cổng phải cóWalletTransactionloạiPURCHASEkhớp số tiền. - Lệnh:
npx tsx scripts/check-order-wallet-integrity.ts --all(chạy trên máy chủ, trong thư mục backend). - Chỉ quan tâm dòng lệch mới phát sinh (bỏ qua dữ liệu test cũ đã biết). Có dòng lệch mới → dựng lại nguyên nhân với kỹ thuật trước khi backfill.
7 Sổ tay xử lý tình huống (Playbook)
Mỗi thẻ: Dấu hiệu → Chẩn đoán nhanh → Xử lý → Khi nào chuyển cấp. Mức độ: P1 Khẩn P2 Cao P3 Thường
7.1 Khách không nhận được mã OTP Netflix
P2Dấu hiệu
Khách bấm “Lấy mã” nhiều phút không có mã, hoặc mã báo sai.
Chẩn đoán
- Khách đã thực sự thao tác đăng nhập trên Netflix chưa? (mã chỉ về khi Netflix gửi email).
- Xem Lịch sử yêu cầu của khách: yêu cầu đang
PENDINGhay đã hết hạn / bị nhả. - Có cảnh báo đường ống Gmail / DNS trên Telegram không (mục 8)?
Xử lý
- Hướng dẫn khách: mở Netflix → nhập email tài khoản → chọn “Gửi mã đăng nhập qua email” → rồi mới bấm “Lấy mã” trên PhimFlix.
- Vẫn không có sau ~5 phút: yêu cầu khách đóng modal (nhả khoá) rồi thử lại.
- Vẫn lỗi: Vận hành kho kiểm tra tài khoản gốc còn đăng nhập được không; nếu bị đổi mật khẩu → xử lý như 7.3.
Chuyển cấp
Nhiều khách cùng lỗi một lúc → nghi lỗi đường ống Gmail API → báo kỹ thuật ngay (P1).
7.2 “Đã trả tiền nhưng đơn vẫn chờ”
P2Chẩn đoán
- Trả bằng gì? MoMo → dùng “Đối soát MoMo” ở chi tiết đơn.
- Chuyển khoản → đúng số tiền + đúng nội dung? Sai nội dung → SOP-7.
- Đơn có ở trạng thái
FAILED / OUT_OF_INVENTORYkhông.
Xử lý
- MoMo: mở đơn → “Đối soát MoMo”. MoMo xác nhận đã trả → đơn tự kích hoạt.
- Chuyển khoản đúng nội dung nhưng chưa lên sau 15 phút → đối chiếu sao kê, kích hoạt tay.
- Hết slot → bổ sung kho (SOP-2) rồi kích hoạt; báo khách thời gian.
Chuyển cấp
MoMo xác nhận đã trả nhưng hệ thống vẫn không kích hoạt → kỹ thuật (P1, nguy cơ lệch tiền).
7.3 Tài khoản Netflix bị đăng xuất / đổi mật khẩu
P1Dấu hiệu
Nhiều khách trên cùng một tài khoản gốc báo không vào được / bị hỏi đổi mật khẩu.
Xử lý
- Vận hành kho khoá tài khoản gốc đó lại (không cấp thêm), đánh dấu tình trạng lỗi trong Kho.
- Xác định nguyên nhân: CTV tự đổi mật khẩu? Netflix bắt xác minh? Bị lộ?
- Chuyển toàn bộ khách đang trên tài khoản đó sang profile trống ở tài khoản khác cùng nhóm (SOP-8).
- Liên hệ CTV (nếu nguồn CTV) để khôi phục hoặc chấm dứt cộng tác.
- CSKH chủ động nhắn các khách bị ảnh hưởng kèm thông tin mới + lời xin lỗi.
Chuyển cấp
Ảnh hưởng > 5 khách → báo ban điều hành, cân nhắc thông báo sự cố.
7.4 “Gói đã hết hạn nhưng vẫn còn ngày” / ngược lại
P3Chẩn đoán
So ngày hết hạn trong Gói của tôi với ngày mua + thời hạn gói. Kiểm tra có lần gia hạn nào chưa cộng ngày.
Xử lý
- Do gia hạn chưa cộng ngày (đơn gia hạn
PENDING): đối soát đơn đó trước. - Sai lệch thật do lỗi: Vận hành kho chỉnh ngày hết hạn của gói cho đúng, ghi chú lý do.
7.5 Kho hết slot khi có đơn (OUT_OF_INVENTORY)
P2Dấu hiệu
Đơn chuyển FAILED, cảnh báo “hết slot nhóm X” về topic Cảnh báo.
Xử lý
- Vận hành kho bổ sung tài khoản nhóm đó (SOP-2) — ưu tiên nguồn SELF cho nhanh.
- Mở lại đơn
FAILED→ kích hoạt thủ công. - Báo khách thời gian giao (mục tiêu < 30 phút).
- Sau sự cố: rà lại ngưỡng cảnh báo tồn kho, đặt mức tồn tối thiểu cho từng nhóm.
7.6 Cảnh báo Telegram “🔴 LỖI HỆ THỐNG”
P1Là gì
Hệ thống giám sát tự bắn khi có lỗi máy chủ (5xx / lỗi không bắt được) hoặc lỗi runtime phía web của khách. Có kèm loại lỗi, nơi xảy ra, và stack rút gọn.
Xử lý
- Người trực kỹ thuật đọc nội dung cảnh báo (loại lỗi, route, số lần).
- Lỗi lặp lại nhiều / ảnh hưởng luồng mua–thanh toán–lấy mã → xử lý ngay, cân nhắc rollback (mục 9.2).
- Lỗi lẻ tẻ, không ảnh hưởng khách → ghi nhận, xử lý trong ngày.
- Nếu đã bật Sentry: mở Sentry xem chi tiết & tần suất.
Lưu ý
Cảnh báo có chống lặp 15 phút mỗi loại lỗi và trần 15 cảnh báo / 5 phút — im lặng không có nghĩa là hết lỗi, xem log đầy đủ.
7.7 Cảnh báo “DNS ra ngoài KHÔNG ổn định”
P1Là gì
Máy chủ không phân giải được tên miền ra ngoài (Telegram / Google). Ảnh hưởng: gửi mail, lấy OTP Netflix, đăng nhập Google có thể lỗi.
Xử lý
- Hệ thống tự chuyển sang máy chủ DNS công cộng sau 3 lần lỗi liên tiếp — theo dõi xem có tin “DNS đã phục hồi” không.
- Kỹ thuật kiểm tra
systemctl status systemd-resolvedvà mụcFallbackDNStrong/etc/systemd/resolved.conf. - Khởi động lại
systemd-resolvednếu cần.
7.8 Cảnh báo “đơn cổng khác treo > 30 phút”
P2Là gì
Có đơn Pay2S / Stripe / VTCPay / Alepay ở trạng thái “chờ” quá lâu — thường do bỏ lỡ webhook.
Xử lý
- Vận hành kho mở Đơn hàng, lọc
PENDINGtheo các cổng đó. - Đối chiếu với cổng thanh toán / sao kê. Trả tiền thật → kích hoạt tay.
- Chưa trả → để nguyên, đơn sẽ tự hết hạn.
7.9 CTV báo “đã gia hạn nhưng chưa được hoàn tiền”
P3Xử lý
- Kiểm tra CTV đã gửi bill qua Cổng CTV chưa (nhiều CTV quên bước này).
- Đã gửi → xử lý theo SOP-3, ưu tiên các bill chờ quá 48 giờ.
- Bill bị từ chối trước đó → nhắc CTV gửi lại đúng yêu cầu.
7.10 Nghi gian lận đánh giá / lạm dụng mã giảm giá
P2Dấu hiệu
Nhiều đánh giá cùng mẫu câu / cùng khoảng thời gian; một người tạo nhiều tài khoản để lấy mã “đơn đầu tiên”.
Xử lý
- CSKH tạm không duyệt các đánh giá nghi ngờ, đánh dấu để rà.
- Đối chiếu email / số điện thoại / thiết bị (qua Audit log & danh sách người dùng).
- Xác nhận lạm dụng → từ chối thưởng, khoá mã giảm nếu cần, báo ban điều hành.
- Rà lại điều kiện mã giảm (đơn tối thiểu, đơn đầu tiên) cho chặt hơn.
7.11 Data tiền lệch (đơn PAID thiếu giao dịch ví)
P2Xử lý
- Kỹ thuật chạy
scripts/check-order-wallet-integrity.ts --alltrên máy chủ. - Phân biệt dữ liệu test cũ (ref
TEST_..., giao dịch nhỏ trước ngày vá) — bỏ qua. - Lệch mới → dựng lại nguyên nhân (thiếu idempotency callback?), sau đó backfill bằng script riêng có rà từng dòng.
7.12 Cần rollback bản deploy
P1Khi nào
Sau khi deploy, healthcheck fail hoặc lỗi hàng loạt ở luồng chính.
Xử lý
- Script deploy tự rollback nếu healthcheck fail — kiểm tra log deploy xác nhận đã quay lui.
- Bản mới đã lên nhưng phát hiện lỗi sau đó:
git revertcommit lỗi trên nhánhmain→ push → chạy lạideploy.sh api/deploy.sh web. - Thông báo đội, theo dõi cảnh báo & healthcheck 30 phút sau.
7.13 Khách yêu cầu hoàn tiền
P3Xử lý
- CSKH xác định lý do & đối chiếu chính sách hoàn tiền.
- Đủ điều kiện → chuyển Kế toán duyệt. Hoàn về ví PhimFlix của khách (nhanh, có dấu vết) hoặc chuyển khoản nếu khách yêu cầu.
- Ghi rõ trong ticket + Audit: số tiền, lý do, người duyệt.
Lưu ý
Chưa có nút “hoàn tiền đơn” tự động — thao tác qua điều chỉnh số dư ví (SUPER) hoặc chuyển khoản tay, luôn ghi chú.
7.14 Nghi tài khoản admin bị lộ / nhân sự nghỉ đột xuất
P1Xử lý
- SUPER vào Phân Quyền → “Thu hồi” ngay tài khoản đó.
- Đổi các khoá bí mật mà người đó có thể biết: khoá ký JWT, khoá cổng thanh toán, token Telegram / Airtable, mật khẩu máy chủ, mật mã công cụ QA.
- Rà Audit log các thao tác của người đó 30 ngày gần nhất.
- Đổi mật khẩu tài khoản Google dùng cho Gmail API nếu liên quan.
8 Cảnh báo hệ thống & cách phản ứng
Thông báo Telegram được định tuyến theo 4 nhóm. Ai trực nhóm nào, phản ứng ra sao.
| Nhóm / topic | Loại tin | Người trực | Phản ứng |
|---|---|---|---|
| Đơn hàng | Đơn mới, đơn đã thanh toán, đối soát tự động kích hoạt đơn | Vận hành kho | Theo dõi luồng bình thường; đối chiếu cuối ca. |
| Cảnh báo | 🔴 Lỗi hệ thống · DNS không ổn định · hết slot kho · tài khoản Netflix sắp hết hạn · đơn cổng khác treo | Kỹ thuật + Vận hành kho | Theo playbook 7.5–7.8. Lỗi hệ thống / DNS = P1. |
| Hỗ trợ | Ticket mới, ticket khách phản hồi | CSKH | SOP-5. Không để ticket quá SLA. |
| CTV | CTV gửi bill, CTV xác nhận thanh toán Netflix | Vận hành kho | SOP-3. Ưu tiên bill chờ > 48 giờ. |
Chat ID từng nhóm khai ở Admin → Cài đặt → Telegram, dạng chatId hoặc chatId:threadId. Ô trống → tin về nhóm mặc định. Đổi nhóm/topic → bấm nút kiểm tra để chắc chắn tin về đúng chỗ.
9 Vận hành kỹ thuật
9.1 Deploy
SSH vào máy chủ rồi chạy:
bash ~/scripts/deploy.sh api— backend (migrate CSDL → build → khởi động lại PM2 → healthcheck → tự rollback nếu fail).bash ~/scripts/deploy.sh web— frontend.
Deploy tự lấy code mới nhất từ nhánh main. Commit & push trước, rồi mới deploy.
9.2 Rollback
Xem playbook 7.12. Tóm tắt: healthcheck fail → tự rollback; lỗi phát hiện sau → git revert + push + deploy lại.
9.3 Tiến trình chạy nền (scheduler)
| Tiến trình | Chu kỳ | Việc |
|---|---|---|
| Đối soát MoMo tự động | 5 phút | Kích hoạt đơn/nạp ví MoMo còn “chờ” (tuổi 3′–6h) + cảnh báo đơn cổng khác treo. |
| Huỷ lệnh nạp ví quá hạn | 5 phút | Lệnh nạp PENDING > 15 phút → FAILED. |
| Giám sát DNS ra ngoài | 5 phút | Phân giải Telegram / Google; lỗi liên tục → đổi DNS + cảnh báo. |
| Trả thưởng đánh giá | 6 giờ | Đến hạn giữ → cộng ví + email. |
| Nhắc gia hạn (đơn khách + tài khoản CTV) | hằng ngày | Gói / tài khoản sắp hết hạn → nhắc. |
| Quét hết hạn profile | định kỳ | Profile hết hạn → thu hồi, trả slot về kho. |
| Gia hạn Gmail watch | định kỳ | Giữ đường ống đọc email OTP luôn sống. |
9.4 Script kiểm tra
npx tsx scripts/check-order-wallet-integrity.ts --all— đối chiếu đơn ↔ giao dịch ví (SOP-11).
9.5 Biến môi trường quan trọng (backend .env)
| Biến | Ý nghĩa |
|---|---|
QA_DEV_TOOLS | Phải bỏ / đặt khác “on” khi vận hành thật. “on” = mở công cụ QA /qa-dev. |
RBAC_ENFORCE | Mặc định “on”. “off” = tắt phân quyền chi tiết (chỉ dùng khi gỡ rối). |
MOMO_RECONCILE_SWEEP | Mặc định “on”. Bộ quét đối soát MoMo tự động. |
OUTBOUND_HEALTHCHECK | Mặc định “on”. Giám sát DNS ra ngoài. |
SENTRY_DSN | Có → đẩy lỗi lên Sentry. Trống → chỉ cảnh báo Telegram (vẫn đủ dùng). |
9.6 Sao lưu
CSDL được sao lưu định kỳ trên máy chủ. Cần diễn tập phục hồi định kỳ để chắc chắn file backup đọc được. Giữ tối thiểu 7 bản gần nhất.
10 Phụ lục
10.1 Bảng trạng thái
| Nhóm | Giá trị | Nghĩa |
|---|---|---|
| Đơn hàng | PENDING | Chờ thanh toán / chờ xử lý. |
PAID | Đã thanh toán & đã cấp tài khoản. | |
FAILED | Lỗi khi kích hoạt (thường do hết slot) — cần admin. | |
| Giao dịch ví | PENDING | Đang chờ cổng xác nhận. |
SUCCESS | Thành công. | |
FAILED | Thất bại / quá hạn. | |
| Loại giao dịch ví | DEPOSIT | Nạp tiền. |
PURCHASE | Mua gói (số âm). | |
REFUND | Hoàn tiền. | |
REWARD | Thưởng đánh giá. | |
| Gói của khách | PENDING | Chưa kích hoạt. |
ACTIVE | Đang dùng. | |
EXPIRED | Hết hạn. | |
CANCELLED | Đã huỷ. | |
| Nguồn tài khoản | SELF | Công ty tự mua/gia hạn. |
CTV | Cộng tác viên góp. |
10.2 Thuật ngữ
| Slot / Profile | Một “chỗ” trên tài khoản Netflix gốc, bán cho một khách. |
| Request Gate | Cơ chế khoá: mỗi tài khoản chỉ 1 yêu cầu lấy mã đang chờ tại một thời điểm. |
| Giá vốn (COGS) | Tiền công ty bỏ ra cho tài khoản: mua/gia hạn Netflix (SELF) + hoàn tiền CTV. |
| Chi phí tồn kho nhàn rỗi | Phần giá vốn của những ngày không bán được slot nào. |
| Đối soát | Kiểm tra khớp giữa tiền thực nhận (cổng / ngân hàng) và trạng thái đơn trên hệ thống. |
| Household verification | Xác nhận “hộ gia đình” của Netflix khi đăng nhập trên Smart TV. |
Các số SLA trong [điền] ở SOP-5 phải được ban điều hành chốt cụ thể trước khi phát tài liệu cho đội. Checklist go-live được quản lý riêng, không nằm trong tài liệu này.