# Luồng xử lý tự động cho bài toán nộp tiền lái xe

## 1. Luồng dữ liệu đầu vào

Hệ thống cần tối thiểu 2 nguồn dữ liệu:

### 1.1. Dữ liệu phát sinh phải nộp
Ví dụ:
- lái xe A trong ngày 12 phát sinh phải nộp 2.000.000

### 1.2. Dữ liệu đã nộp
Ví dụ:
- lái xe A đã nộp 500.000 lúc 16:00 ngày 12
- nộp thêm 1.000.000 lúc 09:00 ngày 13

## 2. Cách xác định vi phạm

### Bước 1: Xác định nghĩa vụ nộp tiền của từng lái xe theo ngày
Ví dụ:
- DriverId = D001
- BusinessDate = 2026-03-12
- AmountDue = 2.000.000

### Bước 2: Tính hạn chót
Nếu cấu hình:
- cutoff ngày hôm sau
- giờ cutoff = 10:00

thì:
- BusinessDate = 2026-03-12
- Deadline = 2026-03-13 10:00

### Bước 3: Tính số đã nộp đến thời điểm deadline
- nếu PaidAmountBeforeDeadline >= AmountDue => không vi phạm
- nếu PaidAmountBeforeDeadline < AmountDue => vi phạm

### Bước 4: Ghi nhận vi phạm
Tạo 1 bản ghi vi phạm cho lái xe tại ngày phát sinh đó.

### Bước 5: Tính số lần vi phạm
Dựa trên cấu hình reset:
- theo tháng
- theo quý
- trọn đời

### Bước 6: Xác định mức xử lý
Ví dụ:
- lần 1: nhắc nhở
- lần 2: phạt 100.000
- lần 3: phạt 200.000
- lần 4 trở đi: phạt 300.000

### Bước 7: Sinh phiếu tự động
Nếu mức xử lý là nhắc nhở:
- có thể sinh phiếu loại “nhắc nhở”
hoặc
- chỉ ghi nhận biên bản vi phạm

Nếu mức xử lý là phạt tiền:
- sinh phiếu phạt tự động với số tiền tương ứng

## 3. Luồng chạy tự động
Khuyến nghị dùng job chạy theo lịch:

### Cách đơn giản nhất
- job chạy mỗi 15 phút hoặc 30 phút
- quét các nghĩa vụ nộp tiền đã qua hạn chót nhưng chưa xử lý

### Điều kiện xử lý
- cấu hình tự động đang bật
- không bị tạm dừng
- chưa từng lập vi phạm cho cùng lái xe + ngày nghiệp vụ
- đã qua hạn chót

## 4. Chống sinh trùng
Mỗi nghĩa vụ nộp tiền chỉ được lập vi phạm tối đa 1 lần.

Khóa logic chống trùng đề xuất:
- DriverId
- BusinessDate
- ViolationType = LATE_CASH_SUBMISSION

## 5. Ví dụ minh họa

### Ví dụ 1: không vi phạm
- ngày phát sinh: 12
- hạn chót: 10:00 ngày 13
- lái xe nộp đủ lúc 09:45 ngày 13
=> không lập biên bản

### Ví dụ 2: vi phạm
- ngày phát sinh: 12
- hạn chót: 10:00 ngày 13
- đến 10:00 ngày 13 mới nộp 1.000.000 / 2.000.000
=> lập biên bản tự động

### Ví dụ 3: đổi cấu hình giờ cutoff
- trước đây: 10:00 ngày hôm sau
- hiện tại đổi thành: 17:00 ngày hôm sau
=> từ thời điểm cấu hình có hiệu lực, deadline mới sẽ là 17:00