Yêu Cầu Cải Tiến: Cấu Hình Khoảng Chi Tiêu Hạng Thành Viên (Membership Tiers)
Ngày cập nhật: 24/06/2026
Phản hồi từ: Khách hàng (Admin)
Nội dung phản hồi: "Hạng thành viên cái này anh không biết nhập khoảng chi tiêu như thế nào luôn."
Ảnh feedback:
1. Vấn Đề Hiện Tại
Trên màn hình Membership Tiers, mỗi hạng thành viên có một trường duy nhất tên là "Spend" — chỉ là một ô nhập số đơn giản.

Vấn đề gây nhầm lẫn:
- Admin không biết đây là giá trị chi tiêu tối thiểu hay tối đa.
- Không có nhãn (label) giải thích ý nghĩa con số.
- Không có đơn vị tiền tệ hiển thị rõ ràng.
- Không thể hiểu được logic khoảng chi tiêu (từ bao nhiêu → đến bao nhiêu) từ giao diện hiện tại.
2. Dữ Liệu Nghiệp Vụ Thực Tế (Tham Chiếu)
Theo bảng cơ chế phân hạng, khoảng chi tiêu tích lũy (GPoint) cho từng hạng như sau:

| Hạng | Code | Chi tiêu tối thiểu | Chi tiêu tối đa | Điểm tích lũy (Thẻ/CK) | Điểm tích lũy (Tiền mặt) |
|---|---|---|---|---|---|
| Silver | SILVER | 0đ | < 5.000.000đ | 3% | 5% |
| Gold | GOLD | 5.000.000đ | < 40.000.000đ | 5% | 7% |
| Platinum | PLATINUM | 40.000.000đ | < 80.000.000đ | 8% | 10% |
| Diamond | DIAMOND | 80.000.000đ | Không giới hạn | 11% | 13% |
3. Yêu Cầu Cải Tiến UI — Trường "Spend"
3.1 Thay đổi trường "Spend" đơn thành 2 trường rõ ràng
Thay một ô Spend bằng 2 ô riêng biệt với nhãn rõ ràng:
| Trường cũ | Thay bằng |
|---|---|
Spend (1 ô số) | Spend từ (Min Spend) + Spend đến (Max Spend) |
Mockup giao diện đề xuất:
┌────────────────────────────────────────────────────────────────────────────────────────────┐
│ Code Tên tier Priority Điểm Spend từ (đ) Spend đến (đ) Bật │
│ [SILVER] [Silver ] [0 ] [0 ] [0 ] [4.999.999 ] [◉] │
│ │
│ Code Tên tier Priority Điểm Spend từ (đ) Spend đến (đ) Bật │
│ [GOLD ] [Gold ] [2 ] [20 ] [5.000.000 ] [39.999.999 ] [◉] │
└────────────────────────────────────────────────────────────────────────────────────────────┘
3.2 Bổ sung tooltip/placeholder giải thích
- Placeholder của ô
Spend từ:"VD: 5000000 (5 triệu đồng)" - Placeholder của ô
Spend đến:"VD: 39999999 | Để trống = không giới hạn" - Tooltip icon ❓ cạnh label giải thích: "Khách hàng sẽ được xếp vào hạng này nếu tổng chi tiêu tích lũy nằm trong khoảng [Spend từ] đến [Spend đến]"
3.3 Bổ sung cột "Tỷ lệ tích điểm"
Theo nghiệp vụ, mỗi hạng có tỷ lệ tích điểm khác nhau — hiện chưa có trường này trên CMS. Cần bổ sung:
| Trường mới | Mô tả |
|---|---|
Tỷ lệ (Thẻ/CK) | % điểm tích lũy khi thanh toán bằng thẻ/chuyển khoản |
Tỷ lệ (Tiền mặt) | % điểm tích lũy khi thanh toán tiền mặt |
4. Hướng Dẫn Nhập Liệu Tạm Thời (Workaround)
Trong khi chờ UI được cập nhật, đây là hướng dẫn nhập liệu cho Admin:
Ý nghĩa trường "Spend" hiện tại = Mức chi tiêu TỐI THIỂU để đạt hạng đó (tương đương Min Spend).
| Hạng | Nhập vào ô "Spend" | Giải thích |
|---|---|---|
| SILVER | 0 | Mặc định từ 0đ |
| GOLD | 5000000 | Từ 5 triệu trở lên |
| PLATINUM | 40000000 | Từ 40 triệu trở lên |
| DIAMOND | 80000000 | Từ 80 triệu trở lên |
Trường "Điểm" (Points) = Số điểm GPoint tối thiểu cần có để duy trì hạng (có thể để 0 nếu không áp dụng điều kiện điểm riêng).
5. Checklist Kỹ Thuật
- Tách trường
spend(số nguyên) thànhspend_minvàspend_maxtrong database schema - Cập nhật API endpoint
PATCH /membership-tiers/:idnhận 2 trườngspend_min,spend_max - Cập nhật giao diện CMS: 2 ô nhập liệu thay vì 1, có label và placeholder rõ ràng
- Cập nhật logic xếp hạng phía backend:
spend_min <= customer.total_spend < spend_max - Hạng Diamond (cao nhất):
spend_max = null= không giới hạn trên - Thêm tooltip giải thích ý nghĩa từng trường
- Thêm 2 trường tỷ lệ tích điểm:
point_rate_cardvàpoint_rate_cash - Validate:
spend_mincủa hạng N phải bằngspend_maxcủa hạng N-1 (không được có khoảng trống hoặc chồng lấn)