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

# Definir stock de un producto

> Usa este metodo para definir stock de un producto

### Descripción

Este método permite definir o actualizar el inventario de productos y modificadores en un establecimiento específico. Es posible modificar el inventario de un único producto o modificador, o realizar múltiples actualizaciones en una sola solicitud.

## Modificar stock de un producto/modificador

Para manejar el stock de un producto o modificador, se hace mediante el método `setOutOfStockItem`.

Este método tiene como finalidad definir, de manera unitaria o múltiple, el stock de productos o modificadores.

### Ejemplo para definir stock de un producto

El siguiente request define con `stock = 9` al producto con ID `r5RZaWcBzzWz3WAnp`.

```json theme={null}
curl --location --request PATCH 'https://api.getjusto.com/api/v2/products/itemsStock' \
     --header 'Authorization: Bearer <API TOKEN>' \
     --header 'Content-Type: application/json' \
     --data-raw'{
        "storeId": "<STORE ID>",
        "productId": "r5RZaWcBzzWz3WAnp",
        "type": "product",
        "stock": 9
     }'
```

### Ejemplo para definir stock de dos productos simultáneamente.

El siguiente request define con `stock = 9` al producto con ID `r5RZaWcBzzWz3WAnp` y con `stock = 45` al producto con ID `h67Hkjhusdf54JnaK`.

```json theme={null}
curl --location --request PATCH 'https://api.getjusto.com/api/v2/products/itemsStock' \
     --header 'Authorization: Bearer <API TOKEN>' \
     --header 'Content-Type: application/json' \
     --data-raw'[{
        "storeId": "<STORE ID>",
        "productId": "r5RZaWcBzzWz3WAnp",
        "type": "product",
        "stock": 9
     },
     {
        "storeId": "<STORE ID>",
        "productId": "h67Hkjhusdf54JnaK",
        "type": "product",
        "stock": 45
     }]'
```

### Ejemplo para definir stock de la opción de un modificador

El siguiente request define con `stock = 23` a la opción con ID `PG68HFqD7rGz6XGBe` del modificador con ID `gSnnm7XEWqKbNqNKd`.

```json theme={null}
curl --location --request PATCH 'https://api.getjusto.com/api/v2/products/itemsStock' \
     --header 'Authorization: Bearer <API TOKEN>' \
     --header 'Content-Type: application/json' \
     --data-raw '{
         "type": "modifier",
         "storeId": "Li4eEa3W2hiuGGCFa",
         "modifierId": "gSnnm7XEWqKbNqNKd",
         "modifierOptionId": "PG68HFqD7rGz6XGBe",
         "untilDate": "2021-08-09T15:15:00.052Z",
         "stock": 23
     }'
```

### Ejemplo para definir stock de la opción de dos modificadores simultáneamente

El siguiente request define con `stock = 23` a la opción con ID `PG68HFqD7rGz6XGBe` del modificador con ID `gSnnm7XEWqKbNqNKd` y define con `stock = 50` a la opción con ID `Jhjk987lJklnAdxf9` del modificador con ID `pqMan54HyrC537Nn`.

```json theme={null}
curl --location --request PATCH 'https://api.getjusto.com/api/v2/products/itemsStock' \
     --header 'Authorization: Bearer <API TOKEN>' \
     --header 'Content-Type: application/json' \
     --data-raw '[{
         "type": "modifier",
         "storeId": "Li4eEa3W2hiuGGCFa",
         "modifierId": "gSnnm7XEWqKbNqNKd",
         "modifierOptionId": "PG68HFqD7rGz6XGBe",
         "stock": 23
     },
     {
         "type": "modifier",
         "storeId": "Li4eEa3W2hiuGGCFa",
         "modifierId": "Jhjk987lJklnAdxf9",
         "modifierOptionId": "pqMan54HyrC537Nnm",
         "untilDate": "2021-08-09T15:15:00.052Z",
         "stock": 23
     }]'
```

### Ejemplo para definir stock de la opción de productos y modificadores simultáneamente

```json theme={null}
curl --location --request PATCH 'https://api.getjusto.com/api/v2/products/itemsStock' \
     --header 'Authorization: Bearer <API TOKEN>' \
     --header 'Content-Type: application/json' \
     --data-raw '[{
         "type": "modifier",
         "storeId": "Li4eEa3W2hiuGGCFa",
         "modifierId": "gSnnm7XEWqKbNqNKd",
         "modifierOptionId": "PG68HFqD7rGz6XGBe",
         "stock": 2
     },
     {
        "storeId": "<STORE ID>",
        "productId": "h67Hkjhusdf54JnaK",
        "type": "product",
        "stock": 10
     },
     {
         "type": "modifier",
         "storeId": "Li4eEa3W2hiuGGCFa",
         "modifierId": "Jhjk987lJklnAdxf9",
         "modifierOptionId": "pqMan54HyrC537Nnm",
         "untilDate": "2021-08-09T15:15:00.052Z",
         "stock": 4
     },
     {
        "storeId": "<STORE ID>",
        "productId": "r5RZaWcBzzWz3WAnp",
        "type": "product",
        "stock": 35
     }]'
```

# Consideraciones importantes

* Cuando se realizan modificaciones de stock múltiples, el body del request debe ser un arreglo que contenga los productos y/o modificadores que se quieran configurar.

* Es importante recordar que se pueden utilizar los ids externos (`externalId`) tanto de los locales (stores), productos, modificadores u opciones de modificadores como alternativas a los ids internos de Justo.

* Cuando en un body se repite la información de un ítem (productos o modificadores), se toma el valor del primer ítem encontrado.

* Cada vez que se ingrese una nueva orden que incorpore alguno de los stocks definidos, se descontará del stock hasta que quede el contador en 0. Cuando eso ocurra, se mostrará el stock de ese producto como agotado.

* Para dejar de que un producto o modificador dependa de un stock y aparezca siempre disponible, se debe hacer un request a [deleteOutOfStockItem](/docs/old/v2/endpoints/products/deleteOutOfStockItem) con el ID del stock.

# Respuestas

### Respuesta a solicitud sin errores

* Response:
  * `status_code: 200 ok`.
* Parámetros:
  * `status`: Indicador de la solicitud con el valor `ok`.
  * `data`: Arreglo de Object que contiene el resumen de la información solicitada y los ids de elementos guardados o modificados.

```json theme={null}
{
    "status": "ok",
    "data": [
        {
            "_id": "LP4Aud472h7LHcAXW",
            "store": {
                "_id": "xKoiiqdtKGaRA2ve4",
                "name": "Example Store",
                "externalId": null
            },
            "modifier": {
                "_id": "3sN33saCKhr7juwJk",
                "externalId": "modifier_external_id",
                "name": "Modifier Name"
            },
            "modifierOption": {
                "_id": "RNbsQKhNx5LxJahqG",
                "name": "Modifier Option Name",
                "externalId": "modifier_option_external_id"
            },
            "type": "modifier",
            "websiteId": "ErCkmcyCEovseJq5E",
            "createdAt": "2022-05-26T13:20:25.411Z",
            "stock": 1
        },
        {
            "_id": "xSFBykdrXEAz5GBWe",
            "product": {
                "_id": "r5RZaWcBzzWz3WAnp",
                "name": "Product Name",
                "externalId": null
            },
            "store": {
                "_id": "xKoiiqdtKGaRA2ve4",
                "name": "Example Store",
                "externalId": null
            },
            "modifier": null,
            "modifierOption": null,
            "type": "product",
            "websiteId": "ErCkmcyCEovseJq5E",
            "createdAt": "2022-05-26T13:20:25.409Z",
            "stock": 6
        },
        {
            "_id": "ymwNd9uf9bDWPPYGD",
            "product": {
                "_id": "r5RZaWcBzzWz3WAnp",
                "name": "Product Name",
                "externalId": null
            },
            "store": {
                "_id": "xKoiiqdtKGaRA2ve4",
                "name": "Example Store",
                "externalId": null
            },
            "modifier": null,
            "modifierOption": null,
            "type": "product",
            "websiteId": "ErCkmcyCEovseJq5E",
            "createdAt": "2022-05-26T13:20:25.410Z",
            "stock": 6
        }
    ]
}
```

### Respuesta a solicitud con errores parciales

Siempre se intentará procesar todos aquellos ítems que no contengan errores, por lo tanto, si en el cuerpo del mensaje se incluyen ítems con datos no existentes en la base de datos, o sin campos requeridos, se modificarán todos los ítems sin errores.

La respuesta en tales casos mostrará un resumen de todos los ítems procesados y un resumen de todos los errores encontrados.

* Response:
  * `status_code: 207 Multi-Status`.
* Parámetros:
  * `status`: Indicador de la solicitud con el valor `"Multi-Status"`.
  * `data`:
    * `processedData`: Arreglo de `Object` que contiene el resumen de la información solicitada y los ids de elementos guardados o modificados.
    * `errors`: Arreglo de Object que contiene el resumen de los errores encontrados.

#### Ejemplo

```json theme={null}
{
    "status": "Multi-Status",
    "data": {
        "processedData": [
            {
                "_id": "yFqs24Y9Z8fmdRJsr",
                "store": {
                    "_id": "xKoiiqdtKGaRA2ve4",
                    "name": "Store name",
                    "externalId": null
                },
                "modifier": null,
                "modifierOption": {
                    "_id": "RNbsQKhNx5LxJahqG",
                    "name": "modifier option name",
                    "externalId": "modifier_option_external_id"
                },
                "type": "modifier",
                "websiteId": "ErCkmcyCEovseJq5E",
                "createdAt": "2022-05-26T19:28:57.436Z",
                "stock": 1
            },
            {
                "_id": "JGFjp2T5d24NhtB7B",
                "product": {
                    "_id": "r5RZaWcBzzWz3WAnp",
                    "name": "product name",
                    "externalId": null
                },
                "store": {
                    "_id": "xKoiiqdtKGaRA2ve4",
                    "name": "Store name",
                    "externalId": null
                },
                "modifier": null,
                "modifierOption": null,
                "type": "product",
                "websiteId": "ErCkmcyCEovseJq5E",
                "createdAt": "2022-05-26T19:28:57.437Z",
                "stock": 6
            }
        ],
        "errors": [
            {
                "item": {
                    "storeId": "xKoiiqdtKGaRA2ve4",
                    "type": "modifier",
                    "stock": 88
                },
                "errors": [
                    "Missing parameter 'modifierId' or 'modifierOptionId'"
                ]
            },
            {
                "item": {
                    "storeId": "non_existant_id",
                    "modifierId": "DyozZ7bmqB64YQTmQ",
                    "modifierOptionId": "v44wppcCP3QAFopMA",
                    "type": "modifier",
                    "stock": 70
                },
                "errors": [
                    "Store not found [storeId:non_existant_id]"
                ]
            }
        ]
    }
}
```

### Respuesta a solicitud sin errores

En caso de que no pueda procesarse ninguno de los ítems del cuerpo del mensaje, se responde la petición con un error.

La respuesta en tales casos mostrará un resumen de todos los errores encontrados.

* Response:
  * `status_code: 400 Bad Request`.
* Parámetros:
  * `status`: Indicador de la solicitud con el valor `"error"`.
  * `error`: Indicador de la razón del error es: `"Validations errors"`.
  * `data`:
    * `errors`: Arreglo de `Object` que contiene el resumen de los errores encontrados.

#### Ejemplo

```json theme={null}
{
    "status": "error",
    "error": "Validations errors",
    "data": {
        "errors": [
            {
                "item": {
                    "storeId": "xKoiiqdtKGaRA2ve4",
                    "modifierId-": "3sN33saCKhr7juwJk",
                    "modifierOptionId": "RNbsQKhNx5LxJahqG",
                    "type": "bad_type",
                    "stock": 1
                },
                "errors": [
                    "The parameter 'type' must be 'product' or 'modifier'"
                ]
            },
            {
                "item": {
                    "storeId": "xKoiiqdtKGaRA2ve4",
                    "productId": "r5RZaWcBzzWz3WAnp",
                    "type": "product",
                },
                "errors": [
                    "Missing parameter 'stock'"
                ]
            },
            {
                "item": {
                    "storeId": "xKoiiqdtKGaRA2ve4",
                    "modifierId-": "3sN33saCKhr7juwJk",
                    "modifierOptionId": "non_existant_id",
                    "type": "modifier",
                    "stock": 1
                },
                "errors": [
                    "Modifier option not found [modifierOptionId:non_existant_id]"
                ]
            }
        ]
    }
}
```


## OpenAPI

````yaml patch /products/itemsStock
openapi: 3.0.0
info:
  title: Order Endpoint API
  version: 1.0.0
servers:
  - url: https://api.getjusto.com/api/v2
    description: Production server
security: []
tags:
  - name: product
    description: Todo lo relacionado a operar con productos
paths:
  /products/itemsStock:
    patch:
      tags:
        - product
      summary: Definir stock de productos
      description: Este endpoint se utiliza para modificar el stock de un producto.
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: array
              items:
                oneOf:
                  - $ref: '#/components/schemas/setproduct'
                    title: Product Stock
                  - $ref: '#/components/schemas/setmodifier'
                    title: Modifier Stock
      responses:
        '200':
          description: Operación exitosa
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    description: Estado de la operacion.
                    example: ok
                  data:
                    type: array
                    items:
                      type: object
                      properties:
                        _id:
                          type: string
                          description: ID del item.
                        store:
                          type: object
                          properties:
                            _id:
                              type: string
                              description: ID de la tienda.
                            name:
                              type: string
                              description: Nombre de la tienda.
                            externalId:
                              type: string
                              description: ID externo de la tienda.
                        modifier:
                          type: object
                          properties:
                            _id:
                              type: string
                              description: ID del modicador.
                            externalId:
                              type: string
                              description: ID externo del modicador.
                            name:
                              type: string
                              description: Nombre del modificador.
                        modifierOption:
                          type: object
                          properties:
                            _id:
                              type: string
                              description: ID de la opcion de modificador.
                            name:
                              type: string
                              description: Nombre de la opcion de modificador.
                            externalId:
                              type: string
                              description: ID externo de la opcion de modificador.
                        type:
                          type: string
                          description: Tipo de producto a agotar.
                        websiteId:
                          type: string
                          description: ID de la pagina web.
                        createAt:
                          type: string
                          format: date-time
                          description: Fecha en la que se creo.
                        stock:
                          type: integer
                          description: Valor numérico del stock.
        '207':
          description: Errores parciales
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    description: Indicador de la solicitud con el valor.
                  data:
                    type: array
                    items:
                      type: object
                      properties:
                        _id:
                          type: string
                          description: ID del item.
                        store:
                          type: object
                          properties:
                            _id:
                              type: string
                              description: ID de la tienda.
                            name:
                              type: string
                              description: Nombre de la tienda.
                            externalId:
                              type: string
                              description: ID externo de la tienda.
                        modifier:
                          type: object
                          properties:
                            _id:
                              type: string
                              description: ID del modificador.
                            externalId:
                              type: string
                              description: ID externo del modificador.
                            name:
                              type: string
                              description: Nombre del modificador.
                        type:
                          type: string
                          description: Tipo de producto a agotar.
                        websiteId:
                          type: string
                          description: ID de la pagina web.
                        createAt:
                          type: string
                          format: date-time
                          description: Fecha en la que se creo.
                        stock:
                          type: integer
                          description: Valor numérico del stock.
        '400':
          description: Error en la petición
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    description: Resultado de la operación
                    example: error
                  error:
                    type: string
                    description: Mensaje de error
                    example: Error en la petición
        '401':
          description: Token inválido
          content:
            application/json:
              schema:
                type: object
                properties:
                  status:
                    type: string
                    description: Resultado de la operación
                    example: error
                  error:
                    type: string
                    description: Mensaje de error
                    example: Unauthorized
components:
  schemas:
    setproduct:
      type: object
      properties:
        storeId:
          type: string
          description: ID del local. Se puede utilizar el `externalId`.
        type:
          type: string
          description: Tipo de producto. Debe ser `product`.
          enum:
            - product
            - modifier
        productId:
          type: string
          description: ID del Producto. Se puede utilizar el `externalId`.
        stock:
          type: integer
          description: Valor numérico del stock.
      required:
        - storeId
        - type
        - productId
        - stock
    setmodifier:
      type: object
      properties:
        storeId:
          type: string
          description: ID del local. Se puede utilizar el `externalId`.
        type:
          type: string
          description: Tipo de producto. Debe ser `modifier`.
          enum:
            - product
            - modifier
        modifierId:
          type: string
          description: ID del Modificador. Se puede utilizar el `externalId`.
        modifierOptionId:
          type: string
          description: ID de la opción del Modificador. Se puede utilizar el `externalId`.
        stock:
          type: integer
          description: Valor numérico del stock.
      required:
        - storeId
        - type
        - modifierId
        - modifierOptionId
        - stock

````