# Criar registos de produção (https://docs.pulsarml.com/pt/v1/api-reference/production-logs/post-production-logs)

Cria um ou vários registos de produção. O corpo é um **array** JSON, mesmo para um único registo.

Este é o endpoint que um MES, ERP ou terminal de fábrica usa para enviar produção para o Pulsar. `machine` e `sku` são referências que aceitam um `id` ou um `name`, por isso um sistema que só conhece nomes de linhas e códigos de produto não tem de resolver primeiro os IDs do Pulsar.

Um registo de produção descreve um intervalo fechado: `start` e `end` são obrigatórios, `end` é igual ou posterior a `start`, e ambos se situam dentro de um único turno da máquina. São aceites turnos passados, por isso os registos podem ser enviados dias depois da produção. Para registar o que está a acontecer no turno em curso de uma máquina, use os endpoints de tempo real.

Os **defeitos** (`type: "defects"`) somam-se. Vários registos de defeitos podem cobrir o mesmo intervalo, num pedido ou em vários, e cada um é registado, por isso envie cada lote uma única vez e repita apenas um pedido que falhou (um pedido falhado não regista nada). `start` e `end` podem ser o mesmo instante para defeitos encontrados num momento pontual:

```json
[
  {"type": "defects", "count": 3, "nominalSpeed": 60, "machine": {"name": "Press 4"},
   "sku": {"name": "GAL-1042"}, "start": "2026-10-12T14:00:00Z", "end": "2026-10-12T22:00:00Z"},
  {"type": "defects", "count": 1, "nominalSpeed": 60, "machine": {"name": "Press 4"},
   "sku": {"name": "GAL-1042"}, "start": "2026-10-12T17:42:10Z", "end": "2026-10-12T17:42:10Z"}
]
```

Os registos `total` e `correct` não se podem sobrepor a outro registo do mesmo tipo, máquina e SKU. A resposta lista os registos deste pedido. A qualidade e o OEE dos turnos afetados são recalculados em segundo plano, normalmente em poucos minutos.

## `POST /v1/production-logs`

Base URLs:
- `https://draco.prod.pulsarml.com` — Produção
- `https://draco.dev.pulsarml.com` — Desenvolvimento (sandbox)

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

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

Type: array of object

- `type` ("correct" | "defects" | "total", optional, default `"total"`, e.g. `"correct"`) — O tipo de registo de produção (conformes, defeitos, etc.)
- `count` (integer, required, e.g. `1000`) — A quantidade total de peças produzidas neste registo de produção
- `nominalSpeed` (number, required, e.g. `60`) — A velocidade nominal da máquina durante este registo de produção (número decimal)
- `start` (string (date-time), required, e.g. `"2024-01-01T08:00:00"`) — A hora de início do registo de produção. Tem de se situar dentro de um único turno da máquina.
- `end` (string (date-time), required, e.g. `"2024-01-01T16:00:00"`) — A hora de fim do registo de produção, igual ou posterior a `start`. Um registo de defeitos pode usar o mesmo instante em ambos para registar defeitos encontrados num momento pontual.
- `machine` (object, required) — A máquina associada ao registo de produção
  - `id` (integer, optional, nullable, > 0, e.g. `1`) — O ID da máquina
  - `name` (string, optional, nullable, e.g. `"Machine 1"`) — O nome da máquina
- `sku` (object, required) — O SKU associado ao registo de produção
  - `id` (string, optional, nullable, e.g. `"9ce2c6b4-a1f4-4bf2-b5c8-10436d1018cc"`) — O ID do SKU
  - `name` (string, optional, nullable, e.g. `"sku 1"`) — O nome do SKU
- `operator` (object, optional, nullable) — O operador que participou neste registo de produção
  - `firstName` (string, required, e.g. `"Pérez"`) — O nome próprio do operador
  - `lastName` (string, required, e.g. `"Sánchez"`) — O apelido do operador
- `workOrder` (string, optional, nullable, e.g. `"work order 1"`) — O nome da ordem de trabalho associada a este registo de produção

### Responses

#### 200 — Os registos de produção que foram criados

Type: array of object

- `id` (string, required, e.g. `"36f7b519-d93e-4ec8-8245-7f4b8c123456"`) — O identificador único do registo de produção
- `type` ("correct" | "defects" | "total", required, e.g. `"correct"`) — O tipo de registo de produção
- `sensorCount` (number, required, e.g. `500`) — A contagem do sensor registada neste registo
- `count` (number, required, e.g. `1000`) — A quantidade total de peças produzidas neste registo
- `nominalSpeed` (number, required, e.g. `60`) — A velocidade nominal da máquina durante este registo
- `countingFactor` (number, optional, nullable, e.g. `1`) — O fator de contagem da máquina durante este registo
- `start` (string (date-time), required, e.g. `"2024-01-01T00:00:00"`) — A hora de início do registo de produção
- `end` (string (date-time), required, e.g. `"2024-01-01T08:00:00"`) — A hora de fim do registo de produção
- `isReviewed` (boolean, required, e.g. `true`) — Indica se o registo de produção foi revisto
- `isAutomated` (boolean, required, e.g. `true`) — Indica se o registo de produção foi automático
- `machineId` (integer, required, e.g. `12`) — O ID da máquina do registo de produção
- `createdAt` (string (date-time), required) — A data e hora em que o registo de produção foi criado
- `updatedAt` (string (date-time), required) — A data e hora da última atualização do registo de produção
- `deletedAt` (string (date-time), optional, nullable) — A data e hora em que o registo de produção foi eliminado, se aplicável
- `live` (boolean, required, e.g. `true`) — Indica se o registo de produção está em curso
- `machine` (object, required) — A máquina do registo de produção
  - `id` (integer, required) — O ID da máquina
  - `name` (string, required) — O nome da máquina
  - `isCountEnabled` (boolean, required) — Indica se a contagem está ativada
  - `externalName` (string, optional, nullable) — O nome externo da máquina
- `company` (object, required) — A empresa do registo de produção
  - `id` (integer, required) — O ID da empresa
  - `name` (string, required) — O nome da empresa
  - `timezone` (string, required) — O fuso horário da empresa (por exemplo, "Europe/Lisbon")
- `shift` (object, optional, nullable) — O turno em que a produção foi registada. É nulo nos registos antigos que não têm turno.
  - `id` (integer, required) — O ID do turno
  - `name` (string, required) — O nome do turno
  - `start` (string (date-time), required) — A hora de início do turno
  - `end` (string (date-time), required) — A hora de fim do turno
  - `isConsidered` (boolean, required) — Indica se o turno é considerado nas métricas
- `operator` (object, optional) — O utilizador que reviu o registo de produção
  - `id` (integer, required) — O ID do utilizador ou operador
  - `firstName` (string, optional, nullable) — O nome próprio do operador
  - `lastName` (string, optional, nullable) — O apelido do operador
  - `email` (string, optional, nullable) — O email do operador
- `sku` (object, required) — O SKU produzido no registo de produção
  - `id` (string, required) — O UUID do SKU
  - `name` (string, required) — O nome do SKU
  - `description` (string, optional, nullable) — A descrição do SKU
  - `unit` (string, required) — A unidade de medida do SKU
- `workOrder` (object | object (any keys), required) — A ordem de trabalho associada ao registo de produção
  - when it is `WorkOrderDetailsDtoV1`:
    - `id` (string, required) — O UUID da ordem de trabalho
    - `name` (string, required) — O nome da ordem de trabalho
    - `description` (string, required) — A descrição da ordem de trabalho
    - `status` ("InProgress" | "Completed" | "Canceled", required) — O estado da ordem de trabalho
- `simpleWorkOrder` (object | object (any keys), required) — A ordem de trabalho simples associada ao registo de produção
  - when it is `SimpleWorkOrderDetailsDtoV1`:
    - `id` (string, required) — O UUID da ordem de trabalho simples
    - `name` (string, required) — O nome da ordem de trabalho simples

#### 422 — Erro de validação

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/production-logs' \
  -H 'x-api-key: <YOUR_API_KEY>' \
  -H 'Content-Type: application/json' \
  -d '[
    {
      "type": "correct",
      "count": 1000,
      "nominalSpeed": 60,
      "start": "2024-01-01T08:00:00",
      "end": "2024-01-01T16:00:00",
      "machine": {
        "id": 1,
        "name": "Machine 1"
      },
      "sku": {
        "id": "9ce2c6b4-a1f4-4bf2-b5c8-10436d1018cc",
        "name": "sku 1"
      },
      "workOrder": "work order 1"
    }
  ]'
```