← Quay lại mục lục

Bài 15 — Shopping Cart với mã giảm giá

Giỏ hàng 3 sản phẩm, 4 loại mã giảm, tính tax, shipping, total. Decision Table heavy.

Khó #shopping #cart #coupon #tax #calculation #decision-table

🛒 Bài 15: Shopping Cart với mã giảm giá

Form giỏ hàng với 3 sản phẩm, người dùng chỉnh số lượng, áp mã giảm giá → tính subtotal, discount, shipping, tax, total. Decision Table-heavy.

📌 Sản phẩm trong giỏ

TênĐơn giáSố lượng mặc định
Áo thun250,000 VND1
Quần jean650,000 VND1
Giày sneaker1,200,000 VND1

📌 Mã giảm giá khả dụng

CodeLoạiGiá trịĐiều kiện
SALE10Phần trăm10% giảm trên subtotalKhông có
FREESHIPTiền cố định−30,000 VNDSubtotal ≥ 200,000
VIP50Tiền cố định−50,000 VNDSubtotal ≥ 500,000
BIGSALE25Phần trăm25% giảm, max 200,000Subtotal ≥ 1,000,000

🎯 Quy tắc tính

  1. Quantity: 0 → 99 mỗi sản phẩm. Nếu = 0 thì coi như loại bỏ khỏi cart.
  2. Subtotal = Σ (giá × số lượng).
  3. Discount:
    • Áp dụng tối đa 1 mã.
    • Code không hợp lệ → message + discount = 0.
    • Không thỏa min order → message + discount = 0.
    • Cap discount theo loại (BIGSALE25 max 200k).
  4. Shipping: 30,000 VND cố định, MIỄN PHÍ nếu áp FREESHIP (đã trừ trong discount) — KHÔNG cộng shipping vào total nếu đang dùng FREESHIP. (Hoặc cách khác: shipping luôn 30k, FREESHIP trừ 30k → kết quả như nhau).
  5. Tax (VAT) = 10% × (Subtotal − Discount). Không tính tax trên shipping.
  6. Total = Subtotal − Discount + Shipping + Tax.

📝 Test data verify (tay)

Cart mặc định (1 áo + 1 quần + 1 giày = 2,100,000 VND):

  • Không mã: subtotal 2,100,000 + shipping 30,000 + tax 210,000 = 2,340,000 VND
  • SALE10: discount 210,000; tax = 10% × (2,100,000 − 210,000) = 189,000; total = 2,109,000
  • FREESHIP: discount 30,000; tax = 10% × 2,070,000 = 207,000; shipping 0; total = 2,277,000
  • BIGSALE25: 25% × 2,100,000 = 525,000 → cap 200,000; tax = 10% × 1,900,000 = 190,000; total = 2,120,000
⚠️ Bug được cài cắm: tax tính trên subtotal (chưa trừ discount), discount cap không hoạt động, FREESHIP áp dụng dù subtotal < 200k, làm tròn sai, format VND.
🔐

Vui lòng đăng nhập để nộp bài.

Đăng nhập
🔐

Tab dành cho giảng viên

Tab này chứa danh sách các lỗi đã cài cắm trong form. Vui lòng nhập mã giảng viên để mở khóa. Mã sẽ ghi nhớ trong phiên làm việc — chỉ cần nhập 1 lần cho cả 3 bài.