Tổng quan ba module lõi

Hầu hết các hệ thống Core Banking đều được tổ chức xoay quanh ba domain nghiệp vụ này. Hiểu rõ chúng giúp bạn đọc đặc tả yêu cầu của khách hàng (ngân hàng) và chuyển thành thiết kế hệ thống chính xác.


Module 1: CIF — Customer Information File

CIF là nền tảng định danh khách hàng của toàn hệ thống. Mỗi khách hàng — dù là cá nhân hay doanh nghiệp — đều có một mã CIF duy nhất. Mọi sản phẩm khác (tài khoản, khoản vay, thẻ) đều được liên kết với CIF này.

Tại sao CIF lại quan trọng?

Nếu không có CIF được thiết kế tốt, bạn sẽ gặp tình trạng “Customer 360” bị vỡ — ngân hàng không biết rằng người mở tài khoản tiết kiệm và người vay tiền là cùng một người, dẫn đến không thể xét duyệt tín dụng chính xác.

Thiết kế CIF cơ bản

CREATE TABLE customers (
    cif_number      VARCHAR(20)  PRIMARY KEY,   -- Mã CIF duy nhất
    customer_type   VARCHAR(10)  NOT NULL,       -- 'INDIVIDUAL' hoặc 'CORPORATE'
    full_name       VARCHAR(255) NOT NULL,
    id_number       VARCHAR(20)  UNIQUE NOT NULL, -- CMND/CCCD/MST
    id_type         VARCHAR(20)  NOT NULL,        -- 'NATIONAL_ID', 'PASSPORT', 'TAX_CODE'
    date_of_birth   DATE,
    nationality     CHAR(3),                     -- ISO 3166 country code
    kyc_status      VARCHAR(20)  NOT NULL DEFAULT 'PENDING',
    -- 'PENDING', 'VERIFIED', 'REJECTED', 'EXPIRED'
    risk_rating     VARCHAR(10),                 -- 'LOW', 'MEDIUM', 'HIGH'
    created_at      TIMESTAMPTZ NOT NULL DEFAULT NOW(),
    updated_at      TIMESTAMPTZ NOT NULL DEFAULT NOW()
);

eKYC & AML Integration

CIF không thể tồn tại một mình — nó phải tích hợp với:

  • eKYC System: Xác minh danh tính điện tử (kết nối VNPT eKYC, VneID).
  • AML (Anti-Money Laundering): Kiểm tra danh sách đen, phát hiện giao dịch đáng ngờ.
  • CIC (Credit Information Center): Kiểm tra lịch sử tín dụng trước khi cho vay.

Module 2: CASA — Current Account & Savings Account

CASA là nơi lưu trữ tiền của khách hàng. Đây là module tạo ra nguồn vốn giá rẻ nhất cho ngân hàng vì lãi suất thanh toán rất thấp.

Phân loại tài khoản

LoạiĐặc điểmLãi suất điển hình
Current Account (Tài khoản thanh toán)Rút/nạp tự do, không kỳ hạn0.1% - 0.5%/năm
Savings Account - Demand (Tiết kiệm không kỳ hạn)Rút tự do, tính lãi hàng ngày0.5% - 1%/năm
Savings Account - Term (Tiết kiệm có kỳ hạn)Khóa theo kỳ hạn (1,3,6,12,24 tháng)5% - 8%/năm

Thiết kế cơ sở dữ liệu cho CASA

CREATE TABLE accounts (
    account_number  VARCHAR(20)  PRIMARY KEY,
    cif_number      VARCHAR(20)  NOT NULL REFERENCES customers(cif_number),
    account_type    VARCHAR(30)  NOT NULL,
    -- 'CURRENT', 'SAVINGS_DEMAND', 'SAVINGS_TERM'
    currency        CHAR(3)      NOT NULL DEFAULT 'VND',
    status          VARCHAR(20)  NOT NULL DEFAULT 'ACTIVE',
    -- 'ACTIVE', 'DORMANT', 'BLOCKED', 'CLOSED'
    current_balance BIGINT       NOT NULL DEFAULT 0,  -- Số dư hiện tại (đơn vị: đồng)
    available_balance BIGINT     NOT NULL DEFAULT 0,  -- Số dư khả dụng (trừ hold)
    interest_rate   DECIMAL(6,4),                     -- Lãi suất (%/năm)
    maturity_date   DATE,                             -- Ngày đáo hạn (nếu có kỳ hạn)
    opened_at       TIMESTAMPTZ  NOT NULL DEFAULT NOW()
);

Business Rule quan trọng: Số dư khả dụng vs Số dư hiện tại

Đây là điểm nhiều developer hay nhầm:

current_balance   = Tổng tiền thực tế trong tài khoản
available_balance = current_balance - hold_amount

Hold (phong toả) xảy ra khi:
  - Khách hàng dùng thẻ để đặt phòng khách sạn (chưa thanh toán thực)
  - Tài khoản đang bị phong toả theo lệnh thi hành án
  - Đặt cọc cho giao dịch chưa hoàn tất

Khi khách hàng rút tiền, hệ thống chỉ được phép rút từ available_balance, không phải current_balance.

Tính lãi suất hàng ngày (Daily Interest Accrual)

Đây là một trong những quy trình batch quan trọng nhất chạy mỗi đêm (EOD - End of Day):

Lãi tích lũy hàng ngày = (Số dư cuối ngày × Lãi suất / 365)

Ví dụ:
  - Số dư: 100.000.000 VNĐ
  - Lãi suất: 5.5%/năm
  - Lãi 1 ngày = 100.000.000 × 0.055 / 365 = 15.068 VNĐ/ngày

Module 3: Lending — Nghiệp vụ Tín Dụng

Lending (cho vay) là module tạo ra doanh thu chính của ngân hàng. Đây cũng là module phức tạp nhất.

Vòng đời một khoản vay

[Khởi tạo hồ sơ] → [Thẩm định] → [Phê duyệt] → [Giải ngân] 
      → [Hoạt động (Thu nợ định kỳ)] → [Đóng khoản vay]

Các khái niệm bắt buộc phải hiểu

Thuật ngữÝ nghĩa
PrincipalVốn gốc đang còn dư nợ
Outstanding BalanceTổng dư nợ = Vốn gốc + Lãi phát sinh
EMIKhoản thanh toán cố định hàng kỳ (vốn gốc + lãi)
Amortization ScheduleBảng phân kỳ trả nợ (schedule)
NPANon-Performing Asset — khoản nợ xấu (quá hạn >90 ngày)
ProvisioningTrích lập dự phòng rủi ro tín dụng

Công thức tính EMI (Equated Monthly Installment)

EMI = P × r × (1 + r)^n / ((1 + r)^n - 1)

Trong đó:
  P = Số tiền vay ban đầu (Principal)
  r = Lãi suất theo kỳ (ví dụ: 12%/năm → r = 1%/tháng = 0.01)
  n = Số kỳ thanh toán (tháng)

Ví dụ: Vay 500.000.000 VNĐ, 12%/năm, 60 tháng
  r = 0.01, n = 60
  EMI = 500.000.000 × 0.01 × (1.01)^60 / ((1.01)^60 - 1)
      ≈ 11.122.222 VNĐ/tháng

Phân loại nợ (Debt Classification) — Quy định của NHNN Việt Nam

NhómTình trạngYêu cầu trích lập dự phòng
Nhóm 1Nợ đủ tiêu chuẩn (< 10 ngày quá hạn)0%
Nhóm 2Nợ cần chú ý (10 - 90 ngày)5%
Nhóm 3Nợ dưới tiêu chuẩn (90 - 180 ngày)20%
Nhóm 4Nợ nghi ngờ (180 - 360 ngày)50%
Nhóm 5Nợ có khả năng mất vốn (> 360 ngày)100%

Đây là quy định pháp lý — hệ thống Core Banking phải tự động phân loại và trích lập dự phòng theo các nhóm này trong quy trình EOD hàng ngày.

Tóm tắt mối quan hệ giữa ba module

Customer (CIF) ──── 1:N ──── Accounts (CASA)
Customer (CIF) ──── 1:N ──── Loans (Lending)
Accounts       ──── 1:N ──── Ledger Entries
Loans          ──── 1:N ──── Ledger Entries

Bây giờ bạn đã hiểu nghiệp vụ. Tiếp theo, chúng ta sẽ đi sâu vào kỹ thuật đảm bảo tính chính xác của dữ liệu trong môi trường cực kỳ nhiều giao dịch đồng thời. Đọc tiếp Phần 3 — Thiết kế Database cho Giao dịch Tài chính (ACID & Concurrency).