# FIX SWAPPED PENALTY DATA

## 🚨 VẤN ĐỀ PHÁT HIỆN

Từ hình ảnh bạn gửi, dữ liệu bị hoán đổi giữa table và modal:

**Modal chi tiết (đúng):**
- Trừ lương ngày vắng: -0 đ
- Tiền phạt: -120,000 đ

**Table (sai):**
- Trừ lương vắng: 120,000
- Tiền phạt: 0

**Nguyên nhân:** Dữ liệu trong database bị lưu ngược giữa 2 cột `penalty_amount` và `absence_deductions`.

## 🔧 CÔNG CỤ DEBUG ĐÃ TẠO

### 1. **Debug Data Method**
```
URL: /salary/payrolls/debug-data?payroll_id=123
```

**Chức năng:**
- Kiểm tra dữ liệu trong database
- So sánh với penalties table
- Phát hiện dữ liệu bị hoán đổi
- Đưa ra gợi ý sửa lỗi

### 2. **Fix Swapped Data Method**
```
URL: /salary/payrolls/fix-swapped?payroll_id=123 (POST)
```

**Chức năng:**
- Hoán đổi giá trị giữa `penalty_amount` và `absence_deductions`
- Hiển thị trước và sau khi sửa
- Cập nhật database ngay lập tức

## 🧪 CÁCH SỬ DỤNG

### **Bước 1: Tìm Payroll ID**
1. Vào trang danh sách bảng lương
2. Tìm bản ghi có vấn đề
3. Lấy ID từ URL hoặc database

### **Bước 2: Debug dữ liệu**
```
Truy cập: /salary/payrolls/debug-data?payroll_id=123
```

**Kết quả sẽ hiển thị:**
```
=== DEBUG PAYROLL DATA ===
Payroll ID: 123
Employee: Nguyễn Văn A
Month: October 2025

=== DATABASE VALUES ===
penalty_amount (DB): 120,000 VND
absence_deductions (DB): 0 VND
net_salary (DB): 9,463,333 VND

=== CALCULATED VALUES ===
Total penalties from penalties table: 120,000 VND
Number of penalty records: 5

=== PENALTY BREAKDOWN ===
- late: 2 lần, 40,000 VND
- early_leave: 2 lần, 60,000 VND
- missing_punch: 1 lần, 20,000 VND

=== COMPARISON ===
✅ penalty_amount khớp với penalties table
⚠️  Có thể dữ liệu bị hoán đổi!
   absence_deductions = 0 nhưng có penalties

=== SUGGESTED FIX ===
Có thể cần swap 2 giá trị:
- penalty_amount: 120,000 → 120,000
- absence_deductions: 0 → 120,000
```

### **Bước 3: Sửa dữ liệu (nếu cần)**
```
POST: /salary/payrolls/fix-swapped?payroll_id=123
```

**Kết quả:**
```
=== FIX SWAPPED DATA ===
Payroll ID: 123
Employee: Nguyễn Văn A

BEFORE:
- penalty_amount: 120,000 VND
- absence_deductions: 0 VND

AFTER:
- penalty_amount: 0 VND
- absence_deductions: 120,000 VND

✅ Đã hoán đổi dữ liệu thành công!
```

## 🎯 **GIẢI PHÁP TOÀN DIỆN**

### **Trường hợp 1: Dữ liệu cũ bị sai**
1. Sử dụng debug tool để kiểm tra
2. Sử dụng fix tool để sửa từng bản ghi
3. Hoặc tính lại lương để có dữ liệu mới đúng

### **Trường hợp 2: Logic tính toán sai**
1. Kiểm tra PayrollService có tính đúng không
2. Kiểm tra Controller có trả về đúng không
3. Kiểm tra View có hiển thị đúng không

### **Trường hợp 3: Migration thiếu**
1. Kiểm tra cột `absence_deductions` đã tồn tại chưa
2. Chạy migration nếu chưa có
3. Tính lại lương để có dữ liệu mới

## 🔄 **QUY TRÌNH SỬA LỖI**

### **Cho bản ghi hiện tại:**
```bash
# 1. Debug
curl "/salary/payrolls/debug-data?payroll_id=123"

# 2. Fix (nếu cần)
curl -X POST "/salary/payrolls/fix-swapped?payroll_id=123"

# 3. Kiểm tra lại
curl "/salary/payrolls/debug-data?payroll_id=123"
```

### **Cho tương lai:**
1. **Tính lại lương** với logic mới đã sửa
2. **Kiểm tra** kết quả trước khi lưu
3. **Test** với nhiều trường hợp khác nhau

## ⚠️ **LƯU Ý QUAN TRỌNG**

1. **Backup dữ liệu** trước khi sử dụng fix tool
2. **Test trên môi trường dev** trước
3. **Kiểm tra kỹ** kết quả sau khi fix
4. **Tính lại lương** là cách an toàn nhất

## 🎉 **KẾT QUẢ MONG ĐỢI**

Sau khi fix:
- **Table và Modal sẽ hiển thị nhất quán**
- **Tiền phạt** hiển thị đúng giá trị
- **Trừ lương vắng** hiển thị đúng giá trị
- **Lương thực nhận** không thay đổi (vì chỉ hoán đổi hiển thị)

---

**Ngày tạo:** 11/12/2025  
**Trạng thái:** Sẵn sàng sử dụng