# Quy tắc tính số lần vi phạm

## 1. Mục đích
Số lần vi phạm là cơ sở để xác định mức xử lý khác nhau cho mỗi lái xe.

## 2. Cách xác định “1 lần vi phạm”
Mỗi **lái xe + ngày nghiệp vụ** chỉ được tính tối đa **1 lần vi phạm** cho loại lỗi nộp tiền trễ.

Không phụ thuộc việc:
- thiếu bao nhiêu tiền
- nộp thành nhiều lần
- nộp sau đó bao lâu

Giai đoạn 1 chỉ cần quy tắc đơn giản:
- quá hạn mà chưa nộp đủ => 1 lần vi phạm

## 3. Cửa sổ tính số lần
Tùy cấu hình, số lần được đếm trong một cửa sổ:

### 3.1. Theo tháng
Ví dụ:
- vi phạm ngày 03/03 là lần 1
- vi phạm ngày 12/03 là lần 2
- sang 01/04 nếu lại vi phạm thì trở lại lần 1

### 3.2. Theo quý
Ví dụ:
- 2 lần ở tháng 1
- 1 lần ở tháng 3
=> lần ở tháng 3 là lần 3 trong quý 1

### 3.3. Trọn đời
Ví dụ:
- từ khi áp dụng hệ thống đến nay lái xe đã vi phạm 8 lần
=> lần mới sẽ là lần 9

## 4. Công thức tính đề xuất

### Input
- DriverId
- ViolationDate
- ResetPolicy

### Output
- ViolationCountInScope

### Logic
1. xác định phạm vi thống kê theo ResetPolicy
2. đếm số vi phạm trước đó của cùng lái xe trong phạm vi này
3. số lần hiện tại = số trước đó + 1

## 5. Ví dụ

### Ví dụ reset theo tháng
- 05/03: lần 1
- 15/03: lần 2
- 25/03: lần 3
- 02/04: lần 1

### Ví dụ reset theo quý
- 10/01: lần 1
- 18/02: lần 2
- 20/03: lần 3
- 05/04: lần 1

### Ví dụ cộng dồn trọn đời
- 10/01: lần 1
- 18/02: lần 2
- 20/03: lần 3
- 05/04: lần 4

## 6. Lưu ý khi thay đổi reset policy
Nếu công ty đổi từ:
- hàng tháng sang hàng quý
hoặc
- hàng quý sang trọn đời

thì cần chốt rõ 1 trong 2 cách:

### Cách A - Chỉ áp dụng từ thời điểm đổi cấu hình
Đơn giản hơn, dễ triển khai hơn.

### Cách B - Tính lại lịch sử
Phức tạp hơn, ít phù hợp cho giai đoạn 1.

Khuyến nghị giai đoạn 1 dùng **Cách A**.