Từ khách hàng, nhu cầu tuyển, người lao động, chấm công, đối soát — đến trả lương và hoa hồng. Vận hành nội bộ trước, mở rộng ra đối tác và người lao động sau. Mọi con số đã chốt là không sửa.
Một hệ thống duy nhất với ba giao diện riêng — dữ liệu nằm chung một kho nên không bao giờ lệch nhau.
Mỗi kỳ lương, hệ thống chạy đúng chu trình này — mọi bước đều có người chịu trách nhiệm và dấu vết thao tác.
flowchart LR S1["1️⃣ Tiếp nhận
KH → Dự án → Nhu cầu"] --> S2["2️⃣ Tìm người & gán
4 nguồn → HR duyệt"] S2 --> S3["3️⃣ Chấm công
file đối tác + GPS"] S3 --> S4["4️⃣ Chốt công
xử lý lỗi → duyệt → KHÓA 🔒"] S4 --> S5["5️⃣ Đối soát
2 biên bản + tối đa 2 vòng"] S4 --> S6["6️⃣ Trả lương
+ BHXH, thuế"] S5 --> S7["Vendor xác nhận/
phản đối"] S6 --> S8["Phiếu lương
chỉ NET, không âm"] style S4 fill:#FFF1E4,color:#C2410C,stroke:#F97316,stroke-width:2px style S5 fill:#FFF1E4,color:#C2410C style S6 fill:#FFF1E4,color:#C2410C
flowchart TD A["📝 HR tạo biên bản
CHO_VENDOR"] --> B{"Vendor xem"} B -->|"✅ Xác nhận"| LOCKED["🔒 Khóa biên bản
HOÀN TẤT"] B -->|"❌ Phản đối
vòng 1"| C["⚠️ Phản đối vòng 1
HR chỉnh sửa"] C -->|"Gửi lại
vòng 2"| A C -->|"❌ Phản đối
vòng 2"| FL["🔒 FORCE LOCK
HR Manager/Kế toán chốt
lý do + bằng chứng + audit"] C -->|"⏰ Quá 3 ngày
không trả lời"| AUTO["⏰ Tự xác nhận
không ai câu giờ được"] A -->|"⏰ Quá 3 ngày
Vendor im lặng"| AUTO AUTO --> LOCKED FL --> LOCKED note["📌 Quy tắc: Phản đối tối đa 2 vòng.
Quá 2 vòng → HR Manager/Kế toán FORCE LOCK
(lý do + bằng chứng + audit — G17-B1)."]:::rule AUTO -.-> note style LOCKED fill:#DCFCE7,color:#15803D,stroke:#15803D,stroke-width:2px style AUTO fill:#FEF3C7,color:#B45309,stroke:#B45309,stroke-width:2px style C fill:#FEF3C7,color:#B45309 style FL fill:#FEE2E2,color:#B91C1C,stroke:#B91C1C,stroke-width:2px style note fill:#FFF1E4,color:#C2410C,stroke:#F97316,stroke-width:1px,stroke-dasharray:4
flowchart TD A["Bảng công
đã khóa 🔒"] --> B{"Loại lao động?"} B -->|"Chính thức
≥ 3 tháng"| C1["Thuế lũy tiến 5/10/15/20/25%
+ BHXH 10.5% (NLĐ)
(DN đóng 22%)"] B -->|"Vãng lai
≥ 2 triệu/lần"| C2["Thuế 10% khấu trừ
tại nguồn"] C1 --> D["Lương NET"] C2 --> D D --> E{"NET < 0?"} E -->|"Có"| F["⚠️ Bù thiếu
chuyển trừ kỳ sau
KT duyệt từng ca"] E -->|"Không"| G["✅ Chuyển khoản
STK đã xác thực"] F --> H["📋 Phiếu lương
chỉ hiện NET"] G --> H style F fill:#FEF3C7,color:#B45309 style G fill:#DCFCE7,color:#15803D
PM đứng ngoài nắng, đeo găng tay, sóng chập chờn — app hiện trường thiết kế cho đúng cảnh đó: nút bấm khổng lồ, vuốt là xong, mất mạng vẫn dùng được.
flowchart LR A["📋 Bảng ca
hôm nay"] --> B["👆 Vuốt phải = có mặt
Vuốt trái = vắng"] B --> C{"🌐 Có mạng?"} C -->|"Có"| S1["Sync server
HR thấy ngay"] C -->|"Không"| S2["💾 Lưu local
+ queue"] S2 -->|"Có mạng lại"| S1 B --> D["🤝 Điểm danh hộ
LĐ không có ĐT"] B --> E["🚨 Báo sự cố
3 chạm"] B --> F["✅ Duyệt đơn
1 chạm"] B --> G["🔄 Chuyển nhóm
hàng loạt"] style S2 fill:#FFF1E4,color:#C2410C,stroke:#F97316,stroke-width:2px style S1 fill:#DCFCE7,color:#15803D
Thay vì một trạng thái duy nhất khó hiểu, hồ sơ theo dõi riêng 5 chuyện độc lập — mỗi chuyện có vòng đời của nó (ADR-011: profile/submission/employment/assignment/risk). "Đang rảnh" là tự suy ra: đang làm việc nhưng chưa có dự án.
flowchart LR
subgraph UT["🗂️ Ứng tuyển"]
U1["Mới"] --> U2["Sàng lọc"]
U2 --> U3["Đạt ✅"]
U2 -->|"loại"| U4["Loại ❌"]
U2 -->|"rút"| U5["Rút ↩️"]
U3 -->|"gộp trùng"| U6["Gộp 🔀"]
end
subgraph HS["📋 Hồ sơ giấy tờ"]
H1["Chưa đủ
thông tin"] --> H2["Chờ xác
minh"]
H2 --> H3["Đã xác
minh ✅"]
H2 -->|"không hợp lệ"| H4["Bị từ chối ❌"]
H4 -->|"khiếu nại / bổ sung"| H2
end
subgraph QH["🤝 Quan hệ lao động"]
Q1["Chưa có"] --> Q2["Đang làm 🟢"]
Q2 --> Q3["Tạm nghỉ 🔵"]
Q3 --> Q2
Q2 -->|"nghỉ việc"| Q4["Nghỉ việc 🔴"]
end
subgraph DA["🏢 Tại dự án"]
D1["Chờ xếp
việc"] --> D2["Đang làm 🟢"]
D2 --> D3["Tạm dừng 🔵"]
D3 --> D2
D2 -->|"kết thúc HĐ"| D4["Kết thúc ⚪"]
D2 -->|"chuyển dự án
ghi đến phút"| D5["Chuyển dự án ↔️"]
D2 -->|"ngang ≥3 ngày
tự cảnh báo"| D6["HR đóng hồ sơ"]
D2 -->|"huỷ điều động"| D7["Hủy ⚪"]
end
subgraph RR["⚠️ Rủi ro"]
R1["Bình thường"] --> R2["Xem xét"]
R2 -->|"bỏ việc /
kỷ luật"| R3["Chặn 🚫"]
R2 --> R1
R3 -->|"HR gỡ sau kỳ"| R1
end
UT -.->|"HR / ứng viên"| HS
HS -.->|"HR / Vendor"| QH
QH -.->|"HR / Vendor"| DA
RR -.->|"mọi portal
cùng thấy"| DA
Kỳ công đã khóa là mốc duy nhất — từ đó tiền tự chảy về đúng nơi:
flowchart TD F["Đối tác gửi file
CSV / XLSX"] --> P["Parse & validate
theo mẫu đã khai"] P -->|"định dạng sai"| E1["❌ LỖI ĐỊNH DẠNG
từ chối nguyên file"] P -->|"OK"| M["Ghép mã NV
employee_code / CCCD"] M -->|"mã lạ"| E2["⚠️ MÃ LẠ
KT dò tay 24h"] M -->|"CCCD trùng 2 người"| E3["⚠️ TRÙNG CCCD
HR Manager gộp"] M -->|"OK"| R["Bảng công thô
status: DRAFT"] R -->|"thiếu check"| E4["⚠️ THIẾU CHECK
PM xác minh"] R -->|"ngoài ca > 1h"| E5["⚠️ NGOÀI CA
PM xác nhận OT"] R -->|"scan trùng < 30s"| E6["⚠️ TRÙNG SCAN
tự bỏ dòng sau"] R -->|"OK"| C["Chuẩn hoá
status: READY"] C --> K["Kế toán duyệt →
KHÓA KỲ 🔒"] K -->|"sai sau khóa?"| ADJ["Tạo dòng ADJUSTMENT
ở kỳ sau kèm lý do"] K --> LOCKED["ĐÃ KHÓA — bất biến
chỉ xem, không sửa"] style E1 fill:#FEE2E2,color:#B91C1C style E2 fill:#FEF3C7,color:#B45309 style E3 fill:#FEF3C7,color:#B45309 style E4 fill:#FEF3C7,color:#B45309 style E5 fill:#FEF3C7,color:#B45309 style E6 fill:#FEF3C7,color:#B45309 style K fill:#FFF1E4,color:#C2410C,stroke:#F97316,stroke-width:2px style LOCKED fill:#DCFCE7,color:#15803D
HRP giải cùng lúc ba bài toán thường tách rời: vận hành nội bộ, điều phối đối tác, và thu hút nguồn lực bên ngoài. Mỗi bài có đối tượng dùng khác nhau, nhưng cùng đọc chung một dữ liệu — không phải ba hệ thống kết nối.
Số hóa chuỗi vận hành nội bộ: nhu cầu tuyển → worker → assignment → nhập & chốt công → đối soát vendor/khách.
Đối tượng: Kế toán · Admin · HR
Quản lý dự án, hợp đồng cung ứng. Điều phối vendor khi thiếu hụt nhân sự hoặc cần mở rộng quy mô nhanh.
Đối tượng: Doanh nghiệp thuê · Vendor · PM
Cổng thông tin tối giản cho NLĐ phổ thông; Talent Pool remarketing cho cả CTV và Vendor.
Đối tượng: Người lao động · CTV · Vendor
Mỗi persona có cổng đăng nhập riêng và tập quyền riêng. Không phải ai cũng cần xem mọi thứ — quyền bị giới hạn từ middleware đến database (RLS L2).
Worker
Đăng ký nhanh, xem công, xem lương — qua app PWA, thao tác 1 chạm.
CTV · Referrer
Nhập thông tin giới thiệu, xem hoa hồng qua link riêng (first-click wins).
Sub-contractor
Nhập NLĐ vào kho hồ sơ, xem dự án cần người, xác nhận/dispute biên bản.
HR · Sale
Quản lý Talent Pool, phân công dự án, nhập nguồn ứng viên.
PM
Gán người từ nhiều vendor, theo dõi tiến độ, điểm danh hiện trường.
Accountant
Chốt công 3 tầng, tính lương, đối soát vendor, ghi nhận công nợ.
System Admin
RBAC, Permission Pool, cấu hình hệ thống, audit log.
Worker Portal (NLĐ), Vendor Portal (nhà thầu phụ), CTV Portal (cộng tác viên) — chạy trong 1 app duy nhất, chỉ Vendor qua subdomain riêng (ADR-003), dùng chung một database và một bộ quyền. Cộng thêm Trang tìm việc công cộng (A-04) tại domain gốc hrp.vn, đọc từ Project.isPublic — không cần đăng nhập, ISR 300s.
hrpartner.vn (chính) — PWA · mobile-first · Wave 3
/api/m/* ẩn dữ liệu nhạy cảmvendor.hrpartner.vn — subdomain riêng
hrpartner.vn — dashboard trong app · trang CTV công cộng trên hrp.vn
hrp.vn — domain gốc · ISR · không cần đăng nhập
Project.isPublic + StaffingOrderMỗi lao động trong hệ thống có năm vòng đời độc lập, mỗi cái một enum riêng. Trạng thái availability (đang rảnh / đang làm / tạm nghỉ) là suy ra chứ không lưu — tránh lệch dữ liệu.
stateDiagram-v2
direction LR
state profile_status {
INCOMPLETE --> PENDING_VERIFY: nộp hồ sơ
PENDING_VERIFY --> VERIFIED: HR duyệt
PENDING_VERIFY --> REJECTED: HR từ chối
}
state submission_status {
NEW --> SCREENING: HR sàng lọc
SCREENING --> QUALIFIED: đạt
SCREENING --> REJECTED: loại
SCREENING --> WITHDRAWN: rút
QUALIFIED --> MERGED: gộp trùng
}
state employment_status {
NONE --> ACTIVE: ký HĐ
ACTIVE --> SUSPENDED: tạm nghỉ
ACTIVE --> TERMINATED: chấm dứt
SUSPENDED --> ACTIVE: phục hồi
}
state assignment_status {
PLANNED --> ACTIVE: vào ca
ACTIVE --> PAUSED: tạm dừng
ACTIVE --> ENDED: kết thúc
ACTIVE --> TRANSFERRED: chuyển dự án
PLANNED --> CANCELLED: hủy
}
state risk_status {
NORMAL --> REVIEW: cảnh báo
REVIEW --> BLOCKED: khóa
REVIEW --> NORMAL: xác minh OK
}
stateDiagram-v2 direction LR [*] --> PENDING PENDING --> HR_APPROVED: APPROVE_HR HR_APPROVED --> APPROVED: APPROVE_FINAL APPROVED --> PAID: PAY PAID --> CLOSED: CLOSE PENDING --> REJECTED: REJECT HR_APPROVED --> REJECTED: REJECT PENDING --> CANCELLED: CANCEL (worker) HR_APPROVED --> CANCELLED: CANCEL (worker) CLOSED --> [*] CANCELLED --> [*] REJECTED --> [*]
stateDiagram-v2 direction LR [*] --> DRAFT DRAFT --> SENT: gửi SENT --> CONFIRMED: vendor OK (hoặc quá SLA) SENT --> DISPUTED: vendor báo lỗi DISPUTED --> CONFIRMED: HRP xử lý xong DISPUTED --> DRAFT: tạo version mới DISPUTED --> LOCKED: quá 2 vòng → FORCE LOCK (HR Manager/KT, audit) CONFIRMED --> LOCKED: chốt (bất biến) LOCKED --> PAID: chi trả PAID --> [*]
Toàn bộ — bất khả tước (G22)
Đọc toàn bộ có projection (ẩn CCCD/bank/selfie) — ghi qua Permission Pool (Q#22)
Toàn bộ — handover + audit
Theo team / branch / phân công (Q#12)
ownerId = mình HOẶC assignedToId = mình
Worker có assignment ACTIVE thuộc project mình quản lý
Theo assignment / scope tài chính
Chỉ CRM (lead/client + isPublic — Q#22)
Worker có source_claim vendorId = vendor mình
Worker có source_claim ctvId = mình
Chỉ bản thân
Nhân sự nội bộ (M9 — sau core)
Phân rã theo M0 → M9. Mỗi module có Definition of Done 10 tiêu chí: state-transition test, migration trên DB sạch + DB cũ, authz + data scope integration test, idempotency, audit, UI theo loại công việc, monitoring, demo thật, E2E vertical slice.
| Epic | Tên | Module | Wave | MD |
|---|---|---|---|---|
| E0 | Platform Core & Observability | M0 | 1, 4 | 40 |
| E1 | Auth & RBAC | M1 | 1 | 35 |
| E2 | Worker Portal + PWA | M2 | 3–4 | 50+20 |
| E3 | CRM, Projects & Staffing Order | M3 | 1, 3 | 55 |
| E4 | Vendor Portal + Confirm/Dispute | M4 | 3 | 25 |
| E5 | Talent Pool, Source Claims & Dedup | M5 | 1–3 | 45 |
| E6 | CTV Portal & Commission Ledger | M6 | 3–4 | 45 |
| E7 | Attendance Import & Timesheet | M7 | 2–3 | 50 |
| E8 | Payroll, Pay Run & Statements | M8 | 2, 4 | 65 |
| E9 | HRM (Nhân sự nội bộ) | M9 | Sau core | 40 |
| E10 | Sprint 0 (discovery + 2 spike) | — | 0 | 10 |
| E11 | UAT MVP | — | UAT | 10 |
| Tổng in-horizon (M0–M8 + UAT) | ≈ 490 | |||
≈ 490 MD = 470 module/PWA + Sprint 0 (10) + UAT (10) — đồng bộ UNIFIED_PLAN v4.22 sau G13/G16/G22.
64 feature ID nhóm A→H. Trạng thái: đã làm = có code + test xanh · phê duyệt = đã chốt trong plan (P0/P1 theo V4 §5) · đề xuất = P2 / ngoài MVP.
| ID | Tên | Module | Trạng thái |
|---|---|---|---|
| A-01 | Đăng nhập mật khẩu | M1 · M2 | phê duyệt |
| A-01b | Đăng nhập Zalo (flag) | M1 | phê duyệt · feature flag |
| A-01c | OTP step-up & reset MK | M1 | phê duyệt |
| A-01d | HR reset MK (mặt vs CCCD) | M1 · Admin | phê duyệt |
| A-02 | Hoàn thiện Profile | M2 · M5 | phê duyệt |
| A-03 | Đăng ký nhanh (CCCD + họ tên + MK) | M2 | phê duyệt |
| A-04 | Bảng tin việc làm (job board) | M2 · M3 | phê duyệt · Wave 1 sau M3 (Q#23) |
| A-05 | Ứng tuyển 1 chạm | M2 | phê duyệt |
| A-06 | Xem thông tin dự án | M2 · M3 | phê duyệt |
| A-07 | Chấm công in-site (máy vật lý) | M7 | đề xuất · ngoài MVP |
| A-08 | Check-in ngoài site (GPS) | M7 | phê duyệt |
| A-09 | Lịch sử chấm công | M2 · M7 | phê duyệt |
| A-10 | Phiếu lương (snapshot) | M2 · M8 | phê duyệt |
| A-11 | Đề nghị tạm ứng (2 bước) | M2 · M7 | phê duyệt |
| A-12 | Phản ánh / Khiếu nại | M7 | phê duyệt |
| A-13 | Cập nhật Bank/CCCD/SĐT | M2 | phê duyệt |
| ID | Tên | Module | Trạng thái |
|---|---|---|---|
| B-01 | Đăng ký CTV | M6 | phê duyệt |
| B-02 | Nhập người được giới thiệu | M6 · M5 | phê duyệt |
| B-03 | Dashboard theo dõi | M6 | phê duyệt |
| B-04 | Lịch sử hoa hồng (ledger) | M6 · M8 | phê duyệt |
| B-05 | Thông báo Zalo/SMS (flag) | M6 | phê duyệt |
| B-06 | Link giới thiệu (first-click wins) | M6 · M5 | phê duyệt |
| ID | Tên | Module | Trạng thái |
|---|---|---|---|
| C-01 | Đăng nhập Vendor (subdomain) | M4 | phê duyệt |
| C-02 | Xem Staffing Order | M4 · M3 | phê duyệt |
| C-03 | Nộp ứng viên | M4 · M5 | phê duyệt |
| C-04 | Xem trạng thái (lý do từ chối) | M4 | phê duyệt |
| C-05 | Confirm/Dispute statement | M4 · M8 | phê duyệt |
| C-06 | Xuất biên bản (PDF/Excel) | M4 · M8 | phê duyệt |
| C-07 | Kho hồ sơ vendor (nộp 1 chạm) | M4 · M5 | phê duyệt |
| ID | Tên | Module | Trạng thái |
|---|---|---|---|
| D-01 | CRUD Khách hàng (client_company) | M3 | phê duyệt |
| D-02 | CRUD Dự án (outsourcing_project) | M3 | phê duyệt |
| D-02b | CRUD Staffing Order (vị trí, ca, SL) | M3 | phê duyệt |
| D-03 | Quản lý Pipeline (list đơn giản) | M3 | phê duyệt |
| D-04 | CRUD Máy chấm công (adapter) | M7 | đề xuất · sau core |
| D-05 | Gán nhân sự (PLANNED→ACTIVE) | M3 · M5 | phê duyệt |
| D-05b | Chuyển dự án hàng loạt | M3 | phê duyệt |
| D-06 | Import từ Vendor (merge) | M3 · M5 · M4 | phê duyệt |
| D-07 | PM Field App (PWA hiện trường) | M3 · M7 | phê duyệt |
| ID | Tên | Module | Trạng thái |
|---|---|---|---|
| E-01 | Hồ sơ NLĐ (master + edit history) | M5 | phê duyệt |
| E-02 | Vòng đời trạng thái (5 SM) | M5 | phê duyệt |
| E-03 | Phân loại nguồn gốc (source_claims) | M5 | phê duyệt |
| E-04 | Bộ lọc nâng cao (tuổi/khu vực/kỹ năng) | M5 | phê duyệt |
| E-05 | Xuất Excel | M5 | phê duyệt |
| E-06 | Lịch sử tương tác (note/call) | M5 | phê duyệt |
| E-07 | Dedup/merge (≥2/3 khóa khớp) | M5 | phê duyệt |
| E-08 | Referral Guard (chặn CCCD) | M5 · M6 | phê duyệt |
| E-09 | AWOL detection (≥3 ngày) | M5 | phê duyệt |
| ID | Tên | Module | Trạng thái |
|---|---|---|---|
| F-01 | Webhook máy chấm công (adapter) | M7 | đề xuất · sau core |
| F-02 | Giao diện chốt công (3 tầng) | M7 | phê duyệt |
| F-03 | Tách công HRP vs Vendor | M7 · M8 | phê duyệt |
| F-04 | Xử lý ticket (phản ánh, tạm ứng) | M7 | phê duyệt |
| F-05 | Check-in GPS log (evidence + risk flag) | M7 | phê duyệt |
| F-06 | SOP ngoại lệ (mất điện, adj.) | M7 | phê duyệt |
| ID | Tên | Module | Trạng thái |
|---|---|---|---|
| G-01 | Tính lương HRP (pay run) | M8 | phê duyệt |
| G-02 | Đối soát Vendor (statement) | M8 | phê duyệt |
| G-02b | Billing Client (statement riêng) | M8 | phê duyệt |
| G-03 | Hoa hồng CTV (PER_HEAD + ledger) | M8 · M6 | phê duyệt |
| G-04 | Xuất file lương Excel | M8 | phê duyệt |
| G-05 | Quản lý công nợ | M8 | phê duyệt |
| G-06 | Dashboard doanh thu tạm tính | M8 · M7 | phê duyệt |
| ID | Tên | Module | Trạng thái |
|---|---|---|---|
| H-01 | CRUD nhân viên nội bộ | M9 | đề xuất · sau core |
| H-02 | Sơ đồ tổ chức (org chart) | M9 | đề xuất · sau core |
| H-03 | RBAC (Roles + Permissions) | M1 · M9 | phê duyệt |
| H-04 | Data-level security (scope + handover) | M1 · M5 · M9 | phê duyệt |
Tất cả API Worker (/api/m/*) đều ẩn trước worker các trường nhạy cảm: clientCompanyId, vendorId, agreedRateVnd, cccdChipData, internalNotes, riskStatus, bhxhAmount/pitAmount/taxableIncome/payRunId. Hai lớp chặn: L1 Prisma withAuthScope + L2 Postgres RLS.
| Endpoint | Mục đích | Fields top-level | Hidden từ worker |
|---|---|---|---|
GET /api/m/home | "Hôm nay của tôi" | worker, today, thisMonth, unreadCount, quickActions | clientCompanyId, vendorId, agreedRateVnd |
GET /api/m/shifts?week= | Lịch tuần | weekRange, shifts[], summary | assignedRateVnd, projectCode |
GET /api/m/payslips?month= | Phiếu lương | earnings[], totalEarnings, netPay, history[] | bhxhAmount, pitAmount, taxableIncome, payRunId |
GET /api/m/notifications | Thông báo | unreadCount, notifications[] | actorRole, retryCount, scheduledAt |
POST /api/m/notifications/:id/read | Đánh dấu đã đọc | 204 No Content | — |
GET /api/m/tickets | Đơn của tôi | tickets[] | workerId, reviewerId, version |
GET /api/m/profile | Hồ sơ | fullName, phone, nationalId (mask), bankAccount (masked) | cccdChipData, internalNotes, riskStatus |
NLĐ gross 25.000.000đ/tháng, 1 người phụ thuộc (NPT). Toàn bộ BHXH/TNCN theo Luật 2025 — chốt số từng đồng.
8% BHXH + 1.5% BHYT + 1% BHTN
2.625.000đ
Theo Luật TNCN
11.000.000đ
Đăng ký đúng mẫu 02/05
4.400.000đ
Gross − BHXH − giảm trừ
6.975.000đ (bậc 2, 10%)
10% × 6.975.000 − 0.25tr
447.500đ
Gross − BHXH − TNCN
21.927.500đ
BHXH doanh nghiệp (cost-to-co): 22% = 17.5% BHXH + 3% BHYT + 1% BHTN + 0.5% BHTNLD = 5.500.000đ. Chi phí tổng một lao động gross 25M = 30.500.000đ.
| Key | Type | Default | Nguồn |
|---|---|---|---|
OVERTIME_TOLERANCE_MIN | NUMBER | 15 | Odoo |
OT_15_RATE | MULTIPLIER | 1.5 | Odoo |
OT_20_RATE | MULTIPLIER | 2.0 | BLLĐ 2019 |
OT_30_RATE | MULTIPLIER | 3.0 | BLLĐ 2019 (ngày lễ) |
STANDARD_HOURS_PER_DAY | NUMBER | 8 | Nội bộ |
STANDARD_DAYS_PER_MONTH | NUMBER | 26 | Nội bộ |
MIN_WAGE_REGION_1..4 | MONEY | 4.960/4.410/3.860/3.450 (nghìn đ) | NĐ 74/2024 |
INSURANCE_SALARY_CAP | MONEY | 99.200.000 | Luật BHXH |
TNCN_GIAM_TRU_BAN_THAN | MONEY | 11.000.000 | Luật TNCN |
TNCN_GIAM_TRU_NGUOI_PHUC_THUOC | MONEY | 4.400.000 | Luật TNCN |
BHXH/BHYT/BHTN_RATE_EMPLOYEE | PERCENT | 0.08 / 0.015 / 0.01 | QĐ BHXH |
BHXH/BHYT/BHTN/BHTNLD_RATE_EMPLOYER | PERCENT | 0.175 / 0.03 / 0.01 / 0.005 | Luật BHXH |
REFERRAL_GUARD_DAYS | NUMBER | 7 | V4.3 G11 |
AWOL_THRESHOLD_DAYS | NUMBER | 3 | V4.10 G18-B5 |
PIT_FLAT_RATE | PERCENT | 0.10 | V4.10 G18-B6 |
PIT_FLAT_THRESHOLD_VND | MONEY | 2.000.000 | V4.10 G18-B6 |
PIT_FLAT_MONTHLY_AGGREGATION | BOOLEAN | true | V4.11 G19-B9 |
DEBT_RECOVERY_MAX_PERCENT | PERCENT | 0.30 | V4.11 G19-B7 |
INSURANCE_MIN_WORK_DAYS | NUMBER | 14 | V4.12 G20-B10 |
IMPORT_MAX_RETRY | NUMBER | 3 | V4.13 G21-T15 |
COMMISSION_NETTING_ENABLED | BOOLEAN | true | V4.13 G21-B14 |
Không cần đốt tiền ngày đầu. MVP chạy trên free tier, lên production khi có khách thật, và về VPS riêng khi cần kiểm soát data + tiết kiệm dài hạn.
~$0–10/tháng
~$60–90/tháng
~$70–120/tháng + vận hành
Một lao động có thể được nhiều người tiến cử (HR/Sale, Vendor, CTV). Hệ thống dùng CCCD làm chìa khóa: biết đã có trong dữ liệu chưa, do ai đưa vào, ai đang hưởng hoa hồng — và tự động chặn người nộp sau. CTV/Sale có link giới thiệu riêng để rải — người đăng ký theo link nào tự ghi nguồn cho chủ link đó, vẫn chịu đầy đủ luật chặn.
Kể cả hồ sơ đang chờ duyệt hay đã bị từ chối. Người đầu tiên có 7 ngày xử lý; sau đó nếu bị từ chối hoặc bỏ lửng → người khác mới được tiến cử lại. Số ngày điều chỉnh được.
CTV giới thiệu còn quyền lợi (người lao động vẫn đang làm) → không ai khác được nhận người này làm nguồn của mình.
Lao động đang được đối tác cung ứng trả lương → không được chuyển nguồn, tránh cướp người giữa các đối tác.
Vendor/CTV nộp lại nhân sự trong kho của chính mình — không phải nhập lại. Luật chặn chỉ áp dụng với nguồn KHÁC; người đang đi làm thì chuyển qua HR điều chuyển.
Mỗi CTV/Sale có link riêng để rải. Người đăng ký theo link nào tự ghi nguồn cho chủ link — bấm nhiều link chỉ tính cái đầu tiên, hiệu lực 30 ngày. Kể cả khi Zalo tự xóa cookie, mã vẫn được giữ (theo link + ô điền tay). Vẫn chịu đầy đủ các luật chặn ở trên.
Ba trường hợp hợp lệ (đối tác đưa người thật đến xưởng / hồ sơ đầu bỏ lửng / hợp đồng hết hạn) kèm bằng chứng, lưu dấu vết và thống kê hàng tuần chống thiên vị.
sequenceDiagram
autonumber
actor V as 🏢 Vendor Long Vân
participant VP as 🌐 Cổng vendor
participant SYS as ⚙️ HRP Core
participant HR as 👔 HR
actor NLD as 👷 Ứng viên
participant P as 📱 App HRP
V->>VP: Đăng nhập (tài khoản vendor riêng)
V->>VP: Upload hồ sơ: tên, CCCD, SĐT, ảnh
VP->>SYS: POST /api/vendors/applicants
SYS->>SYS: Check 1: tiến cử 7 ngày?
SYS->>SYS: Check 2: đang hưởng hoa hồng?
SYS->>SYS: Check 3: đang hưởng lương vendor?
alt Trùng 1 trong 3 điều kiện
SYS-->>VP: ❌ BLOCKED + lý do
VP->>V: Ứng viên đã có người tiến cử
else OK
SYS->>HR: 🔔 Hồ sơ mới
HR->>NLD: SMS + Zalo nhận hồ sơ
NLD->>P: Đăng ký bằng CCCD
P->>SYS: Xác nhận đúng người
HR->>SYS: ✅ Duyệt → MATCHED
SYS-->>VP: Hồ sơ đã duyệt
alt Sau 30 ngày làm liên tục
SYS-->>VP: 💰 Hoa hồng giữ chân
end
end
Ba loại đơn trong một hệ thống: phản ánh sai công · tạm ứng · xin nghỉ. HR quyết định "có hợp lệ không", Kế toán quyết định "chi từ quỹ" — tiền chỉ chuyển vào tài khoản ngân hàng đã xác thực. Mỗi đơn có hạn xử lý tự động theo mức khẩn (Auto SLA: URGENT 4h · HIGH 24h · NORMAL 48h · LOW 72h) và hệ thống tự nhắc người phụ trách khi sắp trễ.
stateDiagram-v2 [*] --> CHODUYET: Người lao động tạo đơn CHODUYET --> HRXACNHAN: HR xác nhận hợp lệ CHODUYET --> TUCHOI: Từ chối (ghi lý do) CHODUYET --> RUTDON: Tự rút đơn HRXACNHAN --> DUYET: Kế toán duyệt chi HRXACNHAN --> TUCHOI HRXACNHAN --> RUTDON DUYET --> DACHI: Kế toán chi tiền DUYET --> DONG: Đóng đơn DACHI --> DONG DONG --> [*]
sequenceDiagram autonumber actor NLD as 👷 Người lao động participant APP as 📱 App HRP participant HR as 👔 HR participant KT as 💰 Kế toán participant BANK as 🏦 Ngân hàng participant AUD as 📋 Audit log NLD->>APP: Tạo đơn tạm ứng 2.000.000 đ APP->>APP: Validate hạn mức theo policy/project (Q#8) APP->>HR: 🔔 HĐ-2026-0089 chờ duyệt HR->>APP: Xem hồ sơ + lịch sử đơn HR->>APP: ✅ Xác nhận hợp lệ HR->>AUD: Ghi HR xác nhận 14:32 HR->>KT: 🔔 Kế toán duyệt chi KT->>APP: Kiểm tra quỹ tạm ứng KT->>APP: ✅ Duyệt chi KT->>AUD: Ghi KT duyệt 15:10 KT->>BANK: Chuyển 2.000.000 đ → STK ****5678 BANK-->>KT: ✅ Thành công KT->>APP: Trạng thái = ĐÃ CHI APP->>NLD: 🔔 Đã chuyển vào VCB ***5678 APP->>AUD: Ghi đóng đơn 15:14
Dù vào từ nhiều nguồn — hệ thống gộp về đúng một hồ sơ; tại một thời điểm chỉ làm ở 1 dự án.
Ai đưa người vào được ghi rõ; người nộp sau bị chặn tự động theo luật.
Kỳ công, bảng lương, biên bản đối soát — sau khi khóa chỉ điều chỉnh kỳ sau kèm lý do.
Không tự đổi được số tài khoản — muốn đổi phải xác nhận thêm hoặc nhờ HR. Không bao giờ có lương âm.
Mọi ứng viên đều qua HR duyệt — tránh hồ sơ rác và tranh chấp.
Chi tiết BHXH, thuế chỉ kế toán xem — tránh hiểu lầm "sao lương bị trừ".
Mã nhân viên dự án / mã HRP / CCCD + mật khẩu. Đổi SIM không mất tài khoản; sai 5 lần khóa 15 phút.
Ảnh CCCD, ảnh chân dung lưu riêng; mọi lượt xem đều có dấu vết.
Ưu tiên vận hành nội bộ trước (~12 tuần), mở 3 cổng bên ngoài sau, đầy đủ tài chính vào tháng 2/2027. Mỗi giai đoạn có milestone cụ thể, không chạy đoán.
gantt title HRP v4.20 — Lộ trình triển khai dateFormat YYYY-MM-DD axisFormat %d/%m section Sprint 0 — Discovery (2 tuần) Dữ liệu thật + state model + 2 spike :s0, 2026-08-24, 14d section Wave 1 — Backbone vận hành (~90 MD) M0 Platform + M1 Auth + M3 core + M5 :w1a, 2026-09-07, 35d A-04 Job board công cộng (kéo về W1, Q#23) :w1b, after w1a, 14d section Wave 2 — Chấm công & Đối soát (~80 MD) M7 import/chốt + M8 tối giản :w2, 2026-10-12, 28d section UAT MVP (2 tuần) Chạy dữ liệu thật + đào tạo :uat, 2026-11-09, 14d Go-live MVP nội bộ :milestone, 2026-11-23, 0d section Wave 3 — Mở 3 cổng bên ngoài (~145 MD) Worker Portal + PWA + GPS :w3a, 2026-11-23, 21d Vendor Portal :w3b, after w3a, 21d CTV Portal core :w3c, after w3b, 14d M3 hoàn thiện + M5 dedup/export :w3d, after w3c, 14d M7 ticket (ticket workflow hoàn chỉnh) :w3e, after w3d, 14d PM Field App (PWA hiện trường) :w3f, after w3e, 14d section Wave 4 — Tài chính đầy đủ (~90 MD) M8 đầy đủ (pay run, payslip, reports) :w4a, 2027-01-18, 28d M6 commission ledger :w4b, after w4a, 14d M0 hardening :w4c, after w4b, 14d Go-live M0–M8 đầy đủ :milestone, 2027-02-22, 0d section Sau core (~40 MD) M9 HRM + mở rộng theo điều kiện :m9, 2027-02-22, 28d section Phase Compliance (sau cùng) TNCN/BHXH phức tạp (mẫu 02/05/07/TK1-TS) :comp, after m9, 21d
Thiết kế đã khép kín — đa số điểm dưới đây đã được chốt trong V4 §21/G28; Q#24, Q#25 chốt ngày 16/08 (V4.22); chỉ còn dữ liệu mẫu là mở:
Thiết kế hoàn chỉnh — chỉ còn chờ dữ liệu thật của bạn để bắt đầu.
Liên hệ HRP