# Sản phẩm

> Base URL: `https://pos.pages.fm/api/v1`. Xác thực bằng tham số truy vấn `api_key`.

## Tạo sản phẩm

`POST /shops/{SHOP_ID}/products`

### Tham số

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| `SHOP_ID` | path | integer | yes | Mã shop |

### Nội dung yêu cầu

Thông tin yêu cầu chứa thông tin sản phẩm cần tạo

- `product` (Product, required): 
  - `measure_group_id` (integer): Mã nhóm đơn vị tính
  - `name` (string, required): Tên sản phẩm
  - `type` (string): Loại hình sản phẩm. `product`: Sản phẩm (mặc định). `accessory`: Phụ kiện, đi kèm đơn hàng, không có giá bán (giá bán được đưa về 0) và không tính vào số lượng hàng bán được trong báo cáo. `service`: Dịch vụ, không cần quản lý tồn kho. `LOT`: Sản phẩm có HSD, quản lý tồn kho theo lô hạn sử dụng, bắt buộc chọn lô khi nhập/xuất kho (shop cần bật quản lý lô). Values: `product`, `accessory`, `service`, `LOT`.
  - `category_ids` (integer[]): Danh sách mã danh mục
  - `note` (string): Ghi chú nội bộ
  - `note_product` (string): Ghi chú sản phẩm
  - `product_attributes` (object[]): Thuộc tính sản phẩm
  - `tags` (integer[]): Thẻ sản phẩm
  - `weight` (integer, required): Trọng lượng sản phẩm
  - `custom_id` (string): Mã tùy chỉnh sản phẩm
  - `is_published` (boolean): Trạng thái Store cake
  - `variations` (Variation[]): Danh sách mẫu mã
  - `bonus_products` (object[]): Sản phẩm tặng kèm
  - `materials` (integer[]): Danh sách mã nguyên liệu
  - `keyword` (string): Từ khóa
  - `brand_id` (string (uuid)): Mã thương hiệu

```json
{
  "product": {
    "name": "Ao so mi nam",
    "type": "product",
    "category_ids": [
      1290021044,
      201250699
    ],
    "note_product": "Ghi chú sản phẩm",
    "product_attributes": [
      {
        "name": "Màu",
        "values": [
          "Đen",
          "Trắng",
          "Đỏ"
        ]
      },
      {
        "name": "Size",
        "values": [
          "S",
          "M",
          "L"
        ]
      }
    ],
    "tags": [
      193,
      51
    ],
    "variations": [
      {
        "fields": [
          {
            "name": "Màu",
            "value": "Trắng"
          },
          {
            "name": "Size",
            "value": "M"
          }
        ],
        "images": [
          "https://statics.pancake.vn/user-content.pancake.vn/2021/8/5/fccd6.jpg"
        ],
        "last_imported_price": 30000,
        "retail_price": 140000,
        "price_at_counter": 123000,
        "retail_price_by_currency": [
          {
            "currency": "VND",
            "retailPriceByCurrency": 140000
          },
          {
            "currency": "USD",
            "retailPriceByCurrency": 6
          }
        ],
        "weight": 0,
        "barcode": "BARCODE123",
        "custom_id": "VCUSTOMID",
        "is_hidden": false,
        "variations_warehouses": [
          {
            "remain_quantity": 10,
            "warehouse_id": "c52e67ad-d9d0-4276-abe4-e0c9f1f7d2da",
            "batch_position": "lô 1",
            "shelf_position": "1.2"
          }
        ],
        "wholesale_price2": [
          {
            "levelProduct": "1",
            "wholesalePrices": "100000"
          },
          {
            "levelProduct": "2",
            "wholesalePrices": "200000"
          }
        ]
      }
    ],
    "weight": 1,
    "custom_id": "PCUSTOMID",
    "is_published": true,
    "materials": [
      182,
      193
    ],
    "bonus_products": [
      {
        "quantity": 1,
        "variation_id": "61fb5d14-107d-4b78-908d-8dc04f59d2d6",
        "price_original": 11000,
        "images": [
          "https://statics.pancake.vn/user-content.pancake.vn/2021/8/5/fccd6.jpg"
        ],
        "variation_info": {
          "id": "1",
          "measure_group_id": "2220",
          "measure_info": {
            "exchange_value": 100000,
            "measure_id": 2252
          },
          "name": "Combo 10 cây giống Cải nhún",
          "product_id": "RAL10.2675",
          "weight": 1000
        }
      }
    ],
    "keyword": "vai|cao cấp",
    "brand_id": "c52e67ad-d9d0-4276-abe4-e0c9f1f7d2da"
  }
}
```

### Phản hồi

- `200` Success (object)

```json
{
  "success": true
}
```

## Cập nhật thông tin sản phẩm

`PUT /shops/{SHOP_ID}/products/{PRODUCT_ID}`

### Tham số

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| `SHOP_ID` | path | integer | yes | Mã shop |
| `PRODUCT_ID` | path | string | yes | Mã sản phẩm |

### Nội dung yêu cầu

Thông tin yêu cầu chứa thông tin sản phẩm cần cập nhật

- `product` (Product, required): 
  - `measure_group_id` (integer): Mã nhóm đơn vị tính
  - `name` (string, required): Tên sản phẩm
  - `type` (string): Loại hình sản phẩm. `product`: Sản phẩm (mặc định). `accessory`: Phụ kiện, đi kèm đơn hàng, không có giá bán (giá bán được đưa về 0) và không tính vào số lượng hàng bán được trong báo cáo. `service`: Dịch vụ, không cần quản lý tồn kho. `LOT`: Sản phẩm có HSD, quản lý tồn kho theo lô hạn sử dụng, bắt buộc chọn lô khi nhập/xuất kho (shop cần bật quản lý lô). Values: `product`, `accessory`, `service`, `LOT`.
  - `category_ids` (integer[]): Danh sách mã danh mục
  - `note` (string): Ghi chú nội bộ
  - `note_product` (string): Ghi chú sản phẩm
  - `product_attributes` (object[]): Thuộc tính sản phẩm
  - `tags` (integer[]): Thẻ sản phẩm
  - `weight` (integer, required): Trọng lượng sản phẩm
  - `custom_id` (string): Mã tùy chỉnh sản phẩm
  - `is_published` (boolean): Trạng thái Store cake
  - `variations` (Variation[]): Danh sách mẫu mã
  - `bonus_products` (object[]): Sản phẩm tặng kèm
  - `materials` (integer[]): Danh sách mã nguyên liệu
  - `keyword` (string): Từ khóa
  - `brand_id` (string (uuid)): Mã thương hiệu

```json
{
  "product": {
    "name": "Ao so mi nam",
    "type": "product",
    "category_ids": [
      1290021044,
      201250699
    ],
    "note_product": "Ghi chú sản phẩm",
    "product_attributes": [
      {
        "name": "Màu",
        "values": [
          "Đen",
          "Trắng",
          "Đỏ"
        ]
      },
      {
        "name": "Size",
        "values": [
          "S",
          "M",
          "L"
        ]
      }
    ],
    "variations": [
      {
        "id": "3c3aca82-030e-4708-a75b-b2eaf538a2f5",
        "fields": [
          {
            "name": "Màu",
            "value": "Trắng"
          },
          {
            "name": "Size",
            "value": "M"
          }
        ],
        "images": [],
        "last_imported_price": 30000,
        "retail_price": 140000,
        "price_at_counter": 123000,
        "retail_price_by_currency": [
          {
            "currency": "VND",
            "retailPriceByCurrency": 140000
          },
          {
            "currency": "USD",
            "retailPriceByCurrency": 6
          }
        ],
        "weight": 0,
        "barcode": "BARCODE123",
        "custom_id": "VCUSTOMID",
        "is_hidden": false,
        "variations_warehouses": [
          {
            "remain_quantity": 10,
            "warehouse_id": "c52e67ad-d9d0-4276-abe4-e0c9f1f7d2da",
            "batch_position": "lô 1",
            "shelf_position": "1.2"
          }
        ],
        "wholesale_price2": [
          {
            "levelProduct": "1",
            "wholesalePrices": "100000"
          },
          {
            "levelProduct": "2",
            "wholesalePrices": "200000"
          }
        ]
      },
      {
        "fields": [
          {
            "name": "Màu",
            "value": "Đỏ"
          },
          {
            "name": "Size",
            "value": "L"
          }
        ],
        "images": [
          "https://statics.pancake.vn/user-content.pancake.vn/2021/8/5/fccd6.jpg"
        ],
        "last_imported_price": 30000,
        "retail_price": 140000,
        "price_at_counter": 123000,
        "retail_price_by_currency": [
          {
            "currency": "VND",
            "retailPriceByCurrency": 140000
          },
          {
            "currency": "USD",
            "retailPriceByCurrency": 6
          }
        ],
        "weight": 0,
        "barcode": "BARCODE123",
        "custom_id": "VCUSTOMID2",
        "is_hidden": false,
        "variations_warehouses": [
          {
            "remain_quantity": 10,
            "warehouse_id": "c52e67ad-d9d0-4276-abe4-e0c9f1f7d2da",
            "batch_position": "lô 1",
            "shelf_position": "1.2"
          }
        ],
        "wholesale_price2": [
          {
            "levelProduct": "1",
            "wholesalePrices": "100000"
          },
          {
            "levelProduct": "2",
            "wholesalePrices": "200000"
          }
        ]
      }
    ],
    "weight": 1,
    "custom_id": "PCUSTOMID",
    "is_published": true,
    "tags": [
      193,
      51
    ],
    "materials": [
      182,
      193
    ],
    "bonus_products": [
      {
        "quantity": 1,
        "variation_id": "61fb5d14-107d-4b78-908d-8dc04f59d2d6",
        "price_original": 11000,
        "images": [
          "https://statics.pancake.vn/user-content.pancake.vn/2021/8/5/fccd6.jpg"
        ],
        "variation_info": {
          "id": "1",
          "measure_group_id": "2220",
          "measure_info": {
            "exchange_value": 100000,
            "measure_id": 2252
          },
          "name": "Combo 10 cây giống Cải nhún",
          "product_id": "RAL10.2675",
          "weight": 1000
        }
      }
    ],
    "keyword": "vai|cao cấp"
  }
}
```

### Phản hồi

- `200` Success (object)

```json
{
  "success": true
}
```

## Cập nhật tồn kho

`POST /shops/{SHOP_ID}/variations/{VARIATION_ID}/update_quantity`

Cập nhật số lượng tồn kho cho mẫu mã

### Tham số

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| `SHOP_ID` | path | integer | yes | Mã shop |
| `VARIATION_ID` | path | string | yes | Mã mẫu mã |

### Nội dung yêu cầu

Thông tin yêu cầu chứa thông tin cập nhật tồn kho cho mẫu mã

- `variations_warehouses` (object[], required): Thông tin kho
  - `remain_quantity` (integer, required): Số lượng tồn
  - `warehouse_id` (string, required): Mã kho

```json
{
  "variations_warehouses": [
    {
      "remain_quantity": 20,
      "warehouse_id": "a41b5d73-9236-4a5d-9954-4db6d93242d1"
    },
    {
      "remain_quantity": 20,
      "warehouse_id": "a41b5d73-9236-4a5d-9954-4db6d93242d4"
    },
    {
      "remain_quantity": 20,
      "warehouse_id": "a41b5d73-9236-4a5d-9954-4db6d93242d5"
    }
  ]
}
```

### Phản hồi

- `200` Success (object)

```json
{
  "success": true
}
```

## Cập nhật tồn kho nhiều mẫu mã

`POST /shops/{SHOP_ID}/variations/update_quantity`

Cập nhật số lượng tồn kho cho nhiều mẫu mã

### Tham số

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| `SHOP_ID` | path | integer | yes | Mã shop |

### Nội dung yêu cầu

Thông tin yêu cầu chứa thông tin cập nhật tồn kho cho nhiều mẫu mã

- `is_actual_remain_quantity` (boolean): true: Cập nhật tồn kho, false: Cập nhật có thể bán
- `variations_warehouses` (object[], required): Thông tin tồn kho
  - `variation_id` (string, required): Mã mẫu mã
  - `remain_quantity` (integer, required): Số lượng tồn kho
  - `warehouse_id` (string, required): Mã kho

```json
{
  "is_actual_remain_quantity": true,
  "variations_warehouses": [
    {
      "variation_id": "20e7d183-c70c-445e-8ce2-4d7e3a378e34",
      "remain_quantity": 15,
      "warehouse_id": "229102e4-39c3-4523-bd57-4ed0a45a85ba"
    },
    {
      "variation_id": "5f0cfb8d-aee9-4ec0-9ff0-b5668d3143d2",
      "remain_quantity": 15,
      "warehouse_id": "24c4447e-c35f-4acc-affa-70e49eb354d1"
    }
  ]
}
```

### Phản hồi

- `200` Success (object)

```json
{
  "success": true
}
```

## Cập nhật sản phẩm cấu thành

`POST /shops/{SHOP_ID}/variations/update_composite_product`

Cập nhật thông tin sản phẩm cấu thành

### Tham số

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| `SHOP_ID` | path | integer | yes | Mã shop |

### Nội dung yêu cầu

Thông tin yêu cầu chứa thông tin cập nhật sản phẩm cấu thành

- `variation_id` (string, required): Mã mẫu mã
- `composite_products` (object[], required): Danh sách sản phẩm cấu thành
  - `quantity` (integer, required): Số lượng cấu thành
  - `component_id` (string, required): Mã mẫu mã cấu thành

```json
{
  "variation_id": "79aecce9-3b1e-4ad3-afe1-2ee658720687",
  "composite_products": [
    {
      "quantity": 1,
      "component_id": "67b19856-3226-457e-a746-df26e4ec1360"
    }
  ]
}
```

### Phản hồi

- `200` Success (object)

```json
{
  "success": true
}
```

## Danh sách sản phẩm

`GET /shops/{SHOP_ID}/products/variations`

Lấy danh sách sản phẩm và mẫu mã, kèm thông tin tồn kho theo từng kho, tốc độ bán (để phát hiện sản phẩm sắp hết hàng) và nhà cung cấp.

### Tham số

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| `SHOP_ID` | path | integer | yes | Mã shop |
| `page_size` | query | integer |  | Kích thước trang |
| `page_number` | query | integer |  | Số trang |
| `search` | query | string |  | Từ khóa tìm kiếm |
| `selling_status` | query | string |  | Tốc độ bán Values: `none` Thử nghiệm, `bad` Bán chậm, `normal` Bình thường, `star` Bán nhanh. |
| `product_status` | query | string |  | Trạng thái sản phẩm Values: `locked` Không hoạt động, `not_locked` Hoạt động. |
| `category_id[]` | query | integer[] |  | Danh sách mã danh mục |
| `is_filter_categories_by_or` | query | boolean |  | Lọc danh mục theo điều kiện or |
| `filter_exclude_categories` | query | boolean |  | Lọc loại trừ danh mục |
| `warehouse_until` | query | string (date-time) |  | Lấy thông tin tồn kho tại 1 thời điểm |
| `promotion_advance[]` | query | string[] |  | ID khuyến mãi nâng cao |
| `manipulationWarehouse[]` | query | string[] |  | Mã kho thao tác |
| `startDate` | query | integer |  | Thời điểm đầu tạo sản phẩm |
| `endDate` | query | integer |  | Thời điểm cuối tạo sản phẩm |
| `start_time_update` | query | integer |  | Thời điểm đầu cập nhật sản phẩm |
| `end_time_update` | query | integer |  | Thời điểm cuối cập nhật sản phẩm |
| `included_composite` | query | string |  | Lọc sản phẩm cấu thành Values: `parent` Sản phẩm được cấu thành từ sản phẩm khác, `children` Sản phẩm cấu thành cho sản phẩm khác, `false` Không lọc. |
| `variation_ids[]` | query | string[] |  | Lọc theo mã sản phẩm |
| `product_attributes[]` | query | string[] |  | Lọc theo thuộc tính sản phẩm |
| `remainQuantity` | query | string |  | Lọc theo **số tồn có thể bán** (`remain_quantity`). Truyền JSON dưới dạng chuỗi: - `type`: `"greaterOrEqual"` \| `"smallerOrEqual"` \| `"between"` - `value`: ngưỡng so sánh khi `type` là `greaterOrEqual` / `smallerOrEqual` - `minValue`, `maxValue`: khoảng dùng khi `type` là `between` - `warehouseId`: `"all"` \| UUID kho \| mảng UUID — giới hạn các kho tham gia lọc - `isFilterTotal`: `false` (mặc định) so sánh từng kho; `true` so sánh TỔNG qua các kho được chọn Khi bất kỳ filter số lượng nào (`remainQuantity` / `actualQuantity` / `waittingQuantity` / `returningQuantity` / `pendingQuantity` / `totalQuantity`) được set, mỗi variation trong response sẽ có thêm trường `warehouse_ids` liệt kê các kho match điều kiện. |
| `actualQuantity` | query | string |  | Lọc theo **số tồn thực có trong kho** (`actual_remain_quantity`). Cùng cấu trúc JSON với `remainQuantity`. |
| `waittingQuantity` | query | string |  | Lọc theo **số lượng đang chờ giao** (`waitting_quantity`). Cùng cấu trúc JSON với `remainQuantity`. (Lưu ý: tên param giữ nguyên cách viết `waitt-` để tương thích với client hiện hữu.) |
| `returningQuantity` | query | string |  | Lọc theo **số lượng đang trả về kho** (`returning_quantity`). Cùng cấu trúc JSON với `remainQuantity`. |
| `pendingQuantity` | query | string |  | Lọc theo **số lượng đang giữ chỗ** (`pending_quantity`). Cùng cấu trúc JSON với `remainQuantity`. |
| `totalQuantity` | query | string |  | Lọc theo **tổng số lượng** (`total_quantity`). Cùng cấu trúc JSON với `remainQuantity`. |
| `limit_quantity_to_warn` | query | boolean |  | Khi `true`, chỉ trả về sản phẩm có tồn kho đã chạm ngưỡng cảnh báo — tức **sản phẩm sắp hết hàng**. Ngưỡng được cấu hình theo từng sản phẩm (`limit_quantity_to_warn` trên Sản phẩm hoặc Mẫu mã, tùy theo cờ `warning_by_variation` của sản phẩm đó). |
| `defectQuantity` | query | boolean |  | Khi `true`, chỉ trả về mẫu mã có **hàng lỗi/hỏng** (`defect_quantity > 0` ở ít nhất một kho). |
| `nearly_out` | query | boolean |  | Khi `true`, chỉ trả về mẫu mã được đánh dấu **sắp hết hàng** ở ít nhất một kho (cờ `nearly_out` đã tính sẵn trên row kho). Tương tự `limit_quantity_to_warn` nhưng đọc cờ đã lưu theo từng kho thay vì tính lại ngưỡng lúc query. |

### Phản hồi

- `200` Success (object)

```json
{
  "success": true,
  "data": [
    {
      "average_imported_price": 50000,
      "barcode": null,
      "display_id": "ADXL",
      "is_hidden": false,
      "is_locked": false,
      "is_sell_negative_variation": true,
      "fields": [
        {
          "id": "b032c515-3f71-4a1b-8e1d-77721ae72f37",
          "name": "màu",
          "value": "nâu"
        },
        {
          "id": "677c14b5-458f-4af6-8d73-08bcb2245547",
          "name": "size",
          "value": "s"
        }
      ],
      "id": "e190db2b-1163-4cc3-b956-7a9528fbf5ef",
      "images": [
        "https://cf.shopee.vn/file/03e670d02803fcfbb17b2b719762ee17",
        "https://cf.shopee.vn/file/9070bb1b0e6fcc84b46b6e5057544023"
      ],
      "inserted_at": "2024-01-10T14:34:44.000000",
      "last_imported_price": 55000,
      "price_at_counter": 123000,
      "product_id": "3b98a639-9d40-4faa-a692-6662f20e128d",
      "product": {
        "note": "Dễ vỡ",
        "note_product": "Ghi chú sản phẩm",
        "categories": [],
        "display_id": "ADXL",
        "image": "https://content.pancake.vn/user-content-dev2.pancake.vn/2024/11/7/1fdf82943574017240257bf9c88bc70a06a8813a.png",
        "inserted_at": "2024-01-10T14:34:44",
        "measure_group_id": 58,
        "name": "ASOS đen XL",
        "supplier_product_ids": [
          270
        ],
        "tags": [
          {
            "id": 51,
            "note": "the 3"
          },
          {
            "id": 193,
            "note": "thẻ 1"
          }
        ],
        "is_published": true,
        "manipulation_warehouses": [
          "c52e67ad-d9d0-4276-abe4-e0c9f1f7d2da"
        ],
        "product_attributes": [
          {
            "name": "Color",
            "values": [
              "black",
              "white"
            ]
          },
          {
            "name": "Size",
            "values": [
              "S",
              "M"
            ]
          }
        ],
        "bonus_products": [
          {
            "quantity": 1,
            "variation_id": "61fb5d14-107d-4b78-908d-8dc04f59d2d6",
            "price_original": 11000,
            "images": [
              "https://statics.pancake.vn/user-content.pancake.vn/2021/8/5/fccd6.jpg"
            ],
            "variation_info": {
              "id": "1",
              "measure_group_id": "2220",
              "measure_info": {
                "exchange_value": 100000,
                "measure_id": 2252
              },
              "name": "Combo 10 cây giống Cải nhún",
              "product_id": "RAL10.2675",
              "weight": 1000
            }
          }
        ]
      },
      "remain_quantity": 20,
      "retail_price": 140000,
      "retail_price_by_currency": [
        {
          "currency": "VND",
          "retailPriceByCurrency": "140000"
        },
        {
          "currency": "USD",
          "retailPriceByCurrency": "6"
        }
      ],
      "size": {
        "length": 10,
        "width": 10,
        "height": 10
      },
      "total_purchase_price": 4500000,
      "variations_warehouses": [
        {
          "actual_remain_quantity": 100,
          "pending_quantity": 0,
          "remain_quantity": 20,
          "returning_quantity": 0,
          "selling_avg": 0.23,
          "total_quantity": 102,
          "warehouse_id": "a41b5d73-9236-4a5d-9954-4db6d93242d1"
        }
      ],
      "wholesale_price": [],
      "price_table": [
        {
          "id": "a07c-3f7b-2db0-8002-6a88-7d4c-e7c3",
          "name": "Giá bán sỉ",
          "price": 200000
        },
        {
          "id": "2251-43fa-9de5-765f-89ab-7246-c67b",
          "name": "Giá bán lẻ",
          "price": 150000
        }
      ],
      "keyword": "ANPR",
      "updated_at": "2026-03-09T01:45:58.013616"
    }
  ],
  "page_number": 1,
  "page_size": 30,
  "total_entries": 751,
  "total_pages": 26
}
```

## Lấy thông tin 1 sản phẩm

`GET /shops/{SHOP_ID}/products/{PRODUCT_SKU}`

### Tham số

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| `SHOP_ID` | path | integer | yes | Mã shop |
| `PRODUCT_SKU` | path | string | yes | Mã SKU hoặc ID sản phẩm |

### Phản hồi

- `200` Success (Product)

```json
{
  "measure_group_id": 58,
  "name": "Ao so mi nam",
  "category_ids": [
    1290021044,
    201250699
  ],
  "note": "dễ vỡ",
  "note_product": "Ghi chú sản phẩm",
  "product_attributes": [
    {
      "name": "Color",
      "values": [
        "black",
        "white"
      ]
    },
    {
      "name": "Size",
      "values": [
        "s",
        "m"
      ]
    }
  ],
  "tags": [
    193,
    51
  ],
  "weight": 1,
  "custom_id": "PCUSTOMID",
  "is_published": true,
  "variations": [
    {
      "id": null,
      "fields": [
        {
          "name": "Màu",
          "value": "Trắng"
        },
        {
          "name": "Size",
          "value": "M"
        }
      ],
      "images": [
        "https://statics.pancake.vn/user-content.pancake.vn/2021/8/5/fccd6.jpg"
      ],
      "last_imported_price": 30000,
      "retail_price": 140000,
      "retail_price_by_currency": [
        {
          "currency": "VND",
          "retailPriceByCurrency": "140000"
        },
        {
          "currency": "USD",
          "retailPriceByCurrency": "6"
        }
      ],
      "price_at_counter": 123000,
      "weight": 0,
      "size": {
        "length": 10,
        "width": 10,
        "height": 10
      },
      "barcode": "BARCODE123",
      "custom_id": "VCUSTOMID",
      "is_hidden": false,
      "variations_warehouses": [
        {
          "remain_quantity": 10,
          "warehouse_id": "c52e67ad-d9d0-4276-abe4-e0c9f1f7d2da",
          "batch_position": "lô 1",
          "shelf_position": "1.2"
        }
      ],
      "is_removed": false,
      "keyword": "VCUSTOMID"
    }
  ],
  "variations_warehouses": [
    {
      "remain_quantity": 10,
      "warehouse_id": "c52e67ad-d9d0-4276-abe4-e0c9f1f7d2da",
      "batch_position": "lô 1",
      "shelf_position": "1.2"
    }
  ],
  "materials": [
    182,
    193
  ],
  "bonus_products": [
    {
      "quantity": 1,
      "variation_id": "61fb5d14-107d-4b78-908d-8dc04f59d2d6",
      "price_original": 11000,
      "images": [
        "https://statics.pancake.vn/user-content.pancake.vn/2021/8/5/fccd6.jpg"
      ],
      "variation_info": {
        "id": "1",
        "measure_group_id": "2220",
        "measure_info": {
          "exchange_value": 100000,
          "measure_id": 2252
        },
        "name": "Combo 10 cây giống Cải nhún",
        "product_id": "RAL10.2675",
        "weight": 1000
      }
    }
  ],
  "keyword": "vai|cao cấp"
}
```

## Ẩn sản phẩm

`PUT /shops/{SHOP_ID}/products/update_hide`

### Tham số

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| `SHOP_ID` | path | integer | yes | Mã shop |

### Nội dung yêu cầu

Thông tin yêu cầu chứa thông tin ẩn/hiện sản phẩm

- `is_hide` (boolean, required): Ẩn sản phẩm
- `product_ids` (string[], required): Danh sách mã sản phẩm

```json
{
  "is_hide": true,
  "product_ids": [
    "3cbf2227-0205-446e-8c0e-584995f3cb23",
    "36b1e64c-f1f7-4518-afeb-1f9d2edc0f3e"
  ]
}
```

### Phản hồi

- `200` Success (object)

```json
{
  "success": true
}
```

## Danh sách thẻ sản phẩm

`GET /shops/{SHOP_ID}/tags_products`

Lấy danh sách thẻ sản phẩm (không gồm thẻ đã xóa), sắp xếp theo thứ tự hiển thị tăng dần

### Tham số

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| `SHOP_ID` | path | integer | yes | Mã shop |

### Phản hồi

- `200` Success (object)

```json
{
  "success": true,
  "data": [
    {
      "id": 358,
      "index": 0,
      "inserted_at": "2025-07-15T10:38:48",
      "updated_at": "2025-07-15T14:43:16",
      "note": "Hàng dễ vỡ",
      "shop_id": 224
    },
    {
      "id": 359,
      "index": 1,
      "inserted_at": "2025-07-15T11:05:21",
      "updated_at": "2025-07-15T14:43:16",
      "note": "Hàng mới về",
      "shop_id": 224
    }
  ]
}
```

## Tạo thẻ sản phẩm

`POST /shops/{SHOP_ID}/tags_products`

### Tham số

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| `SHOP_ID` | path | integer | yes | Mã shop |

### Nội dung yêu cầu

Thông tin yêu cầu chứa thông tin thẻ sản phẩm cần tạo

- `name` (string, required): Tên thẻ

```json
{
  "name": "Sản phẩm dễ vỡ"
}
```

### Phản hồi

- `200` Success (object)

```json
{
  "success": true,
  "data": {
    "id": 368,
    "index": null,
    "inserted_at": "2025-09-19T10:26:38",
    "note": "Sản phẩm dễ vỡ",
    "shop_id": 20,
    "updated_at": "2025-09-19T10:26:38"
  }
}
```

## Danh mục sản phẩm

`GET /shops/{SHOP_ID}/categories`

Lấy danh sách danh mục sản phẩm

### Tham số

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| `SHOP_ID` | path | integer | yes | Mã shop |

### Phản hồi

- `200` Success (object)

```json
{
  "success": true,
  "data": [
    {
      "id": 865301,
      "nodes": [],
      "text": "AirSense Áo Khoác Siêu Nhẹ"
    },
    {
      "id": 30163,
      "nodes": [
        {
          "id": 30167,
          "nodes": [],
          "text": "Áo Thun"
        },
        {
          "id": 30169,
          "nodes": [
            {
              "id": 865293,
              "nodes": [],
              "text": "Áo Thun In Họa Tiết"
            }
          ],
          "text": "Áo Cardigan"
        },
        {
          "id": 865292,
          "nodes": [],
          "text": "Áo Nỉ & Áo Hoodie"
        }
      ],
      "text": "ÁO"
    }
  ]
}
```

## Tạo danh mục sản phẩm

`POST /shops/{SHOP_ID}/categories`

### Tham số

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| `SHOP_ID` | path | integer | yes | Mã shop |

### Nội dung yêu cầu

Thông tin yêu cầu chứa thông tin danh mục sản phẩm cần tạo

- `name` (string, required): Tên danh mục
- `parent_id` (string): Mã danh mục cha

```json
{
  "name": "Sản phẩm dễ vỡ",
  "parent_id": 30163
}
```

### Phản hồi

- `200` Success (Category)

```json
{
  "success": true,
  "data": {
    "id": 3299,
    "name": "Sản phẩm dễ vỡ"
  }
}
```

## Danh sách thương hiệu sản phẩm

`GET /shops/{SHOP_ID}/brand`

Lấy danh sách thương hiệu sản phẩm

### Tham số

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| `SHOP_ID` | path | integer | yes | Mã shop |
| `page` | query | integer |  | Số trang |
| `page_size` | query | integer |  | Kích thước trang |
| `search` | query | string |  | Tìm kiếm theo tên thương hiệu hoặc mã thương hiệu |

### Phản hồi

- `200` Success (object)

```json
{
  "data": [
    {
      "id": "921f6676-4103-4b63-8503-78737fa74d11",
      "name": "Movado",
      "description": "Brand of Viet Nam",
      "inserted_at": "2025-09-05T08:43:54",
      "updated_at": "2025-09-05T08:43:54",
      "shop_id": 2044252,
      "display_id": 170
    }
  ]
}
```

## Chất liệu sản phẩm

`GET /shops/{SHOP_ID}/materials_products`

Lấy danh sách chất liệu sản phẩm

### Tham số

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| `SHOP_ID` | path | integer | yes | Mã shop |

### Phản hồi

- `200` Success (object)

```json
{
  "success": true,
  "data": [
    {
      "description": "cao cấp",
      "id": 180,
      "name": "vai",
      "nodes": [
        {
          "description": "chất liệu bò",
          "id": 181,
          "name": "vải bò",
          "nodes": []
        }
      ]
    }
  ]
}
```

## Danh sách nhóm đơn vị tính

`GET /shops/{SHOP_ID}/product_measurements/get_measure`

Lấy danh sách nhóm đơn vị tính

### Tham số

| Name | In | Type | Required | Description |
|---|---|---|---|---|
| `SHOP_ID` | path | integer | yes | Mã shop |

### Phản hồi

- `200` Success (object)

```json
{
  "success": true,
  "data": [
    {
      "id": 58,
      "name": "Nước hoa 1",
      "nodes": [
        {
          "exchange_value": 30,
          "id": 61,
          "is_default": false,
          "name": "30 ml",
          "parent_id": 58
        }
      ],
      "shop_id": 20
    }
  ]
}
```
