- Given Đang mở hồ sơ học viên hoặc màn hình Việc của đội
- When Chọn "+ Giao việc", nhập tiêu đề, người nhận (một hoặc nhiều), hạn, mức ưu tiên, mô tả và checklist tuỳ chọn
- Then Công việc được tạo ở trạng thái Mới, gắn với học viên; mỗi người nhận nhận thông báo trong ứng dụng và thông báo đẩy trong vòng 1 phút; công việc xuất hiện trong Việc của tôi của người nhận và trong tab Công việc của hồ sơ học viên.
PRD 16 · Công việc nội bộ, nhắc nhở và đơn xin nghỉ
Một thực thể công việc dùng chung cho mọi nhân sự, gắn được với khách hàng, học viên, lớp học, buổi học, hoá đơn hoặc sự cố; công việc lặp cho thủ tục vận hành; công việc do hệ thống sinh ra có quy tắc khử trùng lặp; trung tâm thông báo và bản tổng hợp 08:00; đơn xin nghỉ của nhân sự và giáo viên có phê duyệt theo chi nhánh; báo cáo sự cố từ ứng dụng giáo viên. Hiện tại backend chỉ có công việc theo dõi gắn với khách hàng và các endpoint thông báo cá nhân.
Xuất xứ / Prompt / Giới hạn
Tài liệu do trợ lý AI soạn trong một phiên làm việc ngày 16/09/2026, mở rộng bộ PRD theo yêu cầu gốc được trích nguyên văn ở trang mục lục. Đây là bản đề xuất để đội thảo luận, chưa phải quyết định của đội sản phẩm.
Nguồn
- Nghiên cứu công khai về đối thủ cạnh tranh (PSE ONE, pse4.one), mã nguồn
center-crm-frontendvà đặc tả OpenAPI/v3trên staging (182 endpoint), tính đến ngày 10/09/2026. - Nhãn existing / extend / new trong trang được xác định bằng cách đối chiếu với đặc tả
/v3trên staging tại thời điểm trên. - Đợt quét thứ hai các nguồn công khai của PSE ONE ngày 16/09/2026 (trang tính năng, bảng phí dịch vụ, mục hướng dẫn sử dụng).
- Tham chiếu đối thủ cạnh tranh (pse4.one, khảo sát công khai ngày 16/09/2026): bảng giá liệt kê giao việc, thông báo, đơn xin nghỉ và nhắc lịch tự động trong mọi gói; tiếp thị nhấn mạnh "thông báo và nhắc nhở thông minh" trong ứng dụng di động; ứng dụng giáo viên có báo cáo sự cố. Việc các tính năng này có mặt ở gói thấp nhất cho thấy khách hàng xem chúng là nền tảng.
Giới hạn
- Cần xác minh khi khảo sát trực tiếp trong ứng dụng, vì đăng nhập tự động vào sản phẩm tham chiếu chưa được cấp phép trong phiên soạn:
- Công việc của đối thủ có gắn được với học viên, lớp học hoặc hoá đơn hay chỉ là danh sách việc rời; có checklist và bình luận không.
- Đối thủ có công việc lặp và công việc do hệ thống tự sinh không, và cách xử lý trùng lặp khi cùng một điều kiện lặp lại.
- Đơn xin nghỉ của đối thủ dành cho nhân sự, học viên hay cả hai; các loại nghỉ; ai duyệt; đơn được duyệt có tự đánh dấu buổi học cần dạy thay không.
- "Thông báo và nhắc nhở thông minh" của đối thủ gồm những loại nào, có bản tổng hợp hằng ngày và giờ yên tĩnh không; báo cáo sự cố có ảnh, mức độ và định tuyến đến ai.
Thiết kế đề xuất
Mọi việc vận hành của chi nhánh đi qua một mục Công việc duy nhất với năm tab (Việc của tôi · Việc của đội · Mẫu công việc lặp · Đơn xin nghỉ · Sự cố); điều quan trọng nhất người đọc nên thấy là mỗi dòng công việc luôn ghi rõ nguồn (Giao tay, Lặp, Hệ thống) và đối tượng gắn kèm, còn đơn xin nghỉ và sự cố chỉ là hai cách khác sinh ra công việc cho cùng danh sách đó.


session_unmarked đứng đầu. Chạm giữ một dòng mở bottom sheet với đúng ba thao tác trên dòng (Hoàn thành, Hoãn đến ngày mai, Mở chi tiết).








1Mục đích
Phần lớn việc vận hành một trung tâm không thuộc về một mô-đun cụ thể: gọi lại cho phụ huynh, tìm giáo viên dạy thay, chốt quỹ cuối ngày, kiểm kho đầu tuần, sửa máy chiếu hỏng. Hiện tại những việc này nằm trong nhóm Zalo, sổ tay hoặc bảng tính, và không ai biết việc nào đã xong. Mô-đun này đưa vào một thực thể công việc duy nhất mà mọi nhân sự có thể được giao, mọi mô-đun khác có thể tự sinh ra, và mọi người thấy trong một màn hình "Việc của tôi". Cùng cơ chế nhắc nhở và thông báo đó phục vụ đơn xin nghỉ của nhân sự và báo cáo sự cố từ lớp học.
Trong phạm vi
- Công việc chung: giao cho một hoặc nhiều nhân sự, gắn tuỳ chọn với khách hàng, học viên, lớp học, buổi học, hoá đơn hoặc sự cố; checklist, đính kèm, bình luận, mức ưu tiên, hạn, năm trạng thái.
- Công việc lặp hằng ngày hoặc hằng tuần (chốt quỹ, kiểm kho); công việc do hệ thống sinh ra từ mô-đun khác (khách hàng nguội, học viên vắng ba buổi, công nợ quá hạn, buổi chưa điểm danh, cần dạy thay) với quy tắc khử trùng lặp.
- Nhắc nhở theo công việc, bản tổng hợp 08:00, trung tâm thông báo trong ứng dụng (endpoint hiện có), thông báo đẩy qua ứng dụng di động (PRD 17) và email.
- Đơn xin nghỉ của nhân sự và giáo viên có phê duyệt theo chi nhánh; buổi học bị ảnh hưởng được gắn cờ dạy thay (PRD 03) và loại khỏi bảng công (PRD 06).
- Báo cáo sự cố từ ứng dụng giáo viên, định tuyến đến quản lý chi nhánh; màn hình "Việc của tôi" và "Việc của đội".
Ngoài phạm vi
- Nhắc lịch học, nhắc học phí và mọi thông báo gửi phụ huynh: đã đặc tả ở PRD 07.
- Trò chuyện nội bộ theo thời gian thực; quản lý dự án; số dư phép năm theo luật lao động (mô-đun chỉ đếm số ngày đã nghỉ theo loại).
- Xin phép nghỉ và bảo lưu của học viên (PRD 02, PRD 04); sự cố kỹ thuật của hệ thống Trường Số (PRD 12).
2Hiện trạng
| Năng lực hiện có | Endpoint | Giữ lại? |
|---|---|---|
| Việc hôm nay: công việc, cuộc gọi, cuộc hẹn gắn với khách hàng, widget trên Tổng quan | GET /v3/crm/me/today-plan | existing giữ; nguồn dữ liệu mở rộng sang thực thể công việc mới |
| Công việc theo dõi khách hàng: một loại tương tác (Task) trong timeline, có hạn, người được giao, trạng thái | GET /v3/crm/customers/{id}/interactions | extend di trú tương tác loại Task thành công việc gắn khách hàng |
| Trung tâm thông báo cá nhân: danh sách, số chưa đọc, đã đọc, đọc tất cả, lưu trữ | GET /v3/crm/me/notifications, GET .../unread-count, POST .../{id}/read, POST .../read-all, POST .../{id}/archive | existing giữ; thêm loại thông báo mới, không đổi hợp đồng |
| Nhắc lịch buổi học gửi phụ huynh và xem trước giờ gửi | POST /v3/teacher/class-schedules/{id}/remind, POST /v3/teacher/class-schedules/preview-remind-time | existing thuộc PRD 07; không thay đổi |
| Công việc dùng chung, công việc lặp, công việc hệ thống sinh, đơn xin nghỉ, báo cáo sự cố | không có | new |
Quyết định đề xuất: tách công việc khỏi tương tác khách hàng. Tương tác loại Task được di trú một lần thành task với source = migrated và linked_type = customer, giữ người được giao và hạn; tương tác chỉ còn cuộc gọi, cuộc họp và ghi chú; timeline khách hàng đọc thêm từ bảng công việc.
3User story và tiêu chí chấp nhận
- Given Một công việc có checklist ba mục và cờ "cần xác nhận" đang bật
- When Người nhận đánh dấu các mục checklist, đính kèm ảnh và chọn "Hoàn thành"
- Then Trạng thái chuyển sang Chờ xác nhận và người giao được thông báo; người giao chọn "Xác nhận" để chuyển sang Hoàn thành hoặc "Trả lại" kèm bình luận để quay về Đang làm; khi cờ tắt, "Hoàn thành" chuyển thẳng sang Hoàn thành.
- Given Một mẫu công việc lặp "Chốt quỹ chi nhánh": hằng ngày trừ Chủ nhật, giờ sinh 16:00, hạn 18:00, người nhận là vai trò kế toán tại chi nhánh
- When Đến giờ sinh
- Then Một công việc mới được tạo cho từng chi nhánh đang hoạt động và gán cho nhân sự giữ vai trò kế toán tại đó; nếu công việc kỳ trước chưa hoàn thành, công việc mới vẫn được tạo và công việc cũ hiển thị quá hạn; mẫu có thể tạm dừng, và sửa mẫu chỉ ảnh hưởng các lần sinh sau.
- Given Học viên đã có công việc mở "Liên hệ phụ huynh: vắng 3 buổi" do PRD 04 kích hoạt
- When Học viên vắng thêm buổi thứ tư trước khi công việc hoàn thành
- Then Không có công việc mới; công việc hiện có nhận bình luận hệ thống "Vắng thêm buổi ngày dd/MM, tổng 4 buổi", mức ưu tiên tăng một bậc và người nhận được nhắc lại; nếu công việc đã hoàn thành trong 7 ngày gần nhất cũng không sinh mới.
- Given Người dùng có 2 việc quá hạn, 3 việc đến hạn hôm nay, 1 việc chờ xác nhận và 1 đơn xin nghỉ chờ duyệt
- When Đồng hồ điểm 08:00 theo múi giờ của trung tâm
- Then Một thông báo tổng hợp duy nhất được tạo trong trung tâm thông báo và gửi đẩy, liệt kê bốn nhóm kèm số lượng và ba mục đầu mỗi nhóm; email tổng hợp gửi nếu người dùng bật; nhắc nhở riêng theo công việc (mặc định 09:00 ngày hạn) vẫn hoạt động độc lập; chọn một thông báo sẽ đánh dấu đã đọc qua endpoint hiện có và mở đúng công việc.
- Given Giáo viên mở Đơn xin nghỉ trong ứng dụng di động
- When Chọn loại Nghỉ phép, khoảng ngày, lý do và gửi
- Then Hệ thống liệt kê các buổi học giáo viên là giáo viên chính hoặc dạy thay trong khoảng đó trước khi gửi; đơn được tạo ở trạng thái Chờ duyệt, người duyệt là quản lý chi nhánh chính của giáo viên và được thông báo; giáo viên huỷ được đơn khi còn Chờ duyệt.
- Given Một đơn Chờ duyệt có 4 buổi học bị ảnh hưởng
- When Người duyệt chọn "Duyệt" kèm ghi chú tuỳ chọn
- Then Đơn chuyển sang Đã duyệt; mỗi buổi bị ảnh hưởng được gắn cờ "Cần dạy thay" (PRD 03) và một công việc "Phân công dạy thay: [lớp] [ngày]" được tạo cho giáo vụ chi nhánh; các buổi trong khoảng nghỉ không vào bảng công của giáo viên nghỉ (PRD 06); giáo viên nhận thông báo kết quả; khi "Từ chối", lý do là bắt buộc và buổi học không thay đổi.
- Given Giáo viên đang trong buổi học và mở "Báo cáo sự cố" từ màn hình buổi học
- When Chọn loại Cơ sở vật chất, mức độ Trung bình, chụp hai ảnh, nhập mô tả ngắn và gửi
- Then Sự cố được tạo với chi nhánh, phòng học và buổi học điền sẵn; một công việc "Xử lý sự cố: [tiêu đề]" được tạo cho quản lý chi nhánh với mức ưu tiên tương ứng; sự cố mức Nghiêm trọng gửi đẩy ngay cho quản lý chi nhánh và chủ trung tâm; giáo viên theo dõi trạng thái trong Sự cố của tôi.
4Màn hình
Các nhóm theo thứ tự: Quá hạn · Hôm nay · Chờ xác nhận của tôi · Tuần này · Sau đó. Mỗi dòng: ô hoàn thành, tiêu đề, đối tượng gắn kèm (chip có biểu tượng và tên), hạn, mức ưu tiên, nguồn (Giao tay / Lặp / Hệ thống), số bình luận chưa đọc. Bộ lọc: chi nhánh, nguồn, đối tượng. Thao tác trên dòng: Hoàn thành, Hoãn đến ngày mai, Mở chi tiết. Trạng thái rỗng: "Không có việc nào đến hạn. Việc được giao và việc hệ thống sinh ra sẽ xuất hiện tại đây." Trên di động, thanh tab của giáo viên có thêm mục Việc.
Bảng: tiêu đề, người nhận, người giao, đối tượng gắn kèm, hạn, mức ưu tiên, trạng thái, nguồn, cập nhật gần nhất. Bộ lọc: chi nhánh, người nhận, trạng thái, mức ưu tiên, nguồn, quá hạn. Cột bên: tóm tắt theo nhân sự (mở, quá hạn, hoàn thành 7 ngày). Chọn nhiều dòng: Giao lại, Đổi hạn, Đóng kèm lý do. Trang mẫu công việc lặp: tên, chu kỳ (hằng ngày, ngày làm việc, hằng tuần vào thứ N), giờ sinh, hạn sau bao lâu, người nhận (nhân sự hoặc vai trò tại chi nhánh), phạm vi chi nhánh, lần sinh gần nhất, Đang chạy / Tạm dừng; tenant mới có sẵn ba mẫu gợi ý: Chốt quỹ (hằng ngày), Kiểm kho (thứ Hai), Xác nhận lịch tuần tới (thứ Sáu). Trạng thái rỗng: "Chi nhánh chưa có công việc nào. Tạo mẫu công việc lặp để bắt đầu."
Phần đầu: tiêu đề sửa tại chỗ, nguồn, mức ưu tiên, hạn, bộ chọn trạng thái, người nhận. Phần thân: đối tượng gắn kèm (liên kết mở đúng hồ sơ), mô tả, checklist, đính kèm, nhắc nhở (mặc định 09:00 ngày hạn, nút + Nhắc). Bình luận là dòng thời gian gồm bình luận người dùng (có @tên để nhắc) và bình luận hệ thống (đổi trạng thái, giao lại, leo thang); nhật ký xem qua liên kết "Lịch sử". Thanh thao tác cố định: Hoàn thành · Giao lại · Huỷ.
Hai tab: Đơn của tôi và Chờ tôi duyệt (chỉ với người có quyền duyệt). Bảng: người gửi, loại (Nghỉ phép / Nghỉ ốm / Nghỉ không lương / Đổi ca), từ ngày đến ngày, số ngày, số buổi học bị ảnh hưởng, trạng thái, người duyệt, ngày gửi. Biểu mẫu: loại, khoảng thời gian (cả ngày hoặc sáng/chiều/tối), lý do, đính kèm (giấy khám bệnh); với đổi ca: buổi học và giáo viên nhận ca đề xuất. Trước khi gửi hiển thị danh sách buổi học bị ảnh hưởng. Người duyệt thấy nút Duyệt / Từ chối kèm ô ghi chú. Trạng thái rỗng: "Chưa có đơn xin nghỉ nào."
Desktop: bảng theo chi nhánh với tiêu đề, loại (Cơ sở vật chất / An toàn học viên / Hành vi / Thiết bị / Khác), mức độ (Thấp / Trung bình / Cao / Nghiêm trọng), phòng học, người báo cáo, thời điểm, trạng thái (Mới / Đang xử lý / Đã xử lý / Đóng), công việc liên kết. Di động: một màn hình gồm loại và mức độ (chip lớn), ảnh (tối đa 5, nén phía máy khách), mô tả; chi nhánh, phòng học và buổi học điền sẵn từ ngữ cảnh; gửi được khi offline và đồng bộ sau. Trạng thái rỗng: "Chưa có sự cố nào trong 30 ngày."
Panel mở từ biểu tượng chuông, chip lọc: Tất cả · Công việc · Đơn xin nghỉ · Sự cố · Hệ thống. Mỗi mục: biểu tượng loại, tiêu đề, dòng phụ, thời gian tương đối, dấu chưa đọc. Thao tác: chọn để mở, Đọc tất cả, Lưu trữ từng mục; liên kết "Cài đặt thông báo" mở tuỳ chọn kênh theo loại (trong ứng dụng luôn bật; đẩy và email bật tắt được). Trạng thái rỗng: "Không có thông báo mới."
5Quy tắc nghiệp vụ
- Chuyển đổi trạng thái hợp lệ: new → in_progress; in_progress → pending_review (khi cờ cần xác nhận bật) hoặc done; pending_review → done hoặc in_progress; bất kỳ → cancelled kèm lý do. Công việc done hoặc cancelled không mở lại.
- Công việc có ít nhất một người nhận. Với nhiều người nhận, công việc hoàn thành khi bất kỳ ai hoàn thành (mặc định) hoặc khi tất cả hoàn thành (cờ
require_all). Người nhận là nhân sự cụ thể hoặc một vai trò tại một chi nhánh; khi là vai trò, hệ thống gán cho mọi nhân sự đang hoạt động giữ vai trò đó tại thời điểm tạo. - Mức ưu tiên dùng chung thang với lead ở PRD 01. Quá hạn không phải trạng thái mà là điều kiện
due_at < nowtrên công việc chưa done hoặc cancelled. - Công việc lặp sinh theo múi giờ của trung tâm, bỏ qua ngày nghỉ lễ của chi nhánh (PRD 03) khi mẫu bật cờ tương ứng. Cặp (
routine_id,period_key) là duy nhất nên một kỳ không bao giờ sinh hai lần; sửa mẫu chỉ ảnh hưởng các lần sinh sau. - Công việc hệ thống mang
dedupe_key= trigger_code cộng đối tượng gắn kèm. Khi đã có công việc mở cùng dedupe_key, hệ thống không tạo mới mà thêm bình luận hệ thống, tăng một bậc ưu tiên (tối đa urgent) và nhắc lại. Sau khi hoàn thành, dedupe_key được giữ 7 ngày (cấu hình tenant, 0 đến 30) trước khi được sinh lại. - Trigger ở P1 và người nhận mặc định:
lead_cold(không có tương tác 7 ngày; người phụ trách lead),student_absent(ngưỡng theo PRD 04; người chăm sóc học viên tại chi nhánh),invoice_overdue(quá hạn 7 ngày; kế toán chi nhánh),session_unmarked(kết thúc quá 2 giờ; giáo viên của buổi, leo thang lên quản lý chi nhánh sau 24 giờ),substitute_needed(giáo vụ chi nhánh),incident_new(quản lý chi nhánh). Mỗi trigger bật tắt được theo tenant. - Nhắc nhở theo công việc mặc định 09:00 ngày hạn, thêm được tối đa 3 mốc; chỉ gửi cho người nhận của công việc chưa đóng. Bản tổng hợp 08:00 là một thông báo
daily_digestcho mỗi người dùng có ít nhất một mục, được thay thế nếu ngày đó đã có. Thông báo đẩy tuân thủ giờ yên tĩnh 21:30 đến 07:00 (dùng chung cài đặt với PRD 04); thông báo trong ứng dụng không bị giữ và tự lưu trữ sau 90 ngày. - Trung tâm thông báo giữ nguyên hợp đồng endpoint hiện có; loại mới được thêm vào enum
type, payload luôn cóentity_typevàentity_idđể giao diện mở đúng ngữ cảnh. - Người gửi chỉ huỷ đơn xin nghỉ khi pending; người duyệt thu hồi được đơn đã duyệt trước ngày bắt đầu kèm lý do, cờ dạy thay được gỡ nếu chưa phân công. Đơn trùng khoảng với đơn khác của cùng nhân sự bị từ chối khi tạo.
- Người duyệt mặc định là quản lý chi nhánh chính của người gửi (PRD 06); người gửi là quản lý chi nhánh thì người duyệt là chủ trung tâm; tenant đặt được người duyệt thay thế theo chi nhánh. Đơn quá 48 giờ chưa xử lý được leo thang lên chủ trung tâm bằng thông báo; hệ thống không tự duyệt.
- Khi đơn được duyệt, mọi buổi học trong khoảng nghỉ mà người gửi là giáo viên chính hoặc dạy thay được gắn
needs_substitute = true; PRD 03 xử lý phân công; các buổi này không sinh dòng bảng công cho người nghỉ (PRD 06) trừ khi giáo viên đó thực tế điểm danh buổi (điểm danh thắng đơn nghỉ và được ghi cảnh báo). Đổi ca được duyệt tạo phân công dạy thay ngay cho giáo viên nhận ca. - Mỗi sự cố sinh đúng một công việc xử lý; đóng công việc chuyển sự cố sang resolved, người báo cáo xác nhận hoặc sau 3 ngày tự chuyển closed. Sự cố an toàn học viên hoặc mức critical gửi đẩy ngay cho quản lý chi nhánh và chủ trung tâm, bỏ qua giờ yên tĩnh.
- Mọi thực thể thuộc một trung tâm (
center_id) và một chi nhánh (school_id); công việc không gắn chi nhánh lấy chi nhánh của người tạo. Người dùng chỉ thấy công việc mà họ là người giao, người nhận, người được nhắc tên, hoặc thuộc chi nhánh trong phạm vi quyền. Đính kèm dùng dịch vụ tệp của CRM: tối đa 10 tệp mỗi công việc, 20 MB mỗi tệp.
6Mô hình dữ liệu
| Thực thể | Trường | Ghi chú |
|---|---|---|
| task | id uuid; center_id; school_id; title; description; source enum(manual, routine, system, migrated); trigger_code null; dedupe_key null (unique khi mở); routine_id null; period_key null; linked_type enum(customer, student, class, session, invoice, incident) null; linked_id null; created_by_staff_id; priority enum(low, medium, high, critical, urgent); status enum(new, in_progress, pending_review, done, cancelled); require_review bool; require_all bool; due_at; completed_at; cancelled_reason; version int | new; chỉ mục (center_id, school_id, status, due_at) và (linked_type, linked_id); nhật ký chi tiết ở task_history |
| task_assignee | task_id; staff_id; assigned_by_rule enum(direct, role); role_code null; state enum(open, done); done_at; last_reminded_at | khoá chính (task_id, staff_id) |
| task_checklist_item · task_attachment · task_reminder | checklist: id; task_id; position; label; checked; checked_by. attachment: id; task_id; file_id; uploaded_by. reminder: id; task_id; kind enum(relative, absolute); offset_minutes null; fire_at; fired_at null | tối đa 30 mục, 10 tệp, 4 mốc nhắc |
| task_comment | id uuid; task_id; author_staff_id null (null là hệ thống); body; kind enum(user, system); mentions staff_id[]; created_at | new |
| task_routine | id; center_id; school_ids[] (rỗng là mọi chi nhánh); name; title_template; checklist_template json; priority; require_review; recurrence enum(daily, weekdays, weekly); weekday null; generate_time; due_after_minutes; skip_holidays bool; assignee_rule {staff_ids[] | role_code}; is_paused; last_generated_at | new |
| notification (hiện có) · notification_preference | type enum mở rộng: task_assigned, task_due, task_overdue, task_commented, task_review_requested, task_returned, task_completed, leave_submitted, leave_decided, leave_escalated, incident_reported, incident_updated, daily_digest; payload {entity_type, entity_id, title, body}. preference: staff_id; type; push bool; email bool | extend chỉ thêm enum và payload; preference là new |
| leave_request | id uuid; center_id; school_id; staff_id; type enum(annual, sick, unpaid, shift_swap); date_from; date_to; part_of_day enum(full, morning, afternoon, evening); session_id null; swap_with_staff_id null; reason; attachment_file_id null; status enum(pending, approved, rejected, cancelled); approver_staff_id; decided_at; decision_note; escalated_at null | new; leave_request_session (leave_request_id; session_id; substitute_task_id null) tính lúc gửi, tính lại lúc duyệt |
| incident · incident_attachment | id uuid; center_id; school_id; room_id null; session_id null; class_id null; reported_by_staff_id; type enum(facility, student_safety, behaviour, equipment, other); severity enum(low, medium, high, critical); title; description; status enum(new, in_progress, resolved, closed); task_id; resolved_at; closed_at. attachment: id; incident_id; file_id | new; tối đa 5 ảnh, nén còn 1.600 px cạnh dài |
| task_policy (cấu hình tenant) | dedupe_window_days (7); digest_time (08:00); default_reminder_time (09:00); triggers {lead_cold: {enabled, days}, student_absent, invoice_overdue: {enabled, days}, session_unmarked, substitute_needed, incident_new}; leave_approver_overrides [{school_id, staff_id}]; leave_escalation_hours (48); incident_autoclose_days (3) | lưu trong cấu hình trung tâm (PRD 10) |
7Hợp đồng API
| Method | Path | Request / response | Status |
|---|---|---|---|
| GET | /v3/crm/me/today-plan | → bổ sung mảng tasks (quá hạn, hôm nay, chờ xác nhận) bên cạnh cuộc gọi và cuộc hẹn hiện có | existing |
| GET · POST | /v3/crm/me/notifications · /unread-count · /{id}/read · /read-all · /{id}/archive | không đổi hợp đồng; thêm tham số lọc type? | existing |
| POST | /v3/teacher/class-schedules/{id}/remind · /preview-remind-time | nhắc lịch cho phụ huynh, thuộc PRD 07; chỉ tham chiếu | existing |
| GET | /v3/crm/customers/{id}/interactions | trả thêm công việc gắn khách hàng dưới dạng mục timeline kind = task (chỉ đọc); tạo công việc dùng /v3/crm/tasks | extend |
| GET / POST | /v3/crm/tasks | view=my|team, school_id, assignee_id, status[], priority[], source, linked_type, linked_id, overdue, due_from, due_to, q; POST {title, description?, assignees: [{staff_id} | {role_code, school_id}], due_at?, priority?, require_review?, require_all?, linked?: {type, id}, checklist?, reminders?, attachments?} | new |
| GET / PATCH | /v3/crm/tasks/{id} | chi tiết gồm checklist, attachments, reminders, comments, history; PATCH kèm version, 409 STALE_VERSION | new |
| POST | /v3/crm/tasks/{id}/transition · /reassign · /v3/crm/tasks/bulk | {to, reason?} kiểm tra theo mục 5; {assignees[], note?}; bulk {ids[], action: reassign|reschedule|cancel, payload} | new |
| PUT · GET/POST · POST/DELETE | /v3/crm/tasks/{id}/checklist · /comments · /reminders | checklist thay toàn bộ; comment {body, mentions?} thông báo người được nhắc tên; reminder {kind, offset_minutes | fire_at} | new |
| GET / POST / PATCH / DELETE | /v3/crm/task-routines · /{id} | các trường ở mục 6; PATCH {is_paused}; POST /{id}/run-now sinh ngay một kỳ | new |
| GET / PUT | /v3/crm/me/notification-preferences | [{type, push, email}] | new |
| GET / POST | /v3/crm/leave-requests | view=mine|to_approve|all, school_id, staff_id, status[], from, to; POST {type, date_from, date_to, part_of_day, session_id?, swap_with_staff_id?, reason, attachment_file_id?} → kèm affected_sessions[]; POST /preview-impact trả affected_sessions[] trước khi gửi | new |
| POST | /v3/crm/leave-requests/{id}/decide · /cancel · /revoke | decide {decision: approved|rejected, note?} (note bắt buộc khi rejected) gắn cờ buổi học và sinh công việc dạy thay; cancel bởi người gửi khi pending; revoke bởi người duyệt trước ngày bắt đầu {reason} | new |
| GET / POST | /v3/crm/incidents | school_id, status[], severity[], type[], from, to; POST {type, severity, title, description, room_id?, session_id?, class_id?, attachments[], client_created_at?} idempotent theo (reported_by, client_created_at) | new |
| GET / PATCH | /v3/crm/incidents/{id} | chi tiết kèm task; PATCH {status, severity?, note?}; POST /{id}/confirm-resolved bởi người báo cáo | new |
| GET / PUT | /v3/teacher/school-config | thêm khối task_policy | extend |
| GET | /v3/crm/tasks/report | school_id, from, to, group_by=assignee|source|trigger → số tạo, hoàn thành, đúng hạn, thời gian hoàn thành trung vị; dùng cho PRD 09 | new |
8Phân quyền
| Mã quyền | owner | branch_manager | admissions | academic_admin | accountant | teacher |
|---|---|---|---|---|---|---|
tasks.view | tất cả | chi nhánh | của bản thân + được nhắc tên | chi nhánh | của bản thân + gắn hoá đơn trong chi nhánh | của bản thân + gắn lớp của bản thân |
tasks.create | có | có | có (gắn khách hàng của bản thân) | có | có | có (gắn lớp, buổi của bản thân) |
tasks.assign_others, tasks.edit_any, tasks.bulk, tasks.team_view | tất cả | chi nhánh | không (chỉ tự giao) | chi nhánh | không | không |
tasks.routines | có | chi nhánh | không | không | không | không |
leave.request, incidents.report | có | có | có | có | có | có |
leave.approve | tất cả | chi nhánh | không | không | không | không |
leave.view | tất cả | chi nhánh | của bản thân | chi nhánh (chỉ xem, để xếp dạy thay) | chi nhánh (chỉ xem, để tính lương) | của bản thân |
incidents.manage | tất cả | chi nhánh | không | chi nhánh | không | của bản thân (xác nhận đã xử lý) |
tasks.policy | có | không | không | không | không | không |
tasks.report | tất cả | chi nhánh | không | chi nhánh | không | không |
Phụ huynh không có quyền trong mô-đun này; yêu cầu từ phụ huynh đi qua PRD 07 và trở thành công việc cho bộ phận lễ tân qua trigger hệ thống.
9Sự kiện phân tích
| Sự kiện | Thuộc tính |
|---|---|
| task_created | source (manual|routine|system|migrated), trigger_code, linked_type, assignee_count, has_due, has_checklist, by_role, device |
| task_transitioned | from, to, hours_open, was_overdue, by_role, source |
| task_deduped | trigger_code, priority_before, priority_after |
| reminder_sent | kind (task|digest), channel (in_app|push|email), quiet_hours_deferred |
| notification_opened | type, minutes_after_send, device |
| routine_generated | routine_id, recurrence, schools_count, previous_period_incomplete |
| leave_submitted | type, days, part_of_day, affected_sessions, device |
| leave_decided | decision, hours_to_decide, escalated, affected_sessions |
| incident_reported | type, severity, photos, offline_queued, seconds_to_submit |
| incident_resolved | hours_to_resolve, confirmed_by_reporter, autoclosed |
10Trường hợp biên
- Người nhận bị vô hiệu hoá khi còn công việc mở: công việc chuyển về quản lý chi nhánh kèm bình luận hệ thống; mẫu lặp gán theo vai trò tự lấy nhân sự thay thế ở kỳ sau.
- Đối tượng gắn kèm bị lưu trữ hoặc ẩn danh hoá (PRD 02, PRD 12): công việc giữ tiêu đề và trạng thái, liên kết hiển thị "Đối tượng đã lưu trữ"; công việc hệ thống đang mở tự huỷ.
- Hai người cùng sửa một công việc: lượt lưu sau với
versioncũ nhận 409 và được hiển thị bản mới; bình luận không bị khoá bởi version. - Học viên chuyển chi nhánh khi có công việc mở gắn với học viên: công việc giữ chi nhánh và người nhận gốc; quản lý chi nhánh mới thấy công việc qua liên kết học viên và có thể giao lại.
- Đơn được duyệt rồi giáo viên vẫn điểm danh buổi trong khoảng nghỉ: điểm danh được chấp nhận, buổi tính lương cho giáo viên đó, cờ dạy thay được gỡ, và một bình luận cảnh báo được ghi vào đơn.
- Người duyệt duy nhất của chi nhánh đang nghỉ theo đơn đã duyệt: đơn mới của chi nhánh chuyển thẳng cho chủ trung tâm trong khoảng nghỉ.
- Sự cố gửi offline hai lần do thử lại: khử trùng lặp theo (reported_by, client_created_at); ảnh chỉ được gắn một lần.
- Trigger
lead_coldtrên khách hàng có cờ Không gọi (PRD 01): không sinh công việc. - Người dùng thuộc nhiều chi nhánh: Việc của tôi gộp mọi chi nhánh với chip chi nhánh trên từng dòng; bản tổng hợp 08:00 chỉ gửi một lần.
11Câu hỏi còn mở
- PRD 06 đã xếp "yêu cầu và phê duyệt nghỉ phép" vào giai đoạn 3; PRD này đề xuất kéo lên P2 vì phụ thuộc trực tiếp vào dạy thay và bảng công. Cần chủ sản phẩm chốt và cập nhật mục phân kỳ của PRD 00.
- Số dư phép năm: chỉ đếm số ngày đã nghỉ (đề xuất) hay cần số dư đầu kỳ nhập tay ở hồ sơ nhân sự và cảnh báo khi vượt?
- Bản tổng hợp 08:00 gửi email theo mặc định hay chỉ khi người dùng bật? Đề xuất: mặc định tắt cho giáo viên, bật cho quản lý chi nhánh và kế toán.
- Giáo viên có nên thấy đơn xin nghỉ của đồng nghiệp cùng chi nhánh (để chủ động nhận dạy thay) hay chỉ thấy các buổi "Cần dạy thay" ở PRD 03?
Trường Số (truongso.net) · Nội bộ FLYER