# Agregar defectos a turno (https://docs.pulsarml.com/es/v1/api-reference/shifts/post-shifts-shift_id-defects)

Agrega unidades defectuosas de un SKU a un turno por su ID (el que devuelve `GET /v1/shifts`), incluso en turnos que ya terminaron.

**Cómo se suman los defectos.** A diferencia de los operadores, los defectos no tienen línea de tiempo ni orden. Cada llamada agrega un nuevo registro de producción de defectos de `quantity` unidades del SKU, que cubre el turno completo, y la Calidad y el OEE del turno lo toman en cuenta en segundo plano. Una llamada nunca reemplaza a las anteriores:

* Enviar `quantity: 2` y luego `quantity: 3` registra 5 defectos.
* Enviar la misma solicitud dos veces registra los defectos dos veces, así que reintenta solo las solicitudes que fallaron.
* Para deshacer una llamada, elimina el registro que devolvió con `DELETE /v1/production-logs/{id}`. Para ver lo que ya tiene un turno, lista sus registros con `POST /v1/production-logs/filters`.

Los defectos no se atribuyen a ningún operador, y se pueden agregar a turnos pasados, incluso a los que tienen la producción revisada. El SKU se indica por `id` o por `name`; un nombre desconocido crea un SKU nuevo, así que revisa cómo está escrito.

Errores:

* `400`: ningún turno coincide, el turno todavía no empieza, o el turno no tiene suficiente producción de ese SKU para contener los defectos.
* `404`: `sku.id` no es uno de tus SKUs.

## `POST /v1/shifts/{shift_id}/defects`

Base URLs:
- `https://draco.prod.pulsarml.com` — Producción
- `https://draco.dev.pulsarml.com` — Desarrollo (sandbox)

Authentication: send your API key in the `x-api-key` header.

### Path parameters

- `shift_id` (integer, required) — El ID del turno.

### Request body (`application/json`, required)

Type: object (`AddDefectsToShiftRequestV1`)

- `sku` (object, required) — El SKU al que pertenecen las unidades defectuosas.
  - `id` (string, optional, nullable, min length 1, e.g. `"9ce2c6b4-a1f4-4bf2-b5c8-10436d1018cc"`) — El `id` del SKU, tal como lo devuelve `/v1/skus`. Se rechaza un ID que no sea uno de tus SKUs.
  - `name` (string, optional, nullable, min length 1, e.g. `"SKU-1042"`) — El nombre del SKU, comparado de forma exacta. Un nombre que no coincide con ninguno de tus SKUs crea un SKU nuevo con ese nombre, igual que en los registros de producción.
- `quantity` (integer, optional, default `1`, >= 1, e.g. `3`) — Cuántas unidades defectuosas se agregan. Si se omite, es 1.

### Responses

#### 200 — El registro de producción de defectos que se creó

Type: object (`ShiftDefectsDtoV1`)

- `id` (string, required, e.g. `"5b0f6a52-3c1e-4d5b-9f0e-8a7c6d5e4f3a"`) — El ID del registro de producción de defectos que se creó. Pásalo a `DELETE /v1/production-logs/{id}` para deshacer la llamada.
- `shiftId` (integer, required, e.g. `48213`) — El turno al que se agregaron los defectos.
- `machineId` (integer, required, e.g. `12`) — La máquina a la que pertenece el turno.
- `quantity` (integer, required, e.g. `3`) — Cuántas unidades defectuosas se agregaron.
- `start` (string (date-time), required, e.g. `"2026-10-12T06:00:00Z"`) — El inicio del turno. Los defectos siempre cubren el turno completo.
- `end` (string (date-time), required, e.g. `"2026-10-12T14:00:00Z"`) — El fin del turno.

#### 422 — Error de validación

Type: object (`HTTPValidationError`)

- `detail` (array of object, optional)
  - `loc` (array of string | integer, required)
  - `msg` (string, required)
  - `type` (string, required)
  - `input` (any, optional)
  - `ctx` (object, optional)

### Example request

```bash
curl -X POST 'https://draco.prod.pulsarml.com/v1/shifts/<shift_id>/defects' \
  -H 'x-api-key: <YOUR_API_KEY>' \
  -H 'Content-Type: application/json' \
  -d '{
    "sku": {
      "id": "9ce2c6b4-a1f4-4bf2-b5c8-10436d1018cc",
      "name": "SKU-1042"
    },
    "quantity": 3
  }'
```