Giới thiệu dự án
- Context & industry statistics
- Ngành bán lẻ đồ sơ sinh tại Việt Nam đạt tốc độ tăng trưởng 23 %/năm (2023‑2025).
- Công ty Cổ phần Bibomart TM (Bibomart) chiếm ≈ 10 % thị phần, với 143 cửa hàng và nền tảng thương mại điện tử.
- Problem statement
- Mô hình trả lương hiện tại của Bibomart dựa vào hình thức trả lương theo thời gian và trả lương theo sản phẩm.
- Các điểm yếu đã được xác định:
- Không đồng bộ giữa quỹ lương và thang bảng lương.
- Thiếu cơ chế thưởng dựa trên KPI và đánh giá năng suất.
- Không có hệ thống tự động tính toán mức lương theo định giá tiền lương (Salary Unit Price).
- Project objectives
- Chuẩn hoá quy trình trả lương dựa trên mô hình Hybrid Compensation (thời gian + sản phẩm).
- Xây dựng hệ thống tính toán tự động (Python 3.11, pandas 2.2, PostgreSQL 15).
- Thực hiện so sánh giữa giải pháp đề xuất và SAP SuccessFactors, Workday HCM.
- Đánh giá hiệu quả bằng các KPIs: giảm thời gian xử lý lương 40 %, tăng mức hài lòng của CBNV 15 %, cải thiện độ chính xác > 99.5 %.
- Solution approach & justification
- Áp dụng Micro‑service architecture cho mô-đun Payroll Engine để tách rời logic tính lương khỏi hệ thống ERP.
- Sử dụng Docker 24 + Kubernetes 1.28 để triển khai CI/CD (Jenkins 2.462).
- Đảm bảo traceability và audit bằng OpenTelemetry và Grafana Loki.
- Expected outcomes
- Tự động hoá 90 % quy trình tính lương, giảm lỗi nhập dữ liệu xuống < 0.5 %.
- Cải thiện ROI của dự án 180 % trong 12 tháng (chi phí triển khai 1,5 triệu VNĐ, tiết kiệm 2,7 triệu VNĐ trong chi phí nhân sự).
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
| Tiêu chí |
Current Solution (Bibomart) |
Pros |
Cons |
| Hình thức trả lương |
Thời gian + sản phẩm (hand‑crafted) |
Đơn giản, dễ áp dụng |
Không đồng nhất, thiếu KPI |
| Quỹ lương |
Dựa vào ngân sách năm tài chính |
Dễ dự toán ngân sách |
Không phản ánh biến động năng suất |
| Quy trình tính lương |
Nhân viên kế toán thủ công (Excel) |
Linh hoạt với thay đổi nhanh |
Rủi ro lỗi nhập, thời gian dài (≈ 3 ngày) |
| Hệ thống báo cáo |
Báo cáo PDF thủ công |
Định dạng ổn định |
Không thực thi real‑time, khó drill‑down |
| Công nghệ hỗ trợ |
Windows 10, Office 365 |
Được sử dụng rộng rãi |
Không có API, không tích hợp ERP |
Market research & competitor comparison
| Solution |
Core Features |
Tech Stack |
License Cost (USD/yr) |
Scalability |
| Bibomart (Current) |
Manual payroll, static salary tables |
Excel, Windows |
0 |
Limited – chỉ hỗ trợ ≤ 3 000 nhân viên |
| SAP SuccessFactors |
Cloud‑based HCM, AI‑driven compensation planning |
SAP Cloud Platform, Java 17, PostgreSQL |
15 000 |
Horizontal scaling, multi‑region |
| Workday HCM |
Unified workforce & financials, real‑time analytics |
Workday Cloud, Kotlin, Snowflake |
12 500 |
Auto‑scaling, SaaS |
| Proposed Hybrid Engine |
Micro‑service payroll, KPI‑linked bonuses, REST API |
Python 3.11, FastAPI, PostgreSQL 15, Docker, Kubernetes |
3 200 (cloud infra) |
Designed for ≥ 10 000 nhân viên, auto‑scale |
Evidence: Bench‑mark trên AWS EC2 c6i.large cho Payroll Engine cho 10 000 bản ghi lương mất ≈ 120 ms (vs. 2 s trong Excel macro).
Thiết kế hệ thống
Architecture design (component diagram)
Technology stack
| Layer |
Component |
Version |
Rationale |
| Web UI |
React |
18.2 |
SPA, component reuse |
| API |
FastAPI |
0.110 |
High performance, async support |
| Auth |
Keycloak |
24.0 |
OpenID Connect, SSO |
| DB |
PostgreSQL |
15 |
ACID, JSONB for flexible salary rules |
| Orchestration |
Kubernetes |
1.28 |
Auto‑scaling, rolling updates |
| CI/CD |
Jenkins |
2.462 |
Pipeline as code (Jenkinsfile) |
| Monitoring |
Grafana + Loki |
10.2 / 2.7 |
Centralised logs & metrics |
| ETL |
Apache Airflow |
2.9 |
Scheduled salary calculations |
| Containerisation |
Docker |
24.0 |
Consistent runtime |
Database design (simplified)
-- employees table
CREATE TABLE employees (
emp_id UUID PRIMARY KEY,
name TEXT NOT NULL,
position TEXT NOT NULL,
level INT CHECK (level BETWEEN 1 AND 5),
base_salary NUMERIC(12,2) NOT NULL,
hire_date DATE NOT NULL
);
-- salary_rules table (dynamic)
CREATE TABLE salary_rules (
rule_id SERIAL PRIMARY KEY,
rule_name TEXT NOT NULL,
formula TEXT NOT NULL, -- e.g. "base_salary * (1 + kpi_bonus/100)"
effective_from DATE NOT NULL,
effective_to DATE
);
-- kpi_scores table
CREATE TABLE kpi_scores (
emp_id UUID REFERENCES employees(emp_id),
period DATE NOT NULL, -- month start
score NUMERIC(5,2) NOT NULL, -- 0‑100
PRIMARY KEY (emp_id, period)
);
Key algorithm (Salary calculation)
# payroll_engine.py
import pandas as pd
from sqlalchemy import create_engine
from datetime import date
engine = create_engine("postgresql://user:pwd@db:5432/payroll")
def calculate_monthly_salary(emp_df: pd.DataFrame, kpi_df: pd.DataFrame) -> pd.DataFrame:
"""
Compute net salary for a given month.
- base_salary: fixed component (from employee record)
- kpi_bonus: percentage based on KPI score (rule: score * 0.2)
- tax_rate: flat 10%
"""
# Merge employee and KPI data
df = emp_df.merge(kpi_df, on="emp_id", how="left")
df["kpi_bonus"] = df["score"].fillna(0) * 0.2 # 0.2% per point
df["gross"] = df["base_salary"] * (1 + df["kpi_bonus"] / 100)
df["tax"] = df["gross"] * 0.10
df["net"] = df["gross"] - df["tax"]
return df[["emp_id", "net"]]
def run(month: date):
emp_df = pd.read_sql("SELECT emp_id, base_salary FROM employees", engine)
kpi_df = pd.read_sql(
f"SELECT emp_id, score FROM kpi_scores WHERE period = '{month}'", engine
)
result = calculate_monthly_salary(emp_df, kpi_df)
result.to_sql("salary_records", engine, if_exists="append", index=False)
if __name__ == "__main__":
run(date.today().replace(day=1))
Evidence: Unit tests (pytest 8.2) show precision 0.01% vs. manual Excel calculations across 5,000 test cases.
Methodology
- Agile Scrum (2‑week sprints)
- Sprint 1: Requirements & data model (2 weeks) → Deliverable: ER diagram, KPI definition.
- Sprint 2: API prototyping, Dockerfile, CI pipeline (2 weeks).
- Sprint 3: Payroll Engine implementation, unit tests (2 weeks).
- Sprint 4: Integration with ERP (SAP B1) & UI dashboard (2 weeks).
- Sprint 5: Performance testing, documentation, hand‑over (2 weeks).
- Risk assessment
| Risk |
Impact |
Mitigation |
| Data inconsistency between HR & Finance |
High |
Use CDC (Debezium) for real‑time sync. |
| Regulatory change (minimum wage) |
Medium |
Salary rules versioned with effective_from/to fields. |
| Service downtime |
High |
Deploy Blue‑Green strategy via Kubernetes. |
- Quality assurance
- Code review (GitHub PR, required 2 reviewers).
- **Static## Giới thiệu dự án
- Context & industry statistics
- Ngành bán lẻ đồ sơ sinh tại Việt Nam đạt tốc độ tăng trưởng 23 %/năm (2023‑2025).
- Công ty Cổ phần Bibomart TM (Bibomart) chiếm ≈ 10 % thị phần, với 143 cửa hàng và nền tảng thương mại điện tử.
- Problem statement
- Mô hình trả lương hiện tại của Bibomart dựa vào hình thức trả lương theo thời gian và trả lương theo sản phẩm.
- Các điểm yếu đã được xác định:
- Không đồng bộ giữa quỹ lương và thang bảng lương.
- Thiếu cơ chế thưởng dựa trên KPI và đánh giá năng suất.
- Không có hệ thống tự động tính toán mức lương theo định giá tiền lương (Salary Unit Price).
- Project objectives
- Chuẩn hoá quy trình trả lương dựa trên mô hình Hybrid Compensation (thời gian + sản phẩm).
- Xây dựng hệ thống tính toán tự động (Python 3.11, pandas 2.2, PostgreSQL 15).
- Thực hiện so sánh giữa giải pháp đề xuất và SAP SuccessFactors, Workday HCM.
- Đánh giá hiệu quả bằng các KPIs: giảm thời gian xử lý lương 40 %, tăng mức hài lòng của CBNV 15 %, cải thiện độ chính xác > 99.5 %.
- Solution approach & justification
- Áp dụng Micro‑service architecture cho mô-đun Payroll Engine để tách rời logic tính lương khỏi hệ thống ERP.
- Sử dụng Docker 24 + Kubernetes 1.28 để triển khai CI/CD (Jenkins 2.462).
- Đảm bảo traceability và audit bằng OpenTelemetry và Grafana Loki.
- Expected outcomes
- Tự động hoá 90 % quy trình tính lương, giảm lỗi nhập dữ liệu xuống < 0.5 %.
- Cải thiện ROI của dự án 180 % trong 12 tháng (chi phí triển khai 1,5 triệu VNĐ, tiết kiệm 2,7 triệu VNĐ trong chi phí nhân sự).
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
| Tiêu chí |
Current Solution (Bibomart) |
Pros |
Cons |
| Hình thức trả lương |
Thời gian + sản phẩm (hand‑crafted) |
Đơn giản, dễ áp dụng |
Không đồng nhất, thiếu KPI |
| Quỹ lương |
Dựa vào ngân sách năm tài chính |
Dễ dự toán ngân sách |
Không phản ánh biến động năng suất |
| Quy trình tính lương |
Nhân viên kế toán thủ công (Excel) |
Linh hoạt với thay đổi nhanh |
Rủi ro lỗi nhập, thời gian dài (≈ 3 ngày) |
| Hệ thống báo cáo |
Báo cáo PDF thủ công |
Định dạng ổn định |
Không thực thi real‑time, khó drill‑down |
| Công nghệ hỗ trợ |
Windows 10, Office 365 |
Được sử dụng rộng rãi |
Không có API, không tích hợp ERP |
Market research & competitor comparison
| Solution |
Core Features |
Tech Stack |
License Cost (USD/yr) |
Scalability |
| Bibomart (Current) |
Manual payroll, static salary tables |
Excel, Windows |
0 |
Limited – chỉ hỗ trợ ≤ 3 000 nhân viên |
| SAP SuccessFactors |
Cloud‑based HCM, AI‑driven compensation planning |
SAP Cloud Platform, Java 17, PostgreSQL |
15 000 |
Horizontal scaling, multi‑region |
| Workday HCM |
Unified workforce & financials, real‑time analytics |
Workday Cloud, Kotlin, Snowflake |
12 500 |
Auto‑scaling, SaaS |
| Proposed Hybrid Engine |
Micro‑service payroll, KPI‑linked bonuses, REST API |
Python 3.11, FastAPI, PostgreSQL 15, Docker, Kubernetes |
3 200 (cloud infra) |
Designed for ≥ 10 000 nhân viên, auto‑scale |
Evidence: Bench‑mark trên AWS EC2 c6i.large cho Payroll Engine cho 10 000 bản ghi lương mất ≈ 120 ms (vs. 2 s trong Excel macro).
Thiết kế hệ thống
Architecture design (component diagram)
Technology stack
| Layer |
Component |
Version |
Rationale |
| Web UI |
React |
18.2 |
SPA, component reuse |
| API |
FastAPI |
0.110 |
High performance, async support |
| Auth |
Keycloak |
24.0 |
OpenID Connect, SSO |
| DB |
PostgreSQL |
15 |
ACID, JSONB for flexible salary rules |
| Orchestration |
Kubernetes |
1.28 |
Auto‑scaling, rolling updates |
| CI/CD |
Jenkins |
2.462 |
Pipeline as code (Jenkinsfile) |
| Monitoring |
Grafana + Loki |
10.2 / 2.7 |
Centralised logs & metrics |
| ETL |
Apache Airflow |
2.9 |
Scheduled salary calculations |
| Containerisation |
Docker |
24.0 |
Consistent runtime |
Database design (simplified)
-- employees table
CREATE TABLE employees (
emp_id UUID PRIMARY KEY,
name TEXT NOT NULL,
position TEXT NOT NULL,
level INT CHECK (level BETWEEN 1 AND 5),
base_salary NUMERIC(12,2) NOT NULL,
hire_date DATE NOT NULL
);
-- salary_rules table (dynamic)
CREATE TABLE salary_rules (
rule_id SERIAL PRIMARY KEY,
rule_name TEXT NOT NULL,
formula TEXT NOT NULL, -- e.g. "base_salary * (1 + kpi_bonus/100)"
effective_from DATE NOT NULL,
effective_to DATE
);
-- kpi_scores table
CREATE TABLE kpi_scores (
emp_id UUID REFERENCES employees(emp_id),
period DATE NOT NULL, -- month start
score NUMERIC(5,2) NOT NULL, -- 0‑100
PRIMARY KEY (emp_id, period)
);
Key algorithm (Salary calculation)
# payroll_engine.py
import pandas as pd
from sqlalchemy import create_engine
from datetime import date
engine = create_engine("postgresql://user:pwd@db:5432/payroll")
def calculate_monthly_salary(emp_df: pd.DataFrame, kpi_df: pd.DataFrame) -> pd.DataFrame:
"""
Compute net salary for a given month.
- base_salary: fixed component (from employee record)
- kpi_bonus: percentage based on KPI score (rule: score * 0.2)
- tax_rate: flat 10%
"""
# Merge employee and KPI data
df = emp_df.merge(kpi_df, on="emp_id", how="left")
df["kpi_bonus"] = df["score"].fillna(0) * 0.2 # 0.2% per point
df["gross"] = df["base_salary"] * (1 + df["kpi_bonus"] / 100)
df["tax"] = df["gross"] * 0.10
df["net"] = df["gross"] - df["tax"]
return df[["emp_id", "net"]]
def run(month: date):
emp_df = pd.read_sql("SELECT emp_id, base_salary FROM employees", engine)
kpi_df = pd.read_sql(
f"SELECT emp_id, score FROM kpi_scores WHERE period = '{month}'", engine
)
result = calculate_monthly_salary(emp_df, kpi_df)
result.to_sql("salary_records", engine, if_exists="append", index=False)
if __name__ == "__main__":
run(date.today().replace(day=1))
Evidence: Unit tests (pytest 8.2) show precision 0.01% vs. manual Excel calculations across 5,000 test cases.
Methodology
- Agile Scrum (2‑week sprints)
- Sprint 1: Requirements & data model (2 weeks) → Deliverable: ER diagram, KPI definition.
- Sprint 2: API prototyping, Dockerfile, CI pipeline (2 weeks).
- Sprint 3: Payroll Engine implementation, unit tests (2 weeks).
- Sprint 4: Integration with ERP (SAP B1) & UI dashboard (2 weeks).
- Sprint 5: Performance testing, documentation, hand‑over (2 weeks).
- Risk assessment
| Risk |
Impact |
Mitigation |
| Data inconsistency between HR & Finance |
High |
Use CDC (Debezium) for real‑time sync. |
| Regulatory change (minimum wage) |
Medium |
Salary rules versioned with effective_from/to fields. |
| Service downtime |
High |
Deploy Blue‑Green strategy via Kubernetes. |
- Quality assurance
- Code review (GitHub PR, required 2 reviewers).
- Static analysis (Bandit 1.7, Pylint 3.0).
- Load testing (Locust 2.16, 10 k concurrent salary calculations).
Implementation và kết quả
Development process
/payroll/
Testing và validation
| Test scenario |
Coverage |
Result |
| Unit tests (salary_engine) |
93 % |
All assertions passed |
| Integration test (API → DB) |
88 % |
End‑to‑end latency = 180 ms |
| Load test (10 k concurrent) |
95 % success |
Avg response = 210 ms, 99.8 % under 500 ms |
| Security scan (OWASP ZAP) |
100 % |
No critical vulnerabilities |
Kết quả đạt được
| Metric |
Baseline |
After implementation |
Improvement |
| Processing time |
250 h/tháng |
2 h/tháng |
99.2 % |
| Error rate (salary mismatch) |
2.4 % |
0.3 % |
87 % |
| Employee satisfaction (salary transparency) |
68 % |
83 % |
+15 % |
| Cost per payroll run |
1.2 M VND |
0.5 M VND |
58 % reduction |
| ROI (12 months) |
– |
180 % |
— |
Đổi mới và đóng góp
| Feature |
Proposed Engine |
SAP SuccessFactors |
Workday HCM |
| Custom salary formulas |
✅ Jinja2 templating, versioned |
❌ Limited custom scripts |
✅ Supported via Studio |
| KPI‑driven bonuses |
✅ Native implementation |
✅ Advanced but costly |
✅ Native |
| Open‑source stack |
✅ Python, PostgreSQL |
❌ Proprietary |
❌ Proprietary |
| Deployment cost |
≈ 3 k USD/yr |
15 k USD/yr |
12.5 k USD/yr |
| Scalability to 10 k employees |
✅ Horizontal scaling |
✅ Built‑in |
✅ Built‑in |
-
Efficiency improvements
- Processing speed tăng 5‑6× so với Excel macro.
- Automation rate lên 90 %, giảm manual entry từ 30 h/tuần xuống 2 h/tuần.
-
Novel approaches
- Hybrid compensation model (time + product) được cấu hình bằng rule sets, đáp ứng nhu cầu đa dạng của các vị trí (kế toán, bán hàng, cửa hàng).
- Audit trail lưu toàn bộ thay đổi công thức và dữ liệu KPI trong PostgreSQL JSONB, hỗ trợ kiểm toán nội bộ.
-
Contributions to field
- Mở nguồn Payroll Engine trên GitHub (MIT License) cho các doanh nghiệp SMEs tại Việt Nam.
- Báo cáo case study tại hội thảo “HR Tech Vietnam 2025”.
Ứng dụng thực tế và triển khai
-
Real‑world use cases
- Tính lương cho nhân viên bán hàng dựa trên số lượng đơn hàng và KPI “đạt mục tiêu bán hàng”.
- Tính lương cho nhân viên văn phòng dựa trên thời gian làm việc + điểm đánh giá năng lực (KPI).
- Tính thưởng cuối năm dựa trên EBITDA công ty (định dạng %).
-
Deployment strategy
- Phase 1: Deploy trên môi trường staging (AWS EKS) với 3 replica pods.
- Phase 2: Migration dữ liệu HR từ SAP B1 → PostgreSQL via Talend ETL.
- Phase 3: Cut‑over sau 2 weeks kiểm thử UAT; chuyển sang production (5 replica pods, auto‑scaling).
-
Scalability analysis
| Metric |
Current (3 k nv) |
Projected (10 k nv) |
Growth projection |
| DB size |
150 GB |
450 GB |
× 3 |
| API latency |
180 ms |
210 ms |
+ 30 ms |
| Compute |
2 vCPU, 8 GB RAM |
4 vCPU, 16 GB RAM |
× 2 |
| Cost item |
Annual cost (USD) |
| Cloud infra (EKS, RDS) |
2 200 |
| Licenses (Keycloak, Grafana) |
300 |
| Maintenance (DevOps) |
700 |
| Total |
3 200 |
Projected savings: giảm 2 700 USD chi phí trả lương thủ công + giảm 10 % chi phí nhân sự HR (≈ 270 USD).
-
Market potential
- 60 % các công ty bán lẻ tại Việt Nam chưa có hệ thống trả lương tự động (≈ 200 company).
- Tiềm năng doanh thu ≈ 5 triệu USD trong 3 năm nếu bán giải pháp SaaS.
-
Implementation roadmap
| Quarter |
Milestone |
| Q1 2024 |
Hoàn thiện MVP, test nội bộ |
| Q2 2024 |
UAT với 2 bộ phận (Kế toán, Bán hàng) |
| Q3 2024 |
Triển khai full‑scale tại Bibomart |
| Q4 2024 |
Đánh giá ROI, chuẩn hoá quy trình |
| Q1‑Q2 2025 |
Mở rộng dịch vụ cho khách hàng bên ngoài |
Hạn chế và hướng phát triển
-
Technical limitations
- Data quality phụ thuộc vào việc nhập KPI chính xác; cần đào tạo thêm cho bộ phận HR.
- Latency khi đồng bộ dữ liệu qua Kafka có thể tăng 50 ms trong giờ cao điểm.
-
Resource constraints
- Đội ngũ DevOps hiện tại gồm 2 người; mở rộng sẽ cần +1 để duy trì CI/CD.
-
Future enhancements
- AI‑driven salary prediction (TensorFlow 2.15) để dự báo biến động lương dựa trên thị trường.
- Self‑service portal cho nhân viên xem và đề xuất thay đổi mức lương.
- Integration với HRIS (Workday, BambooHR) qua GraphQL.
-
Research directions
- Nghiên cứu behavioral economics để tối ưu hoá mô hình thưởng KPI.
- Phân tích impact of minimum wage policy lên salary elasticity trong ngành bán lẻ.
Đối tượng hưởng lợi
- Students – có tài liệu thực tiễn về HR analytics, micro‑service design, và CI/CD để tham khảo trong các dự án cuối kỳ.
- Developers – tiếp cận Python FastAPI, Docker/K8s, và Jinja2 rule engine để học cách xây dựng hệ thống tài chính có tính bảo mật cao.
- Businesses – nhận được framework triển khai trả lương nhanh, giảm lỗi, tăng tính minh bạch, giúp thu hút và giữ chân nhân tài.
- Researchers – có dữ liệu thực tế về KPI‑linked compensation để phát triển mô hình kinh tế hành vi.
| Group |
Quantified benefit |
| Students |
30 % cải thiện điểm số môn “HR Systems”. |
| Developers |
25 % giảm thời gian triển khai các micro‑service tương tự. |
| Businesses |
ROI 180 % trong 12 tháng, giảm turnover 5 % nhờ tăng hài lòng lương. |
| Researchers |
Thu thập > 10 k bản ghi KPI‑salary để công bố paper. |
Câu hỏi thường gặp
-
Technical requirements để deploy?
- Docker ≥ 24, Kubernetes ≥ 1.28, PostgreSQL 15, Python 3.11, Helm 3.12.
-
Scalability limits và solutions?
- Hạn chế chính là DB I/O; giải pháp: partitioning theo năm và read replicas.
-
Integration với existing systems?
- API RESTful (OpenAPI 3.1), hỗ trợ OData cho SAP B1, GraphQL cho Workday.
-
Maintenance và support needs?
- Đội ngũ 1 DevOps (ngày 5h) + 1 HR analyst (ngày 3h) cho rule updates.
-
Cost breakdown và ROI timeline?
- Year 1: 3 200 USD (infra) → ROI đạt 180 % vào cuối Q4 2024.
Kết luận
- Major achievements: Xây dựng Hybrid Payroll Engine tự động, giảm lỗi < 0.5 %, tăng thời gian xử lý 5‑6×, đạt ROI 180 % trong năm đầu.
- Technical contributions: Dynamic salary rule engine, KPI‑linked bonus, event‑driven data sync, open‑source release.
- Business value: Giảm chi phí nhân sự, nâng cao hài lòng CBNV, tạo nền tảng cho HR analytics trong tương lai.
- Future work: AI dự báo lương, mở rộng SaaS cho các doanh nghiệp SME, tích hợp chatbot HR.
- Call to action: Đặt lịch demo hệ thống tại Bibomart hoặc đăng ký truy cập mã nguồn trên GitHub để trải nghiệm ngay.