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

# Public Routes

> Public routes to get product data from our catalog and quote orders

## Products

* Searchable lookup fields:
  * EAN key
  * Base product name
* Filterable field set:
  * `base__diseases=INT` (Disease ID)
  * `base__category=INT` (Category ID)
  * `base__pharmaceutical_company=INT` (Pharma company ID)
  * `is_active=BOOL` (True returns products that can be bought)
  * `has_shortage=BOOL` (False returns products that are available and not in shortage)
  * `min_price=DOUBLE`
  * `max_price=DOUBLE`
  * `id__in=INTs separated by commas`
  * `ean_key__in=EANs separated by commas`
* Ordering fields:
  * `created_at` This is the default by descending order
  * `updated_at` Last updated date
  * `base__name` By alphabetical order of name
  * `price` By prices

```bash theme={null}
Request:
curl --request GET \\
  --url API_URL/api/products/ \\
  --header 'Accept: application/json' \\
  --header 'X-API-Key: {Client API Key}'

Response:
Status Code: 200 OK
{
"count": INT,
"next": "API_URL/api/products/?page=2",
"previous": null,
"results": [
      {
          "id": INT, // Product primary key
          "base": {
              "id": INT, // Base product primary key
              "name": STRING, // Name
              "pharmaceutical_company": {
                  "name": STRING
              },
              "category": {
                  "name": STRING
              },
              "medical_information": {
                  "active_ingredient": STRING,
									"is_generic": BOOL,
									"group_number": INT,
									"requires_prescription": BOOL,
              }
          },
          "price": DOUBLE,
          "default_image": URL,
          "is_active": BOOL,
          "has_shortage": BOOL,
          "ean_key": STRING,
          "presentation": STRING
      },
	...,
	]
}

```

### Example response:

```bash theme={null}
GET: API_URL/api/products/?limit=10&search=Vitamina%20E%20Caps

{
...,
"results":[
{
    "id": 17917,
    "base": {
        "id": 8312,
        "name": "Vitamina E 500 Sup Alim 30 Caps",
        "pharmaceutical_company": {"id": 670,"name": "NAT HEALTH"},
        "category": {"id": 270,"name": "Vitaminas y Minerales"},
        "tags": [],
        "medical_information": null
    },
    "price": "73.00",
    "default_image": IMAGE_URL,
    "is_active": true,
    "has_shortage": false,
    "ean_key": "7501853800432",
    "presentation": ""
},
{
    "id": 16030,
    "base": {
        "id": 6579,
        "name": "Vitamina E 850Mg Caps C30",
        "pharmaceutical_company": {"id": 555,"name": "PROGELA"},
        "category": {"id": 270,"name": "Vitaminas y Minerales",},
        "tags": [],
        "medical_information": null
    },
    "price": "51.00",
    "default_image": IMAGE_URL,
    "is_active": true,
    "has_shortage": false,
    "ean_key": "7503008344617",
    "presentation": ""
}]
}

```

## Categories

* Searchable lookup fields:
  * name
* Filterable field set:
  * `available` True/False. If True exclude Categories without any inactive/shortage products
* Ordering fields:
  * `updated_at` This is the default by descending order
  * `name` By alphabetical order of name

```bash theme={null}
Request:
curl --request GET \\
  --url API_URL/api/categories/ \\
  --header 'Accept: application/json' \\
  --header 'X-API-Key: {Client API Key}'

Response:
Status Code: 200 OK
{
"count": INT,
"next": "API_URL/api/categories/?page=2",
"previous": null,
"results":[
{
    "id": INT, // Product primary key
    "name": STRING, // Name
},...
]

```

## Pharmaceutical Companies

* Searchable lookup fields:
  * name
* Filterable field set:
  * `available` True/False. If True exclude Companies without any inactive/shortage products
* Ordering fields:
  * `updated_at` This is the default by descending order
  * `name` By alphabetical order of name

```bash theme={null}
Request:
curl --request GET \\
  --url API_URL/api/pharmaceutical-companies/ \\
  --header 'Accept: application/json' \\
  --header 'X-API-Key: {Client API Key}'

Response:
Status Code: 200 OK
{
"count": INT,
"next": "API_URL/api/pharmaceutical-companies/?page=2",
"previous": null,
"results":[
{
    "id": INT, // Product primary key
    "name": STRING, // Name
},...
]

```

## Diseases

* Searchable lookup fields:
  * name
* Ordering fields:
  * `updated_at` This is the default by descending order
  * `name` By alphabetical order of name

```bash theme={null}
Request:
curl --request GET \\
  --url API_URL/api/diseases/ \\
  --header 'Accept: application/json' \\
  --header 'X-API-Key: {Client API Key}'

Response:
Status Code: 200 OK
{
"count": INT,
"next": "API_URL/api/diseases/?page=2",
"previous": null,
"results":[
{
    "id": INT, // Product primary key
    "name": STRING, // Name
    "is_chronic": BOOL
},...
]

```

## Calculate

This service calculates the purchase order totals and estimated delivery date

The products and quantities are specified inside an array of `DETAIL` objects. Each detail has `{"product": ID, "quantity":INT}`.

The shipping methods vary depending on the zip code, they can be seen under the array of `shipping_method_options`. The structure of this object is like so:

* SHIPPING\_METHOD
  * `"id"` : The primary key of the object.
  * `"method"`: The type of shipping method, currently available options are: `"local"`, `"standard"` and `"express"`.
  * `min_delivery_days`: Minimum amount of working days to deliver the order.
  * `max_delivery_days`: Maximum amount of working days to deliver the order.

The zip code, shipping method ID, and current DateTime will be used to calculate the `expected_delivery_date`.

```bash theme={null}
Request:
curl --request POST \\
  --url API_URL/api/orders/calculate/ \\
  --header 'Accept: application/json' \\
	--header 'Content-Type: application/json' \\
  --header 'X-API-Key: {Client API Key}'
	--data \\
		{
		"details":[{"product":INT,"quantity":INT} ...], REQUIRED
		"store": 1, OPTIONAL // To be picked up at Vitau's store.
		"zipcode": STRING, OPTIONAL // To be delivered to this zip code.
		"coupon": STRING, OPTIONAL // Coupon code
		"shipping_method": INT, OPTIONAL // Selected shipping method from the valid methods for this zip code.
		...
		}

Response:
Status Code: 201 Created
{
"subtotal": DOUBLE,
"shipping_price": DOUBLE,
"shipping_discount": DOUBLE,
"coupon": {
	"code": STRING,
	"value": DOUBLE // Between 0 and 1 is a percentage, else has a fixed value.
},
"discount":DOUBLE,
"iva":DOUBLE,
"total": DOUBLE,
"shipping_method_options":
	[{
		"id": INT,
		"company": STRING,
		"method": ENUM, [STANDARD, EXPRESS, LOCAL, DEFAULT]
		"min_delivery_days": INT,
		"max_delivery_days": INT,
		"price": DOUBLE
	}..],
"selected_shipping_method": INT, // When not included in request payload defaults to cheapest default method.
"errors": OBJECT, // Key value pairs of possible errors.
"expected_delivery_date": UTC DATETIME,
"max_delivery_date": UTC DATETIME,
"details":
	[{
    "product": INT,
    "quantity": INT,
    "subtotal": DOUBLE,
    "discount": DOUBLE,
    "iva":DOUBLE,
    "total": DOUBLE
	}...],
}

```

### Error messages

Product does not exist

```bash theme={null}
Status Code: 400 Bad Request
{
"details": [
	{"product": ["Clave primaria {INT} inválida - objeto no existe."]}
	...,
]
}

```

Coupon is not valid will return a 201 response but with an error object, however, it would calculate totals and deliveries excluding the desired discount.

```bash theme={null}
Status Code: 201
{
"subtotal": DOUBLE,
...,
"errors": {
	"coupon": "Coupon does not exist"
},
...,
}

```
