> ## Documentation Index
> Fetch the complete documentation index at: https://tomotek.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# US-OWN-15: Giỏ hàng

> Pet Owner quản lý danh sách sản phẩm, điều chỉnh số lượng và chọn sản phẩm để thanh toán

Là một Pet Owner, tôi muốn quản lý danh sách các sản phẩm đã chọn để điều chỉnh số lượng, kiểm tra tổng tiền và chuẩn bị cho bước thanh toán.

## Acceptance Criteria (AC)

| Feature | Acceptance Criteria | Ràng buộc & Ghi chú |
| :- | :- | :- |
| **1. Gom nhóm sản phẩm** | • Các sản phẩm cùng thuộc một Merchant được hiển thị chung trong một khối (Block). • Tiêu đề khối: Checkbox chọn toàn bộ Shop, Tên Shop (Clickable để sang US-OWN-20). | • Sản phẩm được thêm mới nhất sẽ hiển thị trên cùng. |
| **2. Thông tin sản phẩm** | • Hiển thị: Ảnh Thumbnail, Tên sản phẩm, Giá hiện tại, Trạng thái tồn kho (VD: "Chỉ còn 2 sản phẩm"). | • Giá hiện tại = Giá gốc - Giảm giá trực tiếp (Nếu có). |
| **3. Điều chỉnh số lượng** | • Cung cấp bộ nút `[-]` `[Số lượng]` `[+]`. • **Giới hạn dưới:** Nếu giảm về 0 (nhấn `[-]` khi đang là 1), hiện Popup hỏi: "Xoá sản phẩm khỏi giỏ?". • **Giới hạn trên:** Không được nhập/nhấn vượt quá số lượng tồn kho. | • Cho phép gõ trực tiếp số lượng vào ô input. |
| **4. Cơ chế Checkbox** | • **3 cấp độ:** Chọn tất cả (Global), Chọn theo Shop, Chọn từng món. • Tự động tính lại "Tổng tiền tạm tính" ngay khi có thay đổi tick chọn. | • Khóa checkbox (Disabled) đối với các sản phẩm hết hàng hoặc ngừng kinh doanh. |
| **5. Cập nhật giá Real-time** | • Nếu Merchant đổi giá khi người dùng đang mở giỏ hàng, hệ thống tự động cập nhật giá mới. • Hiển thị Badge/Text cảnh báo: "Giá sản phẩm đã thay đổi". | • Đảm bảo giá lúc thanh toán là giá mới nhất. |
| **6. Trạng thái Hết hàng/Xoá** | • Sản phẩm bị mờ (Grey out) nếu Hết hàng, Ngừng kinh doanh hoặc Xoá. • Hiển thị nút "Xoá nhanh" cho các sản phẩm không còn hiệu lực này. | • Không cộng sản phẩm này vào Tổng tiền. |
| **7. Tổng tiền & Thanh toán** | • **Thanh Bottom:** Hiện Tổng tiền (Chỉ tính hàng đã chọn) và Nút "Mua hàng (X)". • Nút "Mua hàng" sáng lên (Active) khi có $\ge 1$ sản phẩm hợp lệ được chọn. | • Ghi chú dưới tổng tiền: "Chưa bao gồm phí vận chuyển". |

## Luồng ngoại lệ (Exception Flows) & Validations

* **Vượt quá định mức tồn kho:**
  * **Validation:** Nếu người dùng gõ số "10" vào ô số lượng, nhưng tồn kho chỉ có 5.
  * **Error UI:** Hệ thống tự động đẩy số lượng về 5 và hiển thị Toast: *"Shop chỉ còn 5 sản phẩm. Chúng tôi đã điều chỉnh số lượng giúp bạn."*
* **Sản phẩm bị xoá đột ngột (Race condition):**
  * **Flow:** Người dùng tick chọn sản phẩm đang còn hàng, nhưng vừa lúc đó Merchant xóa sản phẩm. Người dùng nhấn "Mua hàng".
  * **Error UI:** Hệ thống chặn chuyển trang, load lại giỏ hàng, làm mờ sản phẩm đó và báo: *"Sản phẩm \[Tên SP] đã ngừng kinh doanh. Vui lòng bỏ chọn để tiếp tục."*

## Quy tắc nghiệp vụ (Business Rules)

1. **Rule 1: Giới hạn lưu trữ Giỏ hàng**: Để đảm bảo hiệu năng và UI gọn gàng, giỏ hàng của một user chỉ chứa tối đa 50 mặt hàng khác nhau. Nếu thêm món thứ 51, hiển thị cảnh báo: *"Giỏ hàng đã đầy (Tối đa 50 sản phẩm). Vui lòng thanh toán hoặc xoá bớt trước khi thêm mới."*
2. **Rule 2: Final Stock Check**: Nút "Mua hàng" là Trigger Point. Ngay khi bấm, hệ thống gọi API check tồn kho **real-time lần cuối**. Nếu pass, chuyển sang trang Thanh toán (US-OWN-16).


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.