# Basket

The basket module handles the management of products within the basket and other related transactions. Each user is allowed to have a single active `Basket`, and a `BasketItem` is created for every unique item that users add to their basket.

## Basket Model

| Parameter      | Data Type         | Definition                                                                                                               |
| -------------- | ----------------- | ------------------------------------------------------------------------------------------------------------------------ |
| id             | integer           | Database ID.                                                                                                             |
| created\_date  | datetime (string) | Basket created on.                                                                                                       |
| modified\_date | datetime (string) | Basket last modified on.                                                                                                 |
| status         | string            | Basket status. *Basket status is defined on the BasketStatus enum.*                                                      |
| version        | integer           | Version info. Version information is used to control whether the cached version matches the Basket data in the database. |
| user           | integer           | User account linked to the basket.                                                                                       |
| voucher\_code  | string            | Basket discount code.                                                                                                    |

## BasketItem Model

| Parameter                     | Data Type         | Definition                                                                                                                   |
| ----------------------------- | ----------------- | ---------------------------------------------------------------------------------------------------------------------------- |
| id                            | integer           | Database ID.                                                                                                                 |
| created\_date                 | datetime (string) | Basket item created on.                                                                                                      |
| modified\_date                | datetime (string) | Basket item last modified on.                                                                                                |
| status                        | string            | Version info. Version information is used to control whether the cached version matches the BasketItem data in the database. |
| attributes                    | dict              | Additional attributes, if any, of the basket item.                                                                           |
| attributes\_kwargs            | dict              | Additional keywords for additional attributes, if any, of the basket item.                                                   |
| localized\_attributes         | dict              | Additional localized attributes, if any, of the basket item.                                                                 |
| localized\_attributes\_kwargs | dict              | Additional keywords, if any, for additional localized attributes of the basket item.                                         |
| basket                        | integer           | Basket linked to the basket item.                                                                                            |
| reference                     | string            | Unique key created for related basket item.                                                                                  |
| product                       | integer           | Item linked to the basket item                                                                                               |
| quantity                      | integer           | Quantity of basket item.                                                                                                     |
| tax\_rate                     | float             | Tax rate of the basket item.                                                                                                 |
| currency\_type                | string            | Price currency of the basket item.                                                                                           |
| unit\_price                   | float             | Unit price of the basket item.                                                                                               |
| image                         | string            | Thumbnail image of the basket item.                                                                                          |
| extra\_product\_price         | integer           | Additional product price variations, if any, for the basket item.                                                            |
| extra\_product\_stock         | integer           | Additional stock information, if any, for the basket item.                                                                   |
| parent                        | integer           | Parent product, if the basket item is a child product.                                                                       |

## Basket Endpoints

| Parameter  | Data Type | Section to Submit | Definition                                      |
| ---------- | --------- | ----------------- | ----------------------------------------------- |
| product    | integer   | body              | ID of the item to be added to the basket.       |
| quantity   | integer   | body              | Quantity of the item to be added to the basket. |
| attributes | dict      | body              | Product properties.                             |
| inquiry    | dict      | body              | Product details, if the item is exchangeable.   |
| sub\_items | dict      | body              | Sub items.                                      |

### `GET` Basket Items

​Returns the basket and product information.

**Path:** `https://{commerce_url}/baskets/basket/`

**Response**

```json
{
  "basket": {
    "basketitem_set": [
      {
        "quantity": 1,
        "product": {
          "pk": 1309,
          "name": "Gitar",
          "sku": "1020583031",
          "base_code": "1020583",
          "attributes": {},
          "attribute_set": 152,
          "attributes_kwargs": {},
          "extra_attributes": {},
          "productimage_set": [
            {
              "pk": 2576,
              "status": "active",
              "image": "HTTPs://akinon.akinoncdn.com/products/2021/09/10/3/e5b49285-7d8b-47a7-84f8-994c2217548a.jpg",
              "order": 1,
              "created_date": "2021-09-10T16:57:34.100718Z",
              "specialimage_set": [
              ]
            }
          ],
          "price": "120",
          "in_stock": true,
          "currency_type": "try",
          "retail_price": "200",
          "unit_type": "qty",
          "absolute_url": "/1020583031-1020583-gitar/",
          "productvideo_set": [],
          "product_type": "0",
          "price_type": "default",
          "form_schema": null,
          "is_ready_to_basket": true,
          "stock": 51,
          "data_source": null
        },
        "unit_price": "120.00",
        "currency_type": "try",
        "tax_rate": "18.00",
        "total_amount": "120.00",
        "shipping_discount": null,
        "attributes": {},
        "id": 7387,
        "attributes_kwargs": {},
        "image": null,
        "parent": null,
        "offer_badges": [
          {
            "description": "Sitewide Campaign",
            "discount": "24.00"
          }
        ],
        "price": "120.00",
        "retail_price": "200.00",
        "stock": 51,
        "discount_amount": "24.00"
      }
    ],
    "total_amount": "96.00",
    "total_quantity": 1,
    "unavailable_basket_products": [],
    "upsell_details": [],
    "discounts": [
      {
        "description": "Sitewide Campaign",
        "discount": "24.00"
      }
    ],
    "total_discount_amount": "24.00",
    "total_product_amount": "120.00",
    "voucher_code": null,
    "pk": 6863,
    "created_date": "2021-09-20T12:27:31.459026Z",
    "modified_date": "2021-09-20T12:27:31.459045Z"
  }
}
```

### `POST` Add New Product to Basket

​This method is used to add a new product to the basket.

**Path:** `https://{commerce_url}/baskets/basket/`

**Request Body**

```json
{
	"product": 49,
	"quantity": 2
}
```

​**Response**

Returns the same response as the GET method.\
​

### `PATCH` Update a Product Quantity

Used to change the quantity of a product added to the basket.

**Path:** `https://{commerce_url}/baskets/basket/`

**Request Body**

```json
{
	"product": 49,
	"quantity": 0
}
```

​**Response**

Returns the same response as the GET method.\
​

### `PUT` Update a Product Quantity

**Path:** `https://{commerce_url}/baskets/basket/`

**Request Body**

```json
{
	"product": 49,
	"quantity": 0
}
```

**Response**

Returns the same response as the GET method.\
​

### `DELETE` Remove All Products From Basket

​\
This method is used to delete all products added to the basket.

**Path:** `https://{commerce_url}/baskets/basket/`

**Response**

```json
{
	"basket": {
		"basketitem_set": [],
		"total_amount": "0.00",
		"total_quantity": 0,
		"unavailable_basket_products": [],
		"upsell_details": [],
		"discounts": [],
		"total_discount_amount": "0.00",
		"total_product_amount": "0.00",
		"voucher_code": null,
		"pk": 6863,
		"created_date": "2023-06-06T12:32:41.281764Z",
		"modified_date": "2023-07-05T10:22:34.911792Z",
		"segment": {
			"pk": null,
			"stock_list": null,
			"price_list": null
		}	
	}
}
```

### `PATCH` Update Single Basket Item

This method is used for making individual modification in basket items. If the basket item modification is successful, a new basket item is produced as a response. If the `BasketItem` to be modified cannot be found, it returns an error code of 400.

**Path:** `basket_items/$`

**Request Body**

The following request body parameters can be used to update single basket item.

| Parameter  | Data Type | Definition                                                                                                                                             |
| ---------- | --------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
| ID         | integer   | Database ID of the `BasketItem` to be modified.                                                                                                        |
| is\_all    | boolean   | If true is submitted, then the update applies to all quantities of the basket item. If false is submitted, then the update applies to one basket item. |
| attributes | boolean   | Additional attributes of the basket item to modify.                                                                                                    |

```json
{
	"id": 1720,
	"is_all": true
}
```

## Data Parameters for PUT Method

| Parameter  | Data Type | Section to Submit | Definition                                      |
| ---------- | --------- | ----------------- | ----------------------------------------------- |
| product    | integer   | body              | ID of the item to be added to the basket.       |
| quantity   | integer   | body              | Quantity of the item to be added to the basket. |
| attributes | dict      | body              | Product properties.                             |
| inquiry    | dict      | body              | Product details, if the item is exchangeable.   |

### Payload Example

```json
{
	"product": 1780,
	"quantity": 1,
	"attributes": {
	"example_attribute": 123
	}
}
```

## Data Parameters for PATCH Method

| Parameter             | Data Type | Section to Submit | Definition                                                                                                                                                                                         |
| --------------------- | --------- | ----------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| external\_offer\_code | string    | body              | When this field is submitted, the code is applied to the basket without instant verification, regardless of other fields.                                                                          |
| remove\_voucher\_code | boolean   | body              | When True is submitted, the discount code is removed from the basket. When submitted simultaneously with `external_offer_code`, then the code submitted with `external_offer_code` is not removed. |
| voucher\_code         | string    | body              | Discount code to apply to the basket. Instant verification is also applied to the code submitted here.                                                                                             |

### Payload Examples

```json
{
"voucher_code": "aaa-bbb-ccc"
}
```

```json
{
"remove_voucher_code": true
}
```

```json
{
"external_offer_code": "ddd-eee-fff"
}
```

## Data Parameters for DELETE Method

There are no data parameters for the DELETE method.

### Response Parameters

| Parameter                     | Data Type | Definition                                                                                                                      |
| ----------------------------- | --------- | ------------------------------------------------------------------------------------------------------------------------------- |
| basketitem\_set               | array     | Details of basket items.                                                                                                        |
| quantity                      | integer   | Quantity of basket item.                                                                                                        |
| product                       | dict      | Details of basket item.                                                                                                         |
| unit\_price                   | string    | Item unit price.                                                                                                                |
| currency\_type                | string    | Item price currency.                                                                                                            |
| tax\_rate                     | string    | Tax rate.                                                                                                                       |
| total\_amount                 | string    | Net product price.                                                                                                              |
| shipping\_discount            | string    | Item shipping discount amount.                                                                                                  |
| attributes                    | dict      | Item attributes.                                                                                                                |
| id                            | integer   | Database ID of the item.                                                                                                        |
| attributes\_kwargs            | dict      | Item attribute keywords.                                                                                                        |
| image                         | string    | Item image.                                                                                                                     |
| parent                        | dict      | If the item is a child product, details of the parent product.                                                                  |
| offer\_badges                 | array     | Discounts.                                                                                                                      |
| price                         | string    | Item price.                                                                                                                     |
| retail\_price                 | string    | Item price before the discount.                                                                                                 |
| stock                         | integer   | Item stock amount.                                                                                                              |
| discount\_amount              | string    | Item discount amount.                                                                                                           |
| total\_amount                 | string    | Total price of basket items.                                                                                                    |
| total\_quantity               | integer   | Total quantity of basket items.                                                                                                 |
| unavailable\_basket\_products | array     | Invalid or unavailable items in the basket.                                                                                     |
| upsell\_details               | array     | Parameters and message details if there are items whose discount prices are no longer valid or if their prices increased later. |
| discounts                     | array     | Discounts.                                                                                                                      |
| total\_discount\_amount       | string    | Total discount amount.                                                                                                          |
| total\_product\_amount        | string    | Total price of items.                                                                                                           |
| voucher\_code                 | string    | Discount code.                                                                                                                  |
| pk                            | integer   | Database ID of the user's basket.                                                                                               |
| created\_date                 | string    | Date when the basket was created in the database.                                                                               |
| modified\_date                | string    | Date when the basket was last modified in the database.                                                                         |
| segment:                      | dict      | Information on which segment the customer is in                                                                                 |
