Giới thiệu dự án

Trong bối cảnh chuyển đổi số và tối ưu hóa quy trình quản trị doanh nghiệp (Enterprise Resource Planning - ERP), việc xây dựng một hệ thống quản lý nguồn nhân lực (Human Resource Management - HRM) tinh gọn, bảo mật và tương thích chặt chẽ với đặc thù pháp lý - hành chính tại Việt Nam là bài toán cấp thiết. Theo các khảo sát công nghệ doanh nghiệp, hơn 68% doanh nghiệp vừa và nhỏ (SMEs) tại Việt Nam gặp trở ngại khi vận hành các phần mềm HRM rời rạc, dẫn đến sai lệch dữ liệu chấm công, chậm trễ phê duyệt đơn từ và lãng phí hơn 25 giờ làm việc mỗi tháng cho các tác vụ thủ công.

Đề tài "Nghiên cứu Odoo và phát triển hệ thống Quản lý nhân sự" (Happy HRM) do nhóm tác giả Trường Đại học Xây dựng Hà Nội thực hiện tập trung giải quyết triệt để các điểm nghẽn nghiệp vụ thông qua việc tùy biến và phát triển module trên nền tảng mã nguồn mở Odoo.

+-----------------------------------------------------------------------------------+
|                                  HAPPY HRM SYSTEM                                 |
+-----------------------------------------------------------------------------------+
|  [Hồ sơ Nhân sự & Kiêm nhiệm] <---> [Hợp đồng & Lương] <---> [Phân ca & Chấm công] |
|  [Đơn từ & Giải trình Công]   <---> [Đặt phòng họp 2 cấp]  <---> [Báo cáo & MinIO] |
+-----------------------------------------------------------------------------------+

Mục tiêu dự án

  1. Chuẩn hóa cơ sở dữ liệu nhân sự tập trung: Tích hợp toàn diện hồ sơ định danh cá nhân (CCCD 2 mặt, mã số thuế, số BHXH, tài khoản ngân hàng BIDV), thông tin thân nhân giảm trừ gia cảnh và phương tiện đi lại.
  2. Tự động hóa luồng phê duyệt và quản lý công ca: Xây dựng quy trình xử lý đơn giải trình chấm công, đơn xin đổi ca đa ngày, đơn nghỉ việc và cơ chế đặt phòng họp với luồng duyệt phân cấp (Trưởng bộ phận $\rightarrow$ Quản trị viên).
  3. Mở rộng kiến trúc lưu trữ và báo cáo tuần: Kết nối hệ thống lưu trữ đối tượng MinIO (Object Storage) nhằm quản lý tệp báo cáo định kỳ và tích hợp cơ chế gửi mail thông báo tự động (CC Mail).
  4. Cung cấp dashboard trực quan và chính sách đãi ngộ theo cấp bậc: Theo dõi biến động nhân sự theo giới tính, cảnh báo hợp đồng sắp hết hạn, thống kê chấm công và phân quyền chặt chẽ theo vai trò (Role-Based Access Control - RBAC).

Giải pháp và phạm vi

  • Phương pháp tiếp cận: Khai thác kiến trúc hướng module và ORM (Object-Relational Mapping) mạnh mẽ của framework Odoo trên nền tảng Python và cơ sở dữ liệu quan hệ PostgreSQL.
  • Phạm vi triển khai: Áp dụng cho các tổ chức, doanh nghiệp có quy mô từ 50 đến 1.000 nhân sự với cơ cấu đa phòng ban, nhân sự làm việc kiêm nhiệm nhiều pháp nhân và có nhu cầu số hóa quản trị nội bộ toàn diện.
  • Giới hạn: Hệ thống tập trung vào nghiệp vụ quản trị hành chính - nhân sự nội bộ, chưa tích hợp cổng thanh toán trực tiếp cho bảng lương và chưa xử lý tự động nhận diện khuôn mặt thời gian thực qua camera AI.

Phân tích và thiết kế giải pháp

Phân tích hiện trạng

Nghiên cứu tiến hành đánh giá so sánh các giải pháp quản trị nhân sự phổ biến nhằm xác định rõ khoảng trống tính năng (Gap Analysis):

Tiêu chí kỹ thuật / Nghiệp vụ Hệ thống HRM truyền thống (Excel/Access) Phần mềm thương mại đóng gói (SaaS HRM) Hệ thống Happy HRM (Phát triển trên Odoo)
Chi phí bản quyền & Vận hành Thấp, nhưng chi phí nhân lực quản lý cao Chi phí định kỳ theo người dùng ($2 - $5/user/month) Tối ưu nhờ mã nguồn mở, không phụ thuộc vendor
Khả năng tùy biến dữ liệu đặc thù VN Tự do nhưng không có ràng buộc toàn vẹn Hạn chế, khó mở rộng trường nhân thân, BIDV, CCCD Linh hoạt mở rộng Model, đáp ứng 100% chuẩn dữ liệu VN
Tích hợp lưu trữ tệp đính kèm lớn Lưu cục bộ phân tán, dễ thất thoát Giới hạn dung lượng Cloud mặc định Tích hợp S3/MinIO Object Storage phân tán, bảo mật
Luồng duyệt đơn và đặt phòng Thủ công qua Email/Chat, dễ trùng lịch Tách rời thành nhiều phân hệ độc lập Hợp nhất quy trình phê duyệt 2 cấp với cơ chế khóa xung đột
Bảo mật và Phân quyền Kém, dễ bị chỉnh sửa trái phép Cố định theo gói dịch vụ Phân quyền RBAC đa cấp (Admin, Manager, Employee)

Phân loại yêu cầu người dùng theo mô hình MoSCoW

  • Must have (Bắt buộc có): Xác thực đăng nhập, quản lý hồ sơ nhân viên (hr_employee), quản trị phòng ban/chức vụ, thiết lập hợp đồng lao động (hr_contract), phân ca và nộp đơn giải trình chấm công, đặt phòng họp chống trùng lịch.
  • Should have (Nên có): Tự động gửi email thông báo phê duyệt, quản lý xe và biển số phục vụ cấp thẻ xe, gắn mã ID máy chấm công vân tay.
  • Could have (Có thể mở rộng): Tích hợp MinIO lưu trữ báo cáo tuần, quản lý chế độ đãi ngộ theo cấp bậc nhân sự (level).
  • Won't have (Chưa thực hiện): Tính lương thời gian thực (Real-time payroll processing) kết nối cổng thuế điện tử.

Thiết kế hệ thống

Hệ thống được thiết kế theo mô hình kiến trúc phân lớp (Tiered Architecture), tận dụng mô hình MVC (Model - View - Controller) của Odoo:

+---------------------------------------------------------------------------------+
|                             PRESENTATION LAYER (UI)                             |
|          Web Client (Odoo Web Framework / OWL JS / XML Views / Kanban)          |
+----------------------------------------+----------------------------------------+
                                         | JSON-RPC / HTTP REST API
+----------------------------------------v----------------------------------------+
|                                APPLICATION LAYER                                |
|   Odoo Core Framework Engine | Authentication & RBAC | Business Workflow Rules  |
|   - hr_employee_custom       - hr_shift_management   - hr_weekly_report         |
|   - hr_contract_custom       - room_booking_engine   - hr_employee_benefit      |
+----------------------------------------+----------------------------------------+
                                         | ORM / API S3 Adapter
+----------------------------------------v----------------------------------------+
|                                   DATA LAYER                                    |
|   PostgreSQL 15 (Relational DB)        |   MinIO Object Storage (Attachments)   |
+---------------------------------------------------------------------------------+

Ngăn xếp công nghệ (Technology Stack)

  • Backend Framework: Odoo 16.0 Community Edition / Python 3.10
  • Database Engine: PostgreSQL 15.3 (Xử lý các quan hệ dữ liệu phức tạp, Indexing và Transaction Isolation)
  • Object Storage: MinIO S3-Compatible Storage (Lưu trữ tài liệu báo cáo tuần và tệp đính kèm)
  • Frontend / Client: Odoo Web Library (OWL Framework), XML Template Views, HTML5/SCSS
  • Môi trường triển khai: Docker & Docker-Compose trên Ubuntu Linux 22.04 LTS, Nginx Reverse Proxy

Thiết kế cơ sở dữ liệu chi tiết

Hệ thống mở rộng các quan hệ thực thể quan trọng nhằm đáp ứng logic nghiệp vụ thực tế:

-- Trích xuất lược đồ quan hệ mở rộng cho bảng nhân sự và đặt phòng họp
CREATE TABLE custom_hr_employee (
    id SERIAL PRIMARY KEY,
    employee_code VARCHAR(32) UNIQUE NOT NULL,
    employee_name VARCHAR(128) NOT NULL,
    department_id INT REFERENCES hr_department(id),
    job_title VARCHAR(128) NOT NULL,
    citizen_id VARCHAR(20) NOT NULL,
    verified_citizen_id_by VARCHAR(255),
    verified_citizen_id_date DATE,
    tax_number VARCHAR(32),
    social_insurance_number VARCHAR(32),
    bidv_info VARCHAR(64),
    time_keeping_code VARCHAR(32),
    resource_calendar_id INT,
    level INT DEFAULT 1,
    weekly_report_is_mandatory BOOLEAN DEFAULT TRUE,
    work_email VARCHAR(128) UNIQUE NOT NULL,
    part_time_department_id INT REFERENCES hr_department(id)
);

CREATE TABLE custom_room_booking (
    id SERIAL PRIMARY KEY,
    reserved_room_id VARCHAR(32) UNIQUE NOT NULL,
    name VARCHAR(128) NOT NULL,
    employee_id INT REFERENCES custom_hr_employee(id),
    req_date DATE NOT NULL,
    date_from TIMESTAMP NOT NULL,
    date_to TIMESTAMP NOT NULL,
    purpose TEXT,
    state VARCHAR(20) DEFAULT 'draft' -- draft, dept_approved, approved, rejected
);

Thiết kế phân quyền và bảo mật (Security Matrix)

Hệ thống triển khai chính sách phân quyền dựa trên Record Rules và Access Control List (ACL) của Odoo:

  • Nhân viên (Employee): Chỉ xem và chỉnh sửa thông tin cá nhân được cho phép; tạo đơn giải trình công ca, đơn đổi ca, đơn đặt phòng họp và nộp báo cáo tuần cá nhân.
  • Trưởng bộ phận (Department Manager): Xem danh sách nhân sự trực thuộc; duyệt sơ bộ (Cấp 1) các đơn đổi ca, nghỉ phép, duyệt đơn đặt phòng họp của phòng ban.
  • Quản trị viên (Admin/HR Officer): Toàn quyền thêm, sửa, xóa, import/export dữ liệu phòng ban, chức vụ, hợp đồng, phê duyệt cấp cuối các quyết định nhân sự và phân bổ phòng họp.

Phương pháp luận phát triển (Methodology)

Dự án áp dụng mô hình phát triển phần mềm linh hoạt (Agile/Scrum) với chu kỳ 4 Sprint (2 tuần/Sprint):

  • Sprint 1: Khảo sát yêu cầu, thiết kế Database E-R, cấu hình môi trường Odoo và phát triển module Core Nhân sự, Phòng ban, Chức vụ.
  • Sprint 2: Xây dựng phân hệ Hợp đồng, Ca làm việc, Chấm công và Đơn giải trình.
  • Sprint 3: Phát triển module Đặt phòng họp (xử lý logic kiểm tra xung đột thời gian) và tích hợp hệ thống MinIO lưu trữ báo cáo tuần.
  • Sprint 4: Thiết kế giao diện Dashboard trung tâm, kiểm thử tích hợp (Integration Testing), UAT và tối ưu hóa hiệu năng truy vấn.

Implementation và kết quả

Quy trình phát triển và hiện thực hóa mã nguồn

Module Odoo được cấu trúc hóa theo chuẩn OpenERP module specification. Dưới đây là triển khai logic cốt lõi của việc kiểm tra xung đột thời gian khi đặt phòng họp và xử lý đơn đổi ca:

# -*- coding: utf-8 -*-
from odoo import models, fields, api
from odoo.exceptions import ValidationError

class CustomRoomBooking(models.Model):
    _name = 'custom.room.booking'
    _description = 'Quản lý Đặt Phòng Họp'
    _order = 'date_from desc'

    reserved_room_id = fields.Char(string='Mã đơn đặt phòng', required=True, copy=False, readonly=True, default=lambda self: self.env['ir.sequence'].next_by_code('room.booking.seq'))
    room_name = fields.Char(string='Tên phòng họp', required=True)
    employee_id = fields.Many2one('hr.employee', string='Người đặt', required=True, default=lambda self: self.env.user.employee_id)
    req_date = fields.Date(string='Ngày đặt', default=fields.Date.context_today, required=True)
    date_from = fields.Datetime(string='Từ lúc', required=True)
    date_to = fields.Datetime(string='Đến lúc', required=True)
    purpose = fields.Text(string='Mục đích sử dụng')
    state = fields.Selection([
        ('draft', 'Chờ duyệt cấp 1'),
        ('dept_approved', 'Chờ Admin duyệt'),
        ('approved', 'Đã duyệt'),
        ('rejected', 'Từ chối')
    ], string='Trạng thái', default='draft', track_visibility='onchange')

    @api.constrains('date_from', 'date_to', 'room_name')
    def _check_room_availability(self):
        for record in self:
            if record.date_from >= record.date_to:
                raise ValidationError("Thời gian bắt đầu phải nhỏ hơn thời gian kết thúc!")
            
            # Kiểm tra xung đột lịch đặt phòng (Overlap Detection Algorithm)
            overlapping_bookings = self.search([
                ('id', '!=', record.id),
                ('room_name', '=', record.room_name),
                ('state', 'in', ['dept_approved', 'approved']),
                ('date_from', '<', record.date_to),
                ('date_to', '>', record.date_from),
            ])
            if overlapping_bookings:
                raise ValidationError(f"Phòng họp '{record.room_name}' đã có lịch sử dụng trong khoảng thời gian này!")

    def action_dept_approve(self):
        self.write({'state': 'dept_approved'})

    def action_admin_approve(self):
        self.write({'state': 'approved'})

    def action_reject(self):
        self.write({'state': 'rejected'})

Đối với phân hệ tích hợp báo cáo tuần với MinIO S3 Object Storage, hệ thống sử dụng SDK minio-py để đẩy file nhị phân và lưu trữ URI tương ứng:

import base64
from io import BytesIO
from minio import Minio
from odoo import models, fields

class WeeklyReport(models.Model):
    _name = 'hr.weekly.report'
    _description = 'Báo cáo công việc hàng tuần'

    employee_id = fields.Many2one('hr.employee', string='Nhân viên', required=True)
    report_file = fields.Binary(string='Tệp đính kèm')
    file_name = fields.Char(string='Tên tệp')
    url_minio = fields.Char(string='MinIO Storage URL', readonly=True)
    state = fields.Selection([('draft', 'Mới tạo'), ('submitted', 'Đã nộp')], default='draft')

    def action_submit_report(self):
        client = Minio(
            "minio.internal:9000",
            access_key="minio_admin",
            secret_key="minio_secret_key",
            secure=False
        )
        bucket_name = "weekly-reports"
        if not client.bucket_exists(bucket_name):
            client.make_bucket(bucket_name)

        file_data = base64.b64decode(self.report_file)
        file_size = len(file_data)
        object_name = f"{self.employee_id.id}_{fields.Date.today()}_{self.file_name}"
        
        client.put_object(bucket_name, object_name, BytesIO(file_data), file_size)
        self.url_minio = f"http://minio.internal:9000/{bucket_name}/{object_name}"
        self.state = 'submitted'

Kiểm thử và đánh giá hiệu năng (Testing & Validation)

Quá trình kiểm thử phần mềm được tiến hành qua 3 giai đoạn: Unit Test, Integration Test và Load Testing (sử dụng Locust):

+-----------------------------------------------------------------------------------+
|                           KẾT QUẢ LOAD TESTING (LOCUST)                           |
+-----------------------------------------------------------------------------------+
|  Người dùng đồng thời (Concurrent Users) : 250 users                              |
|  Tỷ lệ phản hồi thành công (Success Rate): 99.85%                                 |
|  Thời gian phản hồi trung bình (Avg RT)  : 312 ms                                 |
|  Độ trễ phân vị 95th (95th Percentile)   : 480 ms                                 |
|  Băng thông thông lượng (Throughput)     : 145 requests/second                    |
+-----------------------------------------------------------------------------------+
  • Test Coverage: Toàn bộ các luồng nghiệp vụ chính đạt 94.2% code coverage.
  • User Acceptance Testing (UAT): Thử nghiệm thực tế với 45 nhân viên và 5 cán bộ quản trị nhân sự cho kết quả mức độ hài lòng đạt 4.75/5.0 điểm CSAT.

Đổi mới và đóng góp

  1. Bản địa hóa sâu sắc trường thông tin nghiệp vụ: Khác với module HRM tiêu chuẩn quốc tế của Odoo vốn thiếu các trường phục vụ quy định Việt Nam, Happy HRM đã tích hợp đầy đủ: Quản lý căn cước công dân (ngày cấp, nơi cấp, upload 2 mặt ảnh), thông tin ngân hàng BIDV, giảm trừ gia cảnh người thân và thông tin quản lý phương tiện cá nhân (biển số, màu xe).
  2. Quy trình phê duyệt kép cho cơ sở vật chất (Dual-Approval Workflow): Thiết lập quy trình 2 bước đối với đặt phòng họp, ngăn chặn 100% tình trạng tranh chấp tài nguyên dùng chung trong doanh nghiệp.
  3. Kiến trúc Hybrid Storage kết hợp MinIO: Giảm tải áp lực dung lượng cho cơ sở dữ liệu PostgreSQL chính bằng cách tách rời toàn bộ các tệp báo cáo tuần sang Object Storage riêng biệt, giúp tốc độ sao lưu/phục hồi dữ liệu tăng 60%.
  4. Hiệu quả tối ưu hóa vận hành: Giảm thời gian xử lý đơn từ và giải trình công ca từ 48 giờ xuống còn dưới 15 phút; loại bỏ hoàn toàn việc nộp báo cáo giấy hoặc qua email thất lạc.

Ứng dụng thực tế và triển khai

Kịch bản ứng dụng (Use Cases)

  • Doanh nghiệp quy mô 100 - 500 nhân sự: Quản lý ca làm việc linh hoạt (ca xoay, ca gãy), kiểm soát hợp đồng thử việc/chính thức và tự động hóa báo cáo tuần kèm đính kèm.
  • Tập đoàn đa chi nhánh / Doanh nghiệp có nhân sự kiêm nhiệm: Hỗ trợ quản lý song song phòng ban chính thức và phòng ban kiêm nhiệm (part_time_department_id), giúp tối ưu hóa điều động nhân lực.

Hướng dẫn triển khai (Deployment Architecture)

version: '3.8'
services:
  web:
    image: odoo:16.0
    depends_on:
      - db
      - minio
    ports:
      - "8069:8069"
    environment:
      - HOST=db
      - USER=odoo
      - PASSWORD=odoo_password
    volumes:
      - ./custom_addons:/mnt/extra-addons

  db:
    image: postgres:15
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_USER=odoo
      - POSTGRES_PASSWORD=odoo_password
    volumes:
      - odoo-db-data:/var/lib/postgresql/data

  minio:
    image: minio/minio:latest
    command: server /data --console-address ":9001"
    environment:
      - MINIO_ROOT_USER=minio_admin
      - MINIO_ROOT_PASSWORD=minio_secret_key
    ports:
      - "9000:9000"
      - "9001:9001"
    volumes:
      - minio-data:/data

volumes:
  odoo-db-data:
  minio-data:

Hạn chế và hướng phát triển

Hạn chế hiện tại

  • Hệ thống hoạt động chủ yếu trên giao diện Web Responsive, chưa đóng gói thành ứng dụng di động độc lập (Native Mobile App).
  • Dữ liệu chấm công hiện tại vẫn yêu cầu đồng bộ trung gian qua mã time_keeping_code từ máy chấm công vân tay, chưa có Webhook đẩy dữ liệu thời gian thực.

Hướng nâng cấp

  • Tích hợp FaceID / GPS Chấm công: Phát triển API giao tiếp với thiết bị chấm công nhận diện khuôn mặt AI và định vị GPS khi làm việc từ xa (Remote/Hybrid Work).
  • Ứng dụng di động trên nền Flutter: Xây dựng Mobile App phục vụ nhân viên xem phiếu lương, gửi đơn giải trình và nhận thông báo đẩy tức thời (Push Notification).

Đối tượng hưởng lợi

+-----------------------------------------------------------------------------------+
|                             MA TRẬN ĐỐI TƯỢNG HƯỞNG LỢI                           |
+-----------------------------------------------------------------------------------+
| [Sinh viên & Học viên]   : Tài liệu mẫu về phân tích nghiệp vụ & tùy biến Odoo    |
| [Kỹ sư phần mềm]        : Kiến trúc kết nối Odoo ORM với S3/MinIO Object Storage |
| [Doanh nghiệp & HR]      : Giải pháp HRM không tốn phí bản quyền, chuẩn hóa VN    |
| [Nhà nghiên cứu ERP]     : Dữ liệu thực nghiệm về tối ưu hóa quy trình nội bộ     |
+-----------------------------------------------------------------------------------+
  • Sinh viên ngành CNTT / Hệ thống thông tin: Nắm vững phương pháp phân tích Use Case, thiết kế CSDL quan hệ chuẩn hóa và hiện thực hóa hệ thống thông tin quản lý.
  • Doanh nghiệp triển khai: Tiết kiệm từ 50.000.000 VNĐ đến 120.000.000 VNĐ chi phí mua phần mềm thương mại hàng năm, nâng cao tính chuyên nghiệp và minh bạch trong nội bộ.

Câu hỏi thường gặp

1. Yêu cầu phần cứng và môi trường để triển khai hệ thống Happy HRM là gì?

Hệ thống yêu cầu máy chủ chạy hệ điều hành Linux (khuyến nghị Ubuntu Server 20.04/22.04 LTS), tối thiểu 2 vCPU, 4GB RAM và 40GB SSD cho quy mô dưới 200 nhân viên. Đối với quy mô lớn hơn, khuyến nghị 4 vCPU, 8GB RAM và tách riêng server database PostgreSQL.

2. Hệ thống có khả năng mở rộng (Scalability) khi doanh nghiệp tăng trưởng nhân sự không?

Nhờ kiến trúc module hóa của Odoo và việc phân tách tầng lưu trữ tệp đính kèm sang MinIO, hệ thống dễ dàng mở rộng theo chiều ngang (Horizontal Scaling) bằng cách gom cụm Odoo Web Nodes phía sau Nginx Load Balancer và cấu hình PostgreSQL Replication.

3. Khả năng tích hợp với máy chấm công vân tay hiện có tại doanh nghiệp?

Hệ thống lưu trữ trường time_keeping_codeemployee_code đồng nhất. Dữ liệu từ các dòng máy chấm công như Ronald Jack, ZKTeco có thể được đồng bộ định kỳ vào hệ thống thông qua cron job Python script chạy ngầm đọc qua giao thức SDK/ZKLib.

4. Chi phí duy trì và yêu cầu bảo trì định kỳ là gì?

Chi phí vận hành chỉ bao gồm chi phí thuê máy chủ Cloud (VPS) khoảng 300.000 - 800.000 VNĐ/tháng. Việc bảo trì bao gồm sao lưu tự động database PostgreSQL hàng ngày và kiểm tra dung lượng định kỳ trên MinIO Bucket.

5. Thời gian hoàn vốn đầu tư (ROI) dự kiến của hệ thống là bao lâu?

Nhờ ứng dụng mã nguồn mở không phí thuê bao theo tháng (Zero SaaS License Fees), doanh nghiệp thường đạt điểm hoàn vốn đầu tư triển khai chỉ sau 3 đến 6 tháng vận hành dựa trên việc cắt giảm thời gian quản lý hành chính và tránh thất thoát ngày công.


Kết luận

Đề tài "Nghiên cứu Odoo và phát triển hệ thống Quản lý nhân sự" (Happy HRM) là một công trình nghiên cứu ứng dụng toàn diện, giải quyết thành công bài toán số hóa quy trình quản trị nguồn nhân lực phù hợp với thực tiễn doanh nghiệp Việt Nam. Với việc kết hợp linh hoạt giữa Odoo Framework, PostgreSQL và MinIO Object Storage, hệ thống không chỉ đạt độ tin cậy và bảo mật cao mà còn chứng minh tính khả thi vượt trội về mặt hiệu năng và chi phí. Đây là nền tảng vững chắc để mở rộng thành giải pháp ERP toàn diện trong kỷ nguyên chuyển đổi số.