Trường Số PRD/06 Giáo viên và nhân sự
Trường Số · Yêu cầu sản phẩm · 09/2026

PRD 06 · Giáo viên và nhân sự

Danh bạ nhân sự, hồ sơ giáo viên, hợp đồng, cách tính lương theo buổi hoặc theo giờ, bảng công được tính từ dữ liệu điểm danh, và đánh giá định kỳ. Mô-đun này xây dựng trên TeacherProfile và tư cách thành viên trường đã có; các thực thể nhân sự là mới.

Xuất xứ / Prompt / Giới hạn
Trạng thái
Dự thảo v1
Mô-đun phụ trách
Nhân sự
Backend
EXTEND TeacherProfile · NEW HR entities
Giai đoạn
P1 (danh bạ, phân công) / P2 (lương, bảng công, đánh giá)
Phụ thuộc vào
03 Lớp học, 04 Điểm danh, 10 Cài đặt

Tài liệu do trợ lý AI soạn trong một phiên làm việc ngày 10/09/2026, theo yêu cầu gốc được trích nguyên văn ở trang mục lục; mục Thiết kế đề xuất được bổ sung ngày 16/09/2026. Đâ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-frontend và đặc tả OpenAPI /v3 trê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ả /v3 trên staging tại thời điểm trên.

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ách đối thủ tính "thống kê giờ dạy giáo viên" (từ điểm danh hay từ thời khoá biểu) và việc có xử lý trường hợp dạy thay không.
    • Các trường trong "quản lý tiền lương" của đối thủ: lương cố định, theo buổi, phụ cấp, khoản trừ; có xuất phiếu lương không.
    • Danh sách nhân sự của đối thủ có bao gồm nhân sự không có tài khoản đăng nhập không.
    • Bố cục màn hình lịch dạy hằng tuần của giáo viên ("xếp lịch giáo viên theo tuần").

Thiết kế đề xuất

Chín màn hình dùng chung khung School OS với thanh điều hướng Nhân sự đang bật, đi từ danh bạ đến hồ sơ, hợp đồng, cách tính lương, bảng công và đánh giá; điều quan trọng nhất cần thấy là số tiền phải trả được tính từ dữ liệu điểm danh, còn mọi ngoại lệ (dạy thay, huỷ muộn, cờ của giáo viên, điều chỉnh, tháng đã khoá) đều xuất hiện thành dòng riêng có lý do chứ không nhập tay.

1 · Danh sách nhân sự

/staff · desktop

Danh sách nhân sự
Bảng đủ chín cột của mục 5 (mã NV, họ tên, chức danh, loại, chi nhánh, lớp đang dạy, hợp đồng, tài khoản, thao tác) với bốn tab Đang làm việc · Sắp hết hạn HĐ · Chưa có hồ sơ · Đã nghỉ và bộ lọc chi nhánh, chức danh, loại hình. Chi nhánh tràn hiển thị "+2"; cột hợp đồng ghép ngày kết thúc với chip Sắp hết hạn cho hai hợp đồng còn dưới 30 ngày (STF-03); cột tài khoản phân biệt Đã kích hoạt / Chờ mời / Không có, trong đó nhân viên vệ sinh có mặt trong danh bạ mà không cần đăng nhập (mục tiêu 1). Sắp xếp mặc định theo tên.

2 · Biểu mẫu nhân sự · bước 1

/staff/new · desktop

Biểu mẫu nhân sự · bước 1
Modal hai bước (Thông tin nhân sự → Tài khoản đăng nhập) với đủ trường của mục 5: mã nhân viên tự sinh NV-####, chức danh có thêm nhanh, chi nhánh chọn nhiều, ngày bắt đầu ràng buộc không quá 90 ngày. Trạng thái đang hiển thị là lỗi trùng số điện thoại: biểu mẫu chỉ ra bản ghi đã có và đề nghị "Mở hồ sơ" thay vì tạo bản ghi trùng (STF-01, kịch bản 2).

3 · Hồ sơ nhân sự · Tổng quan

/staff/:id · desktop

Hồ sơ nhân sự · Tổng quan
Phần đầu gồm avatar, họ tên, mã, chức danh, chip trạng thái và chi nhánh cùng ba nút Vô hiệu hoá · Đặt lại mật khẩu · Sửa hồ sơ; bảy tab theo mục 5. Tab Tổng quan chia hai cột thông tin cá nhân (CCCD đã ẩn một phần) và thông tin công việc (tóm tắt cách tính lương, hợp đồng, vai trò tài khoản); cột phải là bốn KPI lấy từ RollupTeacher vì nhân sự này là giáo viên.

4 · Hồ sơ nhân sự · Lớp và lịch

/staff/:id · tab Lớp & lịch · desktop

Hồ sơ nhân sự · Lớp và lịch
Bảng lớp hiện tại (tên, lịch học dạng văn bản, học viên, phòng học, chi nhánh, vai trò, tiến độ buổi) và chế độ xem tuần 14/09–20/09 lấy từ PRD 03. Buổi dạy thay được đánh dấu màu hổ phách kèm tên giáo viên chính; buổi đã diễn ra chuyển sang màu xanh với sĩ số điểm danh, đúng nguồn dữ liệu mà bảng công sẽ dùng.

5 · Hợp đồng · ngăn kéo thêm hợp đồng

/staff/:id · tab Hợp đồng · desktop

Hợp đồng · ngăn kéo thêm hợp đồng
Tab Hợp đồng liệt kê loại, ngày bắt đầu, ngày kết thúc, cách tính lương, tài liệu và trạng thái; cảnh báo 30 ngày nằm ngay trên bảng. Ngăn kéo Thêm hợp đồng đang báo lỗi vì ngày bắt đầu 01/10/2026 trùng thời gian với HĐ-2025-03 còn hiệu lực đến 15/10/2026 (quy tắc 2); cách tính lương được gán tại đây chứ không gán trực tiếp cho nhân sự (STF-03, STF-04).

6 · Cách tính lương

/staff/pay-rules · desktop

Cách tính lương
Bảng quy tắc theo mục 5: tên, loại Theo buổi / Theo giờ / Theo tháng, đơn giá cơ bản, số ngoại lệ, hiệu lực từ → đến và số nhân sự đang áp dụng qua hợp đồng; quy tắc năm 2025 đã hết hiệu lực vẫn được giữ. Cột phải mở quy tắc đang chọn: ngoại lệ theo loại lớp (IELTS Junior 350.000 ₫, tương đương hệ số 1,4), trả 50% cho buổi huỷ muộn, và "trả cả GV chính khi có dạy thay" tắt mặc định (quy tắc 4); ghi chú nhắc đơn giá được chụp lại vào từng dòng bảng công (quy tắc 5).

7 · Bảng công tháng

/staff/timesheets?month=2026-09 · desktop

Bảng công tháng
Bốn KPI tổng chi phí, số buổi đã trả lương, số bảng công chờ xác nhận và đã duyệt; bộ chọn tháng, bộ lọc chi nhánh và chip trạng thái Nháp / Chờ xác nhận / Đã xác nhận / Đã duyệt. Bảng có đủ tám cột giáo viên, số buổi, số giờ, số tiền cơ bản, điều chỉnh, tổng cộng, trạng thái, số cờ. Ghi chú phía trên nêu tháng 8/2026 đã duyệt và khoá: không tạo lại, khoản bù được ghi vào tháng sau kèm tham chiếu (trường hợp biên 4).

8 · Chi tiết bảng công của một giáo viên

/staff/timesheets/:id · desktop

Chi tiết bảng công của một giáo viên
Banner "Có 2 buổi thay đổi sau khi tạo bảng công" kèm nút Tính lại (STF-05). Mỗi dòng là một buổi học từ điểm danh với ngày, lớp, tên buổi, thời lượng, vai trò, đơn giá đã chụp và số tiền: dòng Dạy thay trả cho giáo viên dạy thay, dòng Huỷ muộn trả 50%, dòng ngoại lệ IELTS Junior dùng đơn giá 350.000 ₫, và một dòng bị giáo viên gắn cờ. Khu vực điều chỉnh có lý do và tham chiếu tới bảng công tháng 8 đã khoá; nút Duyệt bị chặn khi còn cờ đang mở (STF-06, STF-07).

9 · Biểu mẫu đánh giá

/staff/:id/evaluations/new · desktop

Biểu mẫu đánh giá
Bộ chọn mẫu đánh giá và kỳ (quý), sáu dòng tiêu chí với radio 1–5, trọng số hiển thị và điểm có trọng số từng dòng; tổng 4,15 được tính trực tiếp và lặp lại ở thẻ trên cùng cột phải cùng xu hướng năm kỳ. Toggle "Chia sẻ với giáo viên" đang tắt: giáo viên chỉ thấy kết quả sau khi quản lý bật chia sẻ (STF-08, quy tắc 8).

1Mục đích

Chi phí lớn nhất của một trung tâm là nhân sự giảng dạy, và câu hỏi vận hành thường gặp nhất là "giáo viên nào đã dạy bao nhiêu buổi trong tháng này và trung tâm còn nợ họ bao nhiêu". Mô-đun này giữ một bản ghi nhân sự duy nhất cho mỗi người trên tất cả chi nhánh, liên kết giáo viên với lớp học và buổi học, tính số buổi được trả lương từ dữ liệu điểm danh đã ghi nhận ở PRD 04, và lưu trữ hợp đồng cùng đánh giá để chủ trung tâm có thể quyết định gia hạn dựa trên minh chứng cụ thể.

Mục tiêu

Ngoài phạm vi

2Hiện trạng

Năng lực hiện cóỞ đâuTrạng thái
Tư cách thành viên trường với vai trò OWNER / ADMIN / TEACHERSchoolRole enum; GET /v3/teacher/schools, GET /v3/crm/me/accessible-schoolsexisting
Hồ sơ giáo viên (họ tên, số điện thoại, email, user_name)TeacherProfile schema; được nhúng trong đối tượng Tuition và Classexisting
Tổng hợp hiệu suất giáo viên (học viên, bài kiểm tra đã giao, tỷ lệ hoàn thành)GET /v3/teacher/viewer/rollup-teachers (RollupTeacher)existing
Nhân viên kinh doanh trong CRM (SaleProfile) với vai trò CRM/v3/crm/sale-profiles, /v3/crm/rolesexisting
Hợp đồng, cách tính lương, bảng công, đánh giá, tài liệu, phân công nhân sự theo chi nhánhkhông cónew

Quyết định: đưa vào một thực thể staff bao bọc một user_id không bắt buộc, một teacher_profile_id không bắt buộc và một sale_profile_id không bắt buộc, để mỗi người chỉ xuất hiện một lần trong danh bạ bất kể họ có bao nhiêu hồ sơ FLYER.

3Đối tượng sử dụng và vai trò

Đối tượngVai tròNhu cầu
Chủ trung tâmownerSố lượng nhân sự và chi phí theo chi nhánh, gia hạn hợp đồng, kết quả đánh giá.
Quản lý chi nhánhbranch_managerPhân công giáo viên vào lớp, phê duyệt bảng công, thực hiện đánh giá.
Kế toánaccountantBảng lương hằng tháng, duy trì cách tính lương, các điều chỉnh.
Giáo vụacademic_adminTìm giáo viên dạy thay, cập nhật hồ sơ và tài liệu.
Giáo viênteacherXem lịch dạy của bản thân, bảng công của bản thân, đánh giá của bản thân; xác nhận buổi học.

4User story và tiêu chí chấp nhận

STF-01Tạo bản ghi nhân sự
Giáo vụ thêm một nhân sự có hoặc không có quyền truy cập hệ thống.
  • Given Có quyền staff.manage
  • When Nhập họ tên, mã nhân viên, chức danh, loại hình làm việc, chi nhánh, ngày bắt đầu, số điện thoại, và có thể chọn thêm "Tạo tài khoản đăng nhập" kèm vai trò
  • Then Bản ghi nhân sự được tạo; nếu có yêu cầu tạo tài khoản, một lời mời được gửi qua email hoặc SMS, người dùng được thêm vào trường với vai trò đã chọn, và một TeacherProfile được tạo khi vai trò đó bao gồm việc giảng dạy.
  • Given Số điện thoại đã thuộc về một nhân sự khác trong tenant
  • When Nhập và gửi
  • Then Biểu mẫu hiển thị bản ghi đã có và đề nghị "Mở hồ sơ" thay vì tạo bản ghi trùng.
STF-02Liên kết tài khoản giáo viên FLYER đã có
Quản trị viên liên kết một giáo viên đã có tài khoản FLYER và lớp học.
  • Given Có giáo viên tồn tại trong trường (từ tư cách thành viên qua /v3/teacher/schools) nhưng chưa có bản ghi nhân sự
  • When Mở Nhân sự → "Chưa có hồ sơ (N)"
  • Then Mỗi giáo viên chưa liên kết được liệt kê kèm hành động "Tạo hồ sơ" giúp điền sẵn biểu mẫu từ TeacherProfile.
STF-03Ghi nhận hợp đồng
Kế toán gắn một hợp đồng kèm thời hạn và cách tính lương.
  • Given Có bản ghi nhân sự
  • When Thêm loại hợp đồng, ngày bắt đầu, ngày kết thúc, cách tính lương, tài liệu đã ký
  • Then Hợp đồng được lưu; các hợp đồng của cùng một nhân sự không được trùng thời gian; 30 ngày trước khi hết hạn, dòng nhân sự hiển thị Sắp hết hạn và một thông báo được gửi đến branch_manager và accountant.
STF-04Định nghĩa cách tính lương
Kế toán định nghĩa cách một giáo viên được trả lương.
  • Given Có quyền staff.pay_rules
  • When Tạo một quy tắc thuộc loại per_session, per_hour, hoặc monthly kèm đơn giá, có thể có ngoại lệ theo loại lớp, và ngày hiệu lực
  • Then Quy tắc áp dụng cho các buổi học có ngày rơi vào khoảng hiệu lực; mỗi buổi học dùng quy tắc cụ thể nhất (ngoại lệ theo loại lớp > mặc định).
STF-05Tạo bảng công tháng
Kế toán tạo bảng công cho một tháng.
  • Given Có các buổi học trong PRD 04 với trạng thái held và đã ghi nhận giáo viên (chính hoặc dạy thay)
  • When Chọn "Tạo bảng công tháng 9/2026"
  • Then Một bảng công được tạo cho mỗi giáo viên, gồm một dòng cho mỗi buổi học đã diễn ra (ngày, lớp, thời lượng, đơn giá, số tiền) cùng các dòng cho buổi học huỷ muộn nếu cách tính lương có trả cho trường hợp này; tổng số tiền được tính; trạng thái draft.
  • Given Một buổi học đã được sửa trong PRD 04 sau khi bảng công được tạo
  • When Xem bảng công
  • Then Một banner "Có 2 buổi thay đổi sau khi tạo bảng công" hiển thị nút "Tính lại".
STF-06Giáo viên xác nhận bảng công
Giáo viên kiểm tra các buổi dạy của bản thân trước khi tính lương.
  • Given Có bảng công dự thảo dành cho giáo viên
  • When Mở Bảng công của tháng
  • Then Xem được từng dòng, có thể gắn cờ một dòng kèm ghi chú ("tôi dạy thay buổi này"), và chọn "Xác nhận"; các dòng bị gắn cờ được chuyển đến branch_manager để xử lý; bảng công chỉ chuyển sang confirmed khi không còn cờ nào đang mở.
STF-07Phê duyệt và xuất bảng lương
Quản lý chi nhánh phê duyệt; kế toán xuất bảng lương.
  • Given Có bảng công ở trạng thái confirmed
  • When Quản lý chi nhánh phê duyệt
  • Then Trạng thái chuyển thành approved, các dòng bị khoá; kế toán xuất file XLSX với một dòng cho mỗi giáo viên (mã, họ tên, số buổi, số giờ, số tiền cơ bản, điều chỉnh, tổng cộng) kèm một sheet chi tiết theo từng buổi học; việc xuất file được ghi lại trong nhật ký.
STF-08Đánh giá giáo viên
Quản lý chi nhánh thực hiện một kỳ đánh giá định kỳ.
  • Given Có một mẫu đánh giá (các tiêu chí kèm trọng số, thang điểm 1–5)
  • When Chấm điểm một giáo viên cho một kỳ và thêm nhận xét
  • Then Một điểm số có trọng số được lưu lại; giáo viên chỉ thấy kết quả sau khi quản lý đánh dấu "Đã chia sẻ"; hồ sơ hiển thị xu hướng qua các kỳ, bên cạnh phần tổng hợp hiệu suất đã có (học viên, tỷ lệ hoàn thành).
STF-09Cho nghỉ việc
Quản trị viên kết thúc quan hệ lao động.
  • Given Có bản ghi nhân sự với tài khoản đang hoạt động
  • When Đặt trạng thái Đã nghỉ kèm ngày kết thúc
  • Then Các phân công lớp trong tương lai bị xoá và được liệt kê để phân công lại, tài khoản bị vô hiệu hoá vào cuối ngày của ngày kết thúc, lịch sử vẫn được giữ hiển thị.

5Màn hình

Danh sách nhân sự /staff

Tab: Đang làm việc (N) · Sắp hết hạn HĐ (N) · Chưa có hồ sơ (N) · Đã nghỉ. Bộ lọc: tìm kiếm (họ tên, mã, số điện thoại), chi nhánh, chức danh, loại hình làm việc. Hành động: + Thêm nhân sự, Xuất Excel.

CộtGhi chú
Mã NVstaff.code
Họ tênavatar + họ tên; liên kết đến hồ sơ
Chức danhjob_title
Loạichip: Toàn thời gian / Bán thời gian / Cộng tác viên
Chi nhánhchip, tràn hiển thị "+2"
Lớp đang dạysố lượng (chỉ với giáo viên), liên kết
Hợp đồngngày kết thúc + chip trạng thái
Tài khoảnchip: Đã kích hoạt / Chờ mời / Không có
Thao táckebab: Sửa, Vô hiệu hoá, Gửi lại lời mời

Trạng thái rỗng: "Chưa có nhân sự. Thêm giáo viên và nhân viên để phân lớp và tính công." Sắp xếp mặc định theo tên (collation vi).

Hồ sơ nhân sự /staff/:id

Phần đầu: avatar, họ tên, mã, chức danh, chip trạng thái, chi nhánh, các nút Sửa · Tạo tài khoản/Đặt lại mật khẩu · Vô hiệu hoá. Tab: Tổng quan · Lớp & lịch · Hợp đồng · Bảng công · Đánh giá · Tài liệu · Nhật ký.

  • Tổng quan: hai cột: thông tin cá nhân (ngày sinh, giới tính, số CCCD đã ẩn một phần, địa chỉ, liên hệ khẩn cấp) và thông tin công việc (ngày bắt đầu, loại hình làm việc, tóm tắt cách tính lương, vai trò tài khoản). Cột bên phải: KPI từ RollupTeacher khi nhân sự là giáo viên: học viên, bài kiểm tra đã giao, tỷ lệ hoàn thành, tỷ lệ tăng trưởng.
  • Lớp & lịch: bảng các lớp hiện tại (tên, lịch học dạng văn bản, học viên, phòng học) và một chế độ xem theo tuần các buổi học (từ PRD 03) kèm dấu hiệu dạy thay.
  • Hợp đồng: danh sách gồm loại hợp đồng, ngày bắt đầu, ngày kết thúc, cách tính lương, tài liệu, trạng thái; + Thêm hợp đồng.
  • Bảng công: bộ chọn tháng; bảng các dòng; tổng cộng; trạng thái; giáo viên chỉ thấy bảng công của bản thân.
  • Đánh giá: danh sách các lượt đánh giá kèm điểm số và biểu đồ sparkline thể hiện xu hướng; + Đánh giá mới dành cho quản lý.
  • Tài liệu: các tệp tải lên kèm loại (CCCD, bằng cấp, chứng chỉ, hợp đồng, khác), ngày hết hạn, chip sắp hết hạn.
  • Nhật ký: các mục nhật ký cho nhân sự này.
Biểu mẫu nhân sự (modal, 2 bước) /staff/new · /staff/:id/edit
TrườngKiểu dữ liệuRàng buộc
Họ và têntextbắt buộc, 2–80
Mã nhân viêntexttự động sinh NV-####, có thể sửa, không trùng
Chức danhselect (danh sách của trung tâm) + thêm nhanhbắt buộc
Loại hìnhenum full_time / part_time / contractorbắt buộc
Chi nhánhmulti-select≥ 1
Ngày bắt đầudatebắt buộc, ≤ hôm nay + 90 ngày
Số điện thoạitelbắt buộc, đúng định dạng VN, kiểm tra trùng
Emailemailbắt buộc nếu tạo tài khoản
Ngày sinh, Giới tính, CCCD, Địa chỉkhông bắt buộc; CCCD 12 số
Liên hệ khẩn cấphọ tên + số điện thoạikhông bắt buộc
Bước 2: Tạo tài khoản đăng nhậptogglenếu bật: vai trò (theo các vai trò ở PRD 10), phạm vi chi nhánh, cờ "Là giáo viên" để tạo TeacherProfile
Cách tính lương /staff/pay-rules

Bảng: tên, loại (Theo buổi / Theo giờ / Theo tháng), đơn giá cơ bản, số lượng ngoại lệ, ngày hiệu lực từ/đến, số nhân sự đang áp dụng. Biểu mẫu: tên, loại, đơn giá (VND), bảng ngoại lệ (loại lớp hoặc khoá học → đơn giá), trả lương cho buổi huỷ muộn (toggle, tỷ lệ phần trăm), ngày hiệu lực. Việc gán một cách tính lương cho nhân sự được thực hiện trên hợp đồng.

Bảng công /staff/timesheets?month=2026-09

Bộ chọn tháng, bộ lọc chi nhánh, chip trạng thái (Nháp / Chờ xác nhận / Đã xác nhận / Đã duyệt). Bảng: giáo viên, số buổi, số giờ, số tiền cơ bản, điều chỉnh, tổng cộng, trạng thái, số lượng cờ. Chọn một dòng để mở chi tiết bảng công: bảng dòng (ngày, lớp, tên buổi học, thời lượng, vai trò giáo viên chính/dạy thay, đơn giá, số tiền, cờ), khu vực điều chỉnh (+ Thêm điều chỉnh: số tiền có dấu, lý do), các nút theo từng trạng thái: Tính lại · Gửi GV xác nhận · Duyệt · Xuất Excel.

Biểu mẫu đánh giá /staff/:id/evaluations/new

Bộ chọn mẫu đánh giá, kỳ đánh giá (tháng hoặc quý), các dòng tiêu chí với radio 1–5 và hiển thị trọng số, nhận xét tổng thể, toggle "Chia sẻ với giáo viên". Điểm số được tính trực tiếp ngay trên phần đầu.

6Quy tắc nghiệp vụ

  1. Một bản ghi nhân sự thuộc về một tenant và một hoặc nhiều chi nhánh; việc phân công lớp bị giới hạn trong các chi nhánh của nhân sự đó.
  2. Một người có thể có nhiều hợp đồng theo thời gian nhưng không được có hai hợp đồng đang hoạt động trùng thời gian.
  3. Các dòng bảng công chỉ đến từ các buổi học ở PRD 04 có trạng thái held hoặc cancelled_late (khi cách tính lương có trả cho trường hợp này); các buổi học có trạng thái planned hoặc cancelled không bao giờ được trả lương.
  4. Giáo viên dạy thay được trả lương cho buổi học đó, không phải giáo viên chính, trừ khi cách tính lương có bật "trả cả GV chính khi có dạy thay" (mặc định tắt).
  5. Chụp lại đơn giá tại thời điểm tính: mỗi dòng bảng công lưu lại đơn giá đã dùng; các thay đổi cách tính lương sau đó không ảnh hưởng đến các bảng công đã được duyệt.
  6. Các điều chỉnh cần có lý do và quyền staff.timesheets.adjust; chúng được ghi lại trong nhật ký.
  7. Vô hiệu hoá tài khoản không xoá bản ghi nhân sự; mã nhân viên vẫn được giữ lại.
  8. Kết quả đánh giá chỉ hiển thị cho giáo viên sau khi được chia sẻ; chủ trung tâm và quản lý chi nhánh của các chi nhánh mà nhân sự đó thuộc về luôn thấy được kết quả.

7Mô hình dữ liệu

Thực thểTrườngGhi chú
staffid uuid; tenant_id; code; full_name; job_title_id; employment_type enum(full_time, part_time, contractor); status enum(active, on_leave, terminated); user_id int64 null; teacher_profile_id int64 null; sale_profile_id int64 null; phone; email; birthday; gender; id_number (encrypted); address; emergency_name; emergency_phone; start_date; end_date; branch_ids uuid[]; created_at; updated_atunique (tenant_id, code); unique (tenant_id, phone)
job_titleid; tenant_id; name; is_teaching bool; positionmặc định: Giáo viên, Trợ giảng, Giáo vụ, Tư vấn, Kế toán, Quản lý
staff_contractid; staff_id; type enum(labour, service, probation); start_date; end_date null; pay_rule_id; document_file_id; status enum(active, expired, terminated); noteràng buộc chống trùng lặp trên khoảng [start, end]
pay_ruleid; tenant_id; name; type enum(per_session, per_hour, monthly); base_rate numeric; pay_cancelled_late bool; cancelled_late_pct int; pay_main_when_substituted bool; effective_from; effective_to
pay_rule_overrideid; pay_rule_id; class_type text null; course_id uuid null; rate numericquy tắc cụ thể nhất được ưu tiên
timesheetid; tenant_id; branch_id; staff_id; year; month; status enum(draft, pending_confirm, confirmed, approved); base_amount; adjustment_amount; total_amount; generated_at; confirmed_at; approved_by; approved_atunique (staff_id, year, month)
timesheet_lineid; timesheet_id; session_id (PRD 04); date; class_id; title; duration_min; role enum(main, substitute); rate; amount; flag_comment null; flag_status enum(none, open, resolved)session_id không trùng trong mỗi bảng công
timesheet_adjustmentid; timesheet_id; amount signed; reason; created_by; created_at
evaluation_templateid; tenant_id; name; criteria jsonb [{key, label, weight}]
evaluationid; staff_id; template_id; period_start; period_end; scores jsonb {key: 1..5}; weighted_score numeric; comment; evaluator_id; shared_at null; created_at
staff_documentid; staff_id; type enum(id_card, degree, certificate, contract, other); file_id; expires_on null; created_at

8Hợp đồng API

MethodPathRequest / notesStatus
GET/v3/teacher/schoolstư cách thành viên và vai trò của người dùng hiện tạiexisting
GET/v3/teacher/viewer/rollup-teachersKPI giáo viên dùng cho cột bên của hồ sơexisting
GET/v3/school/staffq, branch_id, job_title_id, employment_type, status, unlinked=true, page, limitnew
POST/v3/school/staff{full_name, code?, job_title_id, employment_type, branch_ids, start_date, phone, email?, ..., account?: {role_id, branch_ids, is_teacher}}new
GET / PATCH/v3/school/staff/{id}chi tiết bao gồm hợp đồng, cách tính lương hiện tại, trạng thái tài khoảnnew
POST/v3/school/staff/{id}/account{role_id, branch_ids, is_teacher} tạo lời mời người dùng + tư cách thành viên + TeacherProfilenew
POST/v3/school/staff/{id}/link{user_id | teacher_profile_id | sale_profile_id}new
POST/v3/school/staff/{id}/terminate{end_date, reason}new
GET / POST/v3/school/staff/{id}/contracts{type, start_date, end_date?, pay_rule_id, document_file_id?}new
PATCH/v3/school/staff/contracts/{id}new
GET / POST / PATCH/v3/school/pay-rules[/{id}]kèm overrides[]new
POST/v3/school/timesheets/generate{year, month, branch_id?, staff_ids?} idempotent: chỉ tạo lại các bản nhápnew
GET/v3/school/timesheetsyear, month, branch_id, status, staff_idnew
GET/v3/school/timesheets/{id}các dòng, điều chỉnh, cờnew
POST/v3/school/timesheets/{id}/submit | confirm | approve | recalculatechuyển trạng thái; trả 409 khi chuyển trạng thái không hợp lệnew
POST/v3/school/timesheets/{id}/lines/{line_id}/flag{comment}; xử lý qua PATCH flag_statusnew
POST/v3/school/timesheets/{id}/adjustments{amount, reason}new
GET/v3/school/timesheets/exportyear, month, branch_id, format=xlsxnew
GET / POST/v3/school/evaluation-templatesnew
GET / POST/v3/school/staff/{id}/evaluations{template_id, period_start, period_end, scores, comment, share}new
GET / POST / DELETE/v3/school/staff/{id}/documents{type, file_id, expires_on}new

9Phân quyền

Mã quyềnownerbranch_manageraccountantacademic_adminteacher
staff.viewcóchi nhánhcóchi nhánhchỉ bản thân + họ tên/chức danh của đồng nghiệp
staff.managecóchi nhánhkhôngchi nhánhkhông
staff.accounts (mời, vô hiệu hoá)cóchi nhánhkhôngkhôngkhông
staff.contractscóxemcókhôngchỉ xem của bản thân
staff.pay_rulescókhôngcókhôngkhông
staff.timesheets.viewcóchi nhánhcókhôngbản thân
staff.timesheets.generatecókhôngcókhôngkhông
staff.timesheets.approvecóchi nhánhkhôngkhôngkhông
staff.timesheets.adjustcókhôngcókhôngkhông
staff.evaluationscóchi nhánhkhôngkhôngchỉ xem của bản thân khi được chia sẻ
staff.exportcókhôngcókhôngkhông

10Sự kiện phân tích

Sự kiệnThuộc tính
staff_createdemployment_type, with_account, is_teacher
staff_linkedlink_type
contract_createdtype, has_document, pay_rule_type
contract_expiring_notifieddays_before
timesheet_generatedmonth, staff_count, line_count
timesheet_flaggedline_count
timesheet_approvedtotal_amount_bucket
payroll_exportedstaff_count
evaluation_sharedscore_bucket

11Trường hợp biên

12Câu hỏi còn mở

Trường Số (truongso.net) · Nội bộ FLYER