# TSHIRTORDER-XXXX — Loại sản phẩm mới: Dynamic Attributes kiểu Shopify

**Trạng thái:** Chờ spec  
**Yêu cầu bởi:** Boss (Kevin)  
**Ngày ghi nhận:** 2026-06-18

---

## Bối cảnh

Boss muốn thêm một loại sản phẩm mới trong TshirtOrder hoạt động giống như hệ thống variant của Shopify — tức là định nghĩa các attribute (Color, Size, Print...) ở cấp global, khi tạo sản phẩm chỉ cần chọn các giá trị muốn dùng, hệ thống sẽ **tự động generate SKU** bằng cách ghép mã attribute vào sau.

Mục tiêu là thay thế cách làm thủ công hiện tại (tạo sub-product cho từng size).

---

## Hệ thống hiện tại hoạt động như thế nào

### Model: Parent product → Sub-products (sản phẩm con)

- Mỗi sub-product là **một row riêng trong bảng `products`**, chỉ khác là có `parent_product_id` trỏ về parent
- Entity: `Product.productParent` / `Product.productChildren` — self-referencing ORM (`src/Entity/Product.php:64-69`)
- `color` chỉ là một text field thường trên parent — không có cấu trúc
- Size lấy từ ManyToMany với `StatusList` (bảng lookup chung) + text field `size` trên sub-product
- SKU phải **nhập tay**, không tự động generate
- Khi đặt hàng, `orders_products` lưu cả `productId` (parent) lẫn `subProductId` (variant size) (`src/Entity/OrderProduct.php:47-56`)

### Vấn đề với cách làm hiện tại

- Muốn thêm màu mới (ví dụ màu Xanh) → phải tạo 1 parent mới + tạo lại toàn bộ sub-products S/M/L/XL thủ công
- Không có liên kết giữa "áo đỏ" và "áo xanh" cùng một model
- SKU nhập tay → dễ sai, mất thời gian

---

## Boss muốn gì (Shopify-style)

Định nghĩa **attribute** trước ở cấp global (ví dụ: `Color`, `Size`, `Print`) kèm các giá trị và mã SKU.  
Khi tạo sản phẩm chỉ cần chọn giá trị → hệ thống **tự generate variants**.

### Ví dụ

```
Tạo attribute:
  Color: RED (Đỏ), BLU (Xanh), BLK (Đen)
  Size:  S, M, L, XL

Tạo product "T-shirt Basic", chọn Color=RED,BLU + Size=S,M,L
→ Hệ thống tự generate 6 variants:
   BASIC-RED-S, BASIC-RED-M, BASIC-RED-L
   BASIC-BLU-S, BASIC-BLU-M, BASIC-BLU-L
```

---

## Hướng kỹ thuật (đề xuất, chờ spec xác nhận)

### Các entity mới cần tạo

| Entity | Mục đích |
|--------|----------|
| `ProductAttribute` | Định nghĩa loại attribute: `name = "Color"`, `code = "color"` |
| `ProductAttributeValue` | Giá trị của attribute: `Color → Đỏ (code: RED)` |
| `ProductVariant` | Variant được generate: liên kết tới parent + các attribute value đã chọn + `sku`, `stock`, `price` riêng |

### Backward compatibility — 2 loại sản phẩm chạy song song

- Thêm field `productType` vào `Product` — giá trị `'standard'` (hệ thống cũ) hoặc `'variant'` (hệ thống mới)
- Tất cả sản phẩm hiện tại giữ `productType = 'standard'` → **không bị ảnh hưởng gì**
- `OrderProduct` thêm field nullable `variantId` bên cạnh `subProductId` hiện có
- Order flow check `productType` để biết dùng hệ thống nào

### Các file bị ảnh hưởng

- `src/Entity/Product.php` — thêm field `productType`
- `src/Entity/OrderProduct.php` — thêm field `variantId`
- `src/Service/ProductService.php` — xử lý generate variant + SKU tự động
- Các entity mới + migration
- API endpoints mới: `/api/v1/product-attributes/`, `/api/v1/product-variants/`

---

## Các bước tiếp theo

- [ ] Boss gửi spec chi tiết
- [ ] Thiết kế DB schema cho `ProductAttribute`, `ProductAttributeValue`, `ProductVariant`
- [ ] Tạo Doctrine entities + migration
- [ ] Implement `ProductVariantService` với logic auto-generate SKU
- [ ] Thêm API endpoints
- [ ] Frontend implementation
