# Enviar lotes de servicios

> Cómo crear y actualizar lotes de servicios desde su sistema, y cómo tratar los errores.

URL canónica: https://apis.cortecloud.com.br/docs/es/guias/integracao-erp/lotes/

Un **lote** agrupa [servicios](https://apis.cortecloud.com.br/docs/es/comecando/conceitos.md#servico) de la central para la producción. Su integración arma el lote en su sistema y lo envía a Cortecloud, que guarda la agrupación y la muestra a la producción y al PCP. Un servicio puede estar en varios lotes, y el lote no modifica el servicio.

Dos rutas, ambas exigen autenticación por central ([HMAC](https://apis.cortecloud.com.br/docs/es/comecando/autenticacao.md)):

| Ruta | Uso |
|---|---|
| [`POST /batches`](https://apis.cortecloud.com.br/docs/swagger#/Batches/createBatch) | Crea el lote y devuelve el `id`. |
| [`PUT /batches/{id}`](https://apis.cortecloud.com.br/docs/swagger#/Batches/updateBatch) | Actualiza el lote por el `id`. |

## Crear un lote {#criar-um-lote}

```json
{
  "internal_code": "LOTE-0042",
  "description": "Turno de la mañana",
  "services": [
    { "id": 1234 },
    { "internal_code": "PED-000123" }
  ]
}
```

- `internal_code` es el código del lote en su sistema y es obligatorio. No puede repetirse en la central.
- `description` es opcional.
- `services` es obligatorio en la creación, con 1 a 100 servicios por solicitud.
- Cada servicio se identifica por `id` o por `internal_code`; enviar los dos en el mismo servicio se rechaza con `400`.

La respuesta `201` trae el `id` del lote. **Guárdelo**: la actualización exige ese `id`.

## Actualizar un lote {#atualizar-um-lote}

Solo cambian los campos enviados, y es necesario enviar al menos uno:

| Campo | Efecto |
|---|---|
| `internal_code` | Cambia el código del lote. Ausente preserva. |
| `description` | Cambia la descripción. Ausente preserva; `null` la borra. |
| `services` | Reemplaza la lista entera: los servicios ausentes salen del lote, y `[]` lo vacía. Ausente preserva los servicios. |

```json
{ "services": [{ "id": 1234 }, { "id": 1235 }] }
```

La actualización sobrescribe las ediciones hechas en Cortecloud. Repetir la misma llamada no cambia el resultado.

## Qué servicios entran {#quais-servicos-entram}

El servicio debe producirse en la central de la solicitud y estar liberado para producción (estado `7`, `13`, `21` o `22`). Un servicio concluido (`9`) o aún no liberado se rechaza.

El `internal_code` de servicio que coincide con más de un servicio de la central es ambiguo, y el lote entero se rechaza. En ese caso, envíe el `id`. La búsqueda mira servicios en todos los estados, así que un servicio antiguo con el mismo código también causa ambigüedad.

## Errores {#erros}

| Estado | Cuándo |
|---|---|
| `400` | Cuerpo fuera del formato: sin `internal_code` o sin `services` en la creación, cuerpo vacío en la actualización, servicio sin `id` ni `internal_code` o con los dos, más de 100 servicios. |
| `404` | En la actualización, lote inexistente o de otra central. |
| `409` | Ya existe un lote con ese `internal_code` en la central. |
| `422` | Algún servicio no puede componer el lote. |

En `422`, el campo `problems` lista cada servicio rechazado y el motivo:

```json
{
  "status": 422,
  "problems": [
    { "ref": { "id": 1234 }, "reason": "finished" },
    { "ref": { "internalCode": "PED-000123" }, "reason": "ambiguous" }
  ]
}
```

| `reason` | Significado |
|---|---|
| `not_found` | Servicio inexistente o de otra central. |
| `ambiguous` | `internal_code` con más de un servicio; envíe el `id`. |
| `finished` | Servicio concluido. |
| `not_released` | Servicio aún no liberado para producción. |
| `duplicated` | Servicio repetido en la lista. |

Un lote con un servicio rechazado no se crea ni se modifica.

:::caution Respuesta perdida en la creación
Si la respuesta del `POST` se pierde, un nuevo intento recibe `409` sin el `id` del lote. En ese caso, contacte al soporte para recuperarlo.
:::
