3. Recebimento de Informações vindas do ERP

URL base nos exemplos

O host https://api.retailportal.com é apenas ilustrativo; use o URL base da API fornecido pela EVOT. Detalhes no Guia de Início.

A API ERP do Portal Retail fornece 9 endpoints principais, com grande foco no recebimento de dados em lote (Batch). Essa estruta assíncrona garante alta performance ao receber informações e atualizações massivas diretamente do seu sistema ERP.


3.1 Visão Geral de Todos os Endpoints

Recurso Criação Individual Criação Batch Atualização Individual Atualização Batch Consulta Última Data
Produtos POST /product POST /product/batch PUT /product PUT /product/batch GET /product/get-latest-integration
Estoque POST /stock POST /stock/batch PUT /stock PUT /stock/batch GET /stock/get-latest-integration
Vendas Diárias POST /daily-sale POST /daily-sale/batch PUT /daily-sale PUT /daily-sale/batch GET /daily-sale/get-latest-integration
Vendas Mensais POST /month-sale POST /month-sale/batch PUT /month-sale PUT /month-sale/batch GET /month-sale/get-latest-integration
Lojas POST /store POST /store/batch PUT /store PUT /store/batch GET /store/get-latest-integration
Fornecedores POST /supplier POST /supplier/batch PUT /supplier PUT /supplier/batch GET /supplier/get-latest-integration
Medicamentos (Prescrição) POST /product-prescriber POST /product-prescriber/batch PUT /product-prescriber PUT /product-prescriber/batch GET /product-prescriber/get-latest-integration
Grupos de Compra POST /purchase-group POST /purchase-group/batch PUT /purchase-group PUT /purchase-group/batch GET /purchase-group/get-latest-integration
Documentos de Loja POST /store-document POST /store-document/batch PUT /store-document PUT /store-document/batch GET /store-document/get-latest-integration

3.2 Endpoint: PRODUTOS (ErpProduct)

3.2.1 Criar Produto (Individual)

Endpoint: POST /erp-data/product

Status HTTP:

  • Sucesso: 201 Created
  • Erro de validação: 400 Bad Request
  • Não autorizado: 401 Unauthorized
  • Erro interno: 500 Internal Server Error

Descrição: Cria um novo produto individual. Use este endpoint para produtos isolados ou testes.

3.2.1.1 Campos disponíveis (Product)

Os endpoints POST /erp-data/product e PUT /erp-data/product usam os mesmos campos, com exceção de id que é obrigatório no PUT.

Nos endpoints em lote (POST /erp-data/product/batch e PUT /erp-data/product/batch), cada item do array products segue exatamente a mesma estrutura abaixo.

Campos obrigatórios

Campo Tipo Descrição
erpId string Identificador do produto no ERP. Não enviar vazio/nulo.
id long Obrigatório apenas no PUT; identifica o registro interno para atualização.

Campos opcionais

Campo Tipo Descrição
ncmCode string Código NCM fiscal do produto.
status string Status do produto no ERP (ex.: Active, Inactive).
ean string Código de barras EAN do produto.
description string Descrição principal do produto.
internalDescription string Descrição interna/operacional.
webName string Nome exibido no canal web.
specification string Especificações técnicas/comerciais.
metaDescription string Texto de apoio para SEO/metadata.
weightGr decimal Peso em gramas (>= 0).
lengthCm decimal Comprimento em centímetros (>= 0).
widthCm decimal Largura em centímetros (>= 0).
heightCm decimal Altura em centímetros (>= 0).
ipi bool Indica incidência de IPI.
dun string Código DUN (embalagem logística).
purchaseGroup string Nome do grupo de compra.
purchaseGroupId string Identificador do grupo de compra no ERP.
purchaseStatus string Status do fluxo de compras.
brand string Marca/fabricante comercial do produto.
sku string SKU do produto no ERP.
taxClassification string Classificação tributária do produto.
boxQuantity string Quantidade por caixa.
displayQuantity string Quantidade para exposição/display.
billingQuantity string Quantidade usada para faturamento.
activePrinciple string Princípio ativo do medicamento.
healthRegistrationReason string Motivo/observação do registro sanitário.
manufacturerCorporateName string Razão social do fabricante.
manufacturerName string Nome fantasia do fabricante.
manufacturerCnpj string CNPJ do fabricante.
keywords string Palavras-chave de busca.
embed string Conteúdo incorporado/referência externa.
indication string Indicações de uso.
contraindication string Contraindicações do produto.
minimumPurchaseMultiple int Múltiplo mínimo de compra.
healthRegistration string Número de registro sanitário.
medicalPrescriptionType string Tipo de exigência de prescrição médica.
productSeasonality string Descrição de sazonalidade do produto.
productSeasonalityId string Identificador de sazonalidade no ERP.
hasRegistration bool Indica se o produto possui registro regulatório.
continuousUse bool Indica se é produto de uso contínuo.
controlledSale bool Indica venda controlada.
retainsMedicalPrescription bool Indica retenção de prescrição na venda.
activeIngredient string Substância/ingrediente ativo principal.
therapeuticIndicationId int Identificador da indicação terapêutica.
taxExempt int Flag/código de isenção fiscal.
pisCofinslistId int Identificador de enquadramento PIS/COFINS.
seasonalityId int Identificador numérico da sazonalidade.
billingQty int Quantidade usada para regra de faturamento.
legalBasis string Base legal/regulatória associada.
packagingQtyDun int Quantidade de embalagem para o DUN.
dcbCode string Código DCB (Denominação Comum Brasileira).
keyWord string Palavra-chave adicional de indexação.
presentation int Código da apresentação comercial.
productPackage int Código/tipo de embalagem do produto.
scale string Escala/categoria de classificação interna.
intelligenceFamily string Família de inteligência/categorização analítica.
webDepartment string Departamento no canal web.
section string Seção de navegação/catálogo.
filter string Filtro/categorização complementar.

Requisição:

POST https://api.retailportal.com/erp-data/product HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123

{
  "erpId": "12345",
  "ncmCode": "84733090",
  "status": "Active",
  "ean": "7896045000001",
  "description": "Dipirona 500mg Cápsulas",
  "internalDescription": "Genérico - Analgésico",
  "brand": "Genérico",
  "sku": "SKU-DIPO-500-001",
  "healthRegistration": "61541"
}

Resposta de Sucesso (201 Created):

{
  "success": true,
  "id": 98765,
  "message": "Produto criado com sucesso",
  "description": "Dipirona 500mg Cápsulas"
}

Resposta de Erro (400 Bad Request):

{
  "success": false,
  "errors": [
    "Field 'ncmCode' is required",
    "Field 'description' must not be empty"
  ],
  "message": "Validation failed"
}

3.2.2 Criar Produtos em Lote

Endpoint: POST /erp-data/product/batch

Status HTTP:

  • Sucesso (enfileirado): 202 Accepted
  • Erro de validação: 400 Bad Request
  • Não autorizado: 401 Unauthorized
  • Erro interno: 500 Internal Server Error

Descrição: Enfileira múltiplos produtos para processamento assíncrono. Use para sincronizações periódicas com muitos itens.

Fluxo:

  1. Validação imediata (< 1 segundo)
  2. Enfileiramento para processamento assíncrono
  3. Resposta com jobId
  4. Processamento em background (até 5 minutos)
  5. Consulte status com GET /batch-job-report/{jobId}

Requisição:

POST https://api.retailportal.com/erp-data/product/batch HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123

{
  "products": [
    {
      "erpId": "12345",
      "ncmCode": "84733090",
      "status": "Active",
      "ean": "7896045000001",
      "description": "Dipirona 500mg"
    },
    {
      "erpId": "12346",
      "ncmCode": "84733091",
      "status": "Active",
      "ean": "7896045000002",
      "description": "Ibuprofeno 600mg"
    }
  ]
}

Resposta de Sucesso (202 Accepted):

{
  "message": "Batch received and will be processed asynchronously",
  "jobId": "batch-job-1234567890",
  "totalItems": 2
}

Resposta de Erro (400 Bad Request):

{
  "message": "Validation failed at item 1",
  "totalItems": 2,
  "invalidItems": 1,
  "itemErrors": [
    {
      "index": 1,
      "errors": ["Field 'ncmCode' is required"]
    }
  ]
}

3.2.3 Atualizar Produto (Individual)

Endpoint: PUT /erp-data/product

Status HTTP:

  • Sucesso: 200 OK
  • Erro de validação: 400 Bad Request
  • Produto não encontrado: 404 Not Found
  • Não autorizado: 401 Unauthorized

Descrição: Atualiza um produto existente. Requer envio do ErpId.

Requisição:

PUT https://api.retailportal.com/erp-data/product HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123

{
  "erpId": "12345",
  "description": "Dipirona 500mg - Atualizado",
  "status": "Inactive",
  "brand": "Genérico Premium"
}

Resposta de Sucesso (200 OK):

{
  "success": true,
  "id": 98765,
  "message": "Produto atualizado com sucesso",
  "description": "Dipirona 500mg - Atualizado"
}

3.2.4 Atualizar Produtos em Lote

Endpoint: PUT /erp-data/product/batch

Status HTTP:

  • Sucesso (enfileirado): 202 Accepted
  • Erro de validação: 400 Bad Request

Requisição:

PUT https://api.retailportal.com/erp-data/product/batch HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123

{
  "products": [
    {
      "erpId": "12345",
      "status": "Inactive"
    },
    {
      "erpId": "12346",
      "brand": "Novo Fabricante"
    }
  ]
}

Resposta (202 Accepted):

{
  "message": "Batch received and will be processed asynchronously",
  "jobId": "batch-job-1234567891",
  "totalItems": 2
}

3.2.5 Obter Última Data de Integração

Endpoint: GET /erp-data/product/get-latest-integration

Status HTTP:

  • Sucesso: 200 OK
  • Não autorizado: 401 Unauthorized

Descrição: Retorna a data e hora da última sincronização de produtos bem-sucedida. Use para sincronizar apenas produtos modificados desde a última integração.

Requisição:

GET https://api.retailportal.com/erp-data/product/get-latest-integration HTTP/1.1
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123

Resposta (200 OK):

{
  "classType": "ErpProduct",
  "id": 1,
  "erpId": 0,
  "lastOperation": "Create",
  "lastDateTime": "2024-12-06T15:30:45.123Z"
}

Interpretação:

  • lastOperation — Última operação realizada (Create, Update)
  • lastDateTime — Data/hora UTC da última integração bem-sucedida
  • Use para sincronizações incrementais: busque no ERP todos os produtos modificados APÓS este timestamp

3.3 Endpoint: ESTOQUE (ErpStock)

Operação URL
Criar POST /erp-data/stock
Criar lote POST /erp-data/stock/batch
Atualizar PUT /erp-data/stock
Atualizar lote PUT /erp-data/stock/batch
Última integração GET /erp-data/stock/get-latest-integration

3.3.1 Campos disponíveis (Stock)

Os endpoints POST /erp-data/stock e PUT /erp-data/stock usam os mesmos campos, com exceção de id, obrigatório apenas no PUT (identifica o registro interno para atualização).

Nos endpoints em lote (POST /erp-data/stock/batch e PUT /erp-data/stock/batch), cada item do array stocks segue a mesma estrutura abaixo.

Campos obrigatórios

Campo Tipo Descrição
erpStoreId string Identificador da loja no ERP. Não enviar vazio/nulo. Máximo 64 caracteres.
erpProductId string Identificador do produto no ERP. Não enviar vazio/nulo. Máximo 64 caracteres.
currentStock decimal Quantidade atual em estoque. Deve ser maior ou igual a zero.
id long Obrigatório apenas no PUT; identifica o registro interno para atualização.

Campos opcionais

Campo Tipo Descrição
warehouseTransit decimal Quantidade em trânsito no depósito. Opcional; quando enviado deve ser maior ou igual a zero.
distributionCenterStock decimal Quantidade disponível no centro de distribuição. Opcional; quando enviado deve ser maior ou igual a zero.
minimumStock decimal Estoque mínimo esperado para operação. Opcional; quando enviado deve ser maior ou igual a zero.
safetyStock decimal Estoque de segurança para variações de demanda. Opcional; quando enviado deve ser maior ou igual a zero.
maximumStock decimal Limite superior de estoque recomendado. Opcional; quando enviado deve ser maior ou igual a zero.

Exemplo (POST):

POST https://api.retailportal.com/erp-data/stock HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123

{
  "erpStoreId": "LOJA-01",
  "erpProductId": "SKU-001",
  "currentStock": 120,
  "warehouseTransit": 15,
  "distributionCenterStock": 40,
  "minimumStock": 20,
  "safetyStock": 30,
  "maximumStock": 200
}

3.3.2 Batch (stock) (POST /erp-data/stock/batch)

Formato do corpo (JSON): um único objeto raiz com a propriedade **stocks (array). Cada elemento do array é um objeto com a mesma estrutura do POST único descrito em 3.3.1**.

  • Nomes em camelCase (stocks, erpStoreId, currentStock, etc.).
  • O array **stocks não pode ser null nem vazio; caso contrário a API retorna 400**.
  • Tamanho máximo do lote: 1000 itens por requisição.

Status HTTP (referência):

  • Sucesso (enfileirado): 202 Accepted
  • Erro de validação / corpo inválido: 400 Bad Request
  • Não autorizado: 401 Unauthorized

Requisição (exemplo):

POST https://api.retailportal.com/erp-data/stock/batch HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123

{
  "stocks": [
    {
      "erpStoreId": "LOJA-01",
      "erpProductId": "SKU-001",
      "currentStock": 120,
      "warehouseTransit": 15,
      "distributionCenterStock": 40
    },
    {
      "erpStoreId": "LOJA-01",
      "erpProductId": "SKU-002",
      "currentStock": 85,
      "minimumStock": 20,
      "safetyStock": 25,
      "maximumStock": 180
    }
  ]
}

3.4 Endpoint: VENDAS DIÁRIAS (ErpDailySales)

Operação URL
Criar POST /erp-data/daily-sale
Criar lote POST /erp-data/daily-sale/batch
Atualizar PUT /erp-data/daily-sale
Atualizar lote PUT /erp-data/daily-sale/batch
Última integração GET /erp-data/daily-sale/get-latest-integration

3.4.1 Campos disponíveis (Daily sales)

Os endpoints POST /erp-data/daily-sale e PUT /erp-data/daily-sale usam os mesmos campos, com exceção de id, obrigatório apenas no PUT (identifica o registro interno para atualização).

Nos endpoints em lote (POST /erp-data/daily-sale/batch e PUT /erp-data/daily-sale/batch), cada item do array dailySales segue a mesma estrutura abaixo.

Campos obrigatórios

Campo Tipo Descrição
erpProductId string Identificador do produto no ERP. Não enviar vazio/nulo. Máximo 64 caracteres.
erpStoreId string Identificador da loja no ERP. Não enviar vazio/nulo. Máximo 64 caracteres.
quantity decimal Quantidade vendida; deve ser maior que zero.
totalSellValue decimal Valor total da venda; deve ser maior ou igual a zero.
date datetime Instantâneo da venda em UTC explícito, dentro da faixa válida (não pode ser MinValue/MaxValue). Ver Formato de date abaixo.
id long Obrigatório apenas no PUT; identifica o registro interno para atualização.

Formato de date (obrigatório ler)

A API valida que o valor recebido represente um instante em UTC explícito (data/hora com fuso indicado como UTC no payload).

  • Não use apenas a data civil no formato YYYY-MM-DD (ex.: "2026-04-01"). Muitos clientes JSON interpretam isso como instante sem fuso definido (não UTC), e a validação rejeita com a mensagem: Date deve ser uma data válida em UTC (Kind=Utc) e não pode ser MinValue ou MaxValue.
  • Use data/hora em ISO 8601 com fuso UTC indicado no texto, por exemplo:
  • Meia-noite UTC do dia da venda: "2026-04-01T00:00:00Z" (o sufixo **Z** é obrigatório neste padrão para marcar UTC).
  • Ou equivalente com offset zero: "2026-04-01T00:00:00+00:00".

Para um “dia de venda” sem hora de negócio específica, o padrão recomendado é **YYYY-MM-DDTHH:mm:ssZ** com 00:00:00Z no dia desejado.

Campos opcionais

Campo Tipo Descrição
origin string Origem da venda (ex.: balcão, canal). Opcional; quando informado, máximo 128 caracteres.
deliveryMethod string Modalidade ou método de entrega associado à venda. Opcional; quando informado, máximo 64 caracteres.

Exemplo (POST):

POST https://api.retailportal.com/erp-data/daily-sale HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123

{
  "erpProductId": "SKU-001",
  "erpStoreId": "LOJA-01",
  "quantity": 12.5,
  "totalSellValue": 199.9,
  "date": "2025-06-15T12:00:00Z",
  "origin": "Balcão",
  "deliveryMethod": "Retira"
}

3.4.2 Criar vendas diárias em lote (POST /erp-data/daily-sale/batch)

Formato do corpo (JSON): um único objeto raiz com a propriedade **dailySales (array). Cada elemento do array é um objeto com a mesma estrutura do POST único descrito em 3.4.1 (campos obrigatórios e opcionais, inclusive regras de date em UTC — ver Formato de date**).

  • Nomes em camelCase (dailySales, erpProductId, totalSellValue, etc.), como no restante da API ERP.
  • O array **dailySales não pode ser null nem vazio; caso contrário a API retorna 400**.
  • Tamanho máximo do lote: 1000 itens por requisição. Ultrapassar o limite gera erro de validação.

Status HTTP (referência):

  • Sucesso (enfileirado): 202 Accepted
  • Erro de validação / corpo inválido: 400 Bad Request
  • Não autorizado: 401 Unauthorized

Requisição (exemplo):

POST https://api.retailportal.com/erp-data/daily-sale/batch HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123

{
  "dailySales": [
    {
      "erpProductId": "12345",
      "erpStoreId": "123456",
      "quantity": 5,
      "totalSellValue": 1500,
      "date": "2026-04-01T00:00:00Z"
    },
    {
      "erpProductId": "12346",
      "erpStoreId": "123456",
      "quantity": 2,
      "totalSellValue": 80.5,
      "date": "2026-04-01T00:00:00Z",
      "origin": "Balcão",
      "deliveryMethod": "Retira"
    }
  ]
}

O fluxo assíncrono (validação rápida, job em background, consulta por jobId) segue o mesmo padrão dos outros endpoints em lote ERP (ex.: produtos em 3.2.2).


3.5 Endpoint: VENDAS MENSAIS (ErpMonthlySales)

Operação URL
Criar POST /erp-data/month-sale
Criar lote POST /erp-data/month-sale/batch
Atualizar PUT /erp-data/month-sale
Atualizar lote PUT /erp-data/month-sale/batch
Última integração GET /erp-data/month-sale/get-latest-integration

3.5.1 Campos disponíveis (Month sales)

Os endpoints POST /erp-data/month-sale e PUT /erp-data/month-sale usam os mesmos campos, com exceção de id, obrigatório apenas no PUT (identifica o registro interno para atualização).

Nos endpoints em lote (POST /erp-data/month-sale/batch e PUT /erp-data/month-sale/batch), cada item do array monthSales no JSON segue a mesma estrutura abaixo.

Nota: diferente das vendas diárias (3.4), vendas mensais usam **month e **year** (inteiros); não** existe campo date.

Campos obrigatórios

Campo Tipo Descrição
erpProductId string Identificador do produto no ERP. Não enviar vazio/nulo. Máximo 64 caracteres.
erpStoreId string Identificador da loja no ERP. Não enviar vazio/nulo. Máximo 64 caracteres.
quantity decimal Quantidade vendida no período; deve ser maior que zero.
totalSellValue decimal Valor total no período; deve ser maior ou igual a zero.
month int Mês de referência (1 a 12).
year int Ano de referência (deve ser maior que 1900).
id long Obrigatório apenas no PUT; identifica o registro interno para atualização.

Campos opcionais

Campo Tipo Descrição
origin string Origem da venda (ex.: canal). Opcional; quando informado, máximo 128 caracteres.
deliveryMethod string Modalidade ou método de entrega. Opcional; quando informado, máximo 64 caracteres.

Exemplo (POST):

POST https://api.retailportal.com/erp-data/month-sale HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123

{
  "erpProductId": "SKU-001",
  "erpStoreId": "LOJA-01",
  "quantity": 120,
  "totalSellValue": 4500.5,
  "month": 4,
  "year": 2026,
  "origin": "Balcão",
  "deliveryMethod": "Retira"
}

3.5.2 Criar vendas mensais em lote (POST /erp-data/month-sale/batch)

Formato do corpo (JSON): um único objeto raiz com a propriedade **monthSales (array). Cada elemento segue a mesma estrutura do POST único em 3.5.1**.

  • Nomes em camelCase (monthSales, erpProductId, totalSellValue, month, year, etc.).
  • O array **monthSales não pode ser null nem vazio; caso contrário a API retorna 400**.
  • Tamanho máximo do lote: 1000 itens por requisição.

Status HTTP (referência):

  • Sucesso (enfileirado): 202 Accepted
  • Erro de validação / corpo inválido: 400 Bad Request
  • Não autorizado: 401 Unauthorized

Requisição (exemplo):

POST https://api.retailportal.com/erp-data/month-sale/batch HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123

{
  "monthSales": [
    {
      "erpProductId": "12345",
      "erpStoreId": "123456",
      "quantity": 5,
      "totalSellValue": 1500,
      "month": 4,
      "year": 2026
    },
    {
      "erpProductId": "12346",
      "erpStoreId": "123456",
      "quantity": 2,
      "totalSellValue": 800,
      "month": 4,
      "year": 2026,
      "origin": "E-commerce",
      "deliveryMethod": "Entrega"
    }
  ]
}

O fluxo assíncrono (validação rápida, job em background, consulta por jobId) segue o mesmo padrão dos outros endpoints em lote ERP (ex.: 3.4.2).


3.6 Endpoint: LOJAS (ErpStore)

Operação URL
Criar POST /erp-data/store
Criar lote POST /erp-data/store/batch
Atualizar PUT /erp-data/store
Atualizar lote PUT /erp-data/store/batch
Última integração GET /erp-data/store/get-latest-integration

3.6.1 Campos disponíveis (Store)

Os endpoints POST /erp-data/store e PUT /erp-data/store usam os mesmos campos, com exceção de id que é obrigatório no PUT.

Nos endpoints em lote (POST /erp-data/store/batch e PUT /erp-data/store/batch), cada item do array stores segue a mesma estrutura abaixo.

Campos obrigatórios

Campo Tipo Descrição
erpId string Identificador da loja no ERP. Não enviar vazio/nulo.
title string Nome/título da loja.
isActive bool Indica se a loja está ativa.
id long Obrigatório apenas no PUT; identifica o registro interno para atualização.

Campos opcionais

Campo Tipo Descrição
taxId string CNPJ da loja.
stateRegistration string Inscrição estadual.
zipCode string CEP da loja.
address string Endereço da loja.
number string Número do endereço.
complement string Complemento do endereço.
performsInjection bool Indica se a loja realiza aplicação/injeção.
sellsControlled bool Indica se a loja vende medicamentos controlados.
hasPopularFarmacy bool Indica participação no programa Farmácia Popular.
latitud string Latitude geográfica da loja.
longitud string Longitude geográfica da loja.
openingDate datetime Data de abertura da loja (UTC, dentro da faixa válida).
storeType string Tipo/classificação da loja (ex.: Popular, Premium).
storeSize string Porte/tamanho da loja (ex.: P, M, G).
weekdayHours string Horário de funcionamento em dias úteis.
saturdayHours string Horário de funcionamento no sábado.
sundayHours string Horário de funcionamento no domingo.

3.7 Endpoint: FORNECEDORES (ErpSupplier)

Operação URL
Criar POST /erp-data/supplier
Criar lote POST /erp-data/supplier/batch
Atualizar PUT /erp-data/supplier
Atualizar lote PUT /erp-data/supplier/batch
Última integração GET /erp-data/supplier/get-latest-integration

3.7.1 Campos disponíveis (Supplier)

Os endpoints POST /erp-data/supplier e PUT /erp-data/supplier usam os mesmos campos, com exceção de id, obrigatório apenas no PUT (identifica o registro interno para atualização).

Nos endpoints em lote (POST /erp-data/supplier/batch e PUT /erp-data/supplier/batch), cada item do array suppliers no JSON segue a mesma estrutura abaixo.

Campos obrigatórios

Campo Tipo Descrição
erpSupplierId string Identificador do fornecedor no ERP. Não enviar vazio/nulo. Máximo 64 caracteres.
name string Nome do fornecedor. Não enviar vazio/nulo. Máximo 256 caracteres.
id long Obrigatório apenas no PUT; identifica o registro interno para atualização.

Campos opcionais

Campo Tipo Descrição
type string Tipo/classificação do fornecedor. Máximo 64 caracteres quando informado.
taxId string CNPJ ou documento fiscal principal. Máximo 18 caracteres quando informado.
stateRegistration string Inscrição estadual. Máximo 32 caracteres quando informado.
zipCode string CEP. Máximo 10 caracteres quando informado.
address string Logradouro/endereço. Máximo 512 caracteres quando informado.
number decimal Número do endereço; quando informado, deve ser maior ou igual a zero (valor inteiro).
complement string Complemento do endereço. Máximo 256 caracteres quando informado.
neighborhood string Bairro. Máximo 128 caracteres quando informado.
city string Cidade. Máximo 128 caracteres quando informado.
state string UF (sigla). Máximo 2 caracteres quando informado.

Exemplo (POST mínimo):

POST https://api.retailportal.com/erp-data/supplier HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123

{
  "erpSupplierId": "FORN-001",
  "name": "Distribuidora Exemplo Ltda"
}

3.7.2 Fornecedores em lote (POST /erp-data/supplier/batch / PUT /erp-data/supplier/batch)

Formato do corpo (JSON): objeto raiz com a propriedade **suppliers (array de itens no mesmo formato de 3.7.1**).

  • O array **suppliers não pode ser null nem vazio em operações de lote válidas; caso contrário, 400**.
  • Tamanho máximo do lote: 1000 itens por requisição.

Status HTTP (referência):

  • Sucesso (enfileirado): 202 Accepted
  • Erro de validação / corpo inválido: 400 Bad Request
  • Não autorizado: 401 Unauthorized

Requisição (exemplo — POST batch):

POST https://api.retailportal.com/erp-data/supplier/batch HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123

{
  "suppliers": [
    {
      "erpSupplierId": "FORN-001",
      "name": "Distribuidora Exemplo Ltda",
      "taxId": "12345678000199",
      "zipCode": "01310100",
      "address": "Av. Paulista",
      "number": 1000,
      "city": "São Paulo",
      "state": "SP"
    }
  ]
}

O fluxo assíncrono (validação rápida, job em background, consulta por jobId) segue o mesmo padrão dos outros endpoints em lote ERP (ex.: 3.4.2).


3.8 Endpoint: MEDICAMENTOS COM PRESCRIÇÃO (ErpProductPrescriber)

Operação URL
Criar POST /erp-data/product-prescriber
Criar lote POST /erp-data/product-prescriber/batch
Atualizar PUT /erp-data/product-prescriber
Atualizar lote PUT /erp-data/product-prescriber/batch
Última integração GET /erp-data/product-prescriber/get-latest-integration

3.8.1 Campos disponíveis (Product Prescriber)

Os endpoints POST /erp-data/product-prescriber e PUT /erp-data/product-prescriber usam os mesmos campos, com exceção de id, obrigatório apenas no PUT (identifica o registro interno para atualização).

Nos endpoints em lote (POST /erp-data/product-prescriber/batch e PUT /erp-data/product-prescriber/batch), cada item do array productPrescribers segue a mesma estrutura abaixo.

Campos obrigatórios

Campo Tipo Descrição
erpProductId string Identificador do produto no ERP. Não enviar vazio/nulo. Máximo 64 caracteres.
quantity int Quantidade do item prescrito. Deve ser maior que zero.
checkoutDateTime datetime Data/hora do checkout. Obrigatória, em UTC explícito (Kind=Utc) e dentro de faixa temporal válida.
prescriberMedicalLicense string Registro profissional do prescritor. Não enviar vazio/nulo. Máximo 20 caracteres.
erpStoreId string Identificador da loja no ERP. Não enviar vazio/nulo. Máximo 128 caracteres.
id long Obrigatório apenas no PUT; identifica o registro interno para atualização.

Campos opcionais

Campo Tipo Descrição
prescriberName string Nome do prescritor. Opcional; quando informado, máximo 128 caracteres.
state string UF do prescritor. Opcional; quando informado, máximo 4 caracteres.

Formato de checkoutDateTime

A API valida que checkoutDateTime seja DateTime com Kind = Utc.

  • Use ISO 8601 com UTC explícito, por exemplo:
  • "2026-04-01T00:00:00Z"
  • "2026-04-01T00:00:00+00:00"
  • O valor também precisa cair em uma faixa temporal razoável validada pela API.

Exemplo (POST):

POST https://api.retailportal.com/erp-data/product-prescriber HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123

{
  "erpProductId": "12345",
  "quantity": 2,
  "checkoutDateTime": "2026-04-01T12:00:00Z",
  "prescriberMedicalLicense": "CRM123456",
  "erpStoreId": "LOJA-001",
  "prescriberName": "Dra. Maria",
  "state": "SP"
}

3.8.2 Batch (product prescriber) (POST /erp-data/product-prescriber/batch)

Formato do corpo (JSON): um único objeto raiz com a propriedade productPrescribers (array). Cada elemento do array é um objeto com a mesma estrutura do POST único descrito em 3.8.1.

  • Nomes em camelCase (productPrescribers, erpProductId, checkoutDateTime, etc.).
  • O array productPrescribers não pode ser null nem vazio; caso contrário a API retorna 400.
  • Tamanho máximo do lote: 1000 itens por requisição.

Status HTTP (referência):

  • Sucesso (enfileirado): 202 Accepted
  • Erro de validação / corpo inválido: 400 Bad Request
  • Não autorizado: 401 Unauthorized

Requisição (exemplo):

POST https://api.retailportal.com/erp-data/product-prescriber/batch HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123

{
  "productPrescribers": [
    {
      "erpProductId": "12345",
      "quantity": 2,
      "checkoutDateTime": "2026-04-01T12:00:00Z",
      "prescriberMedicalLicense": "CRM123456",
      "erpStoreId": "LOJA-001",
      "prescriberName": "Dra. Maria",
      "state": "SP"
    },
    {
      "erpProductId": "12346",
      "quantity": 1,
      "checkoutDateTime": "2026-04-01T13:00:00Z",
      "prescriberMedicalLicense": "CRM654321",
      "erpStoreId": "LOJA-002"
    }
  ]
}

3.9 Endpoint: GRUPOS DE COMPRA (ErpPurchaseGroup)

Operação URL
Criar POST /erp-data/purchase-group
Criar lote POST /erp-data/purchase-group/batch
Atualizar PUT /erp-data/purchase-group
Atualizar lote PUT /erp-data/purchase-group/batch
Última integração GET /erp-data/purchase-group/get-latest-integration

3.9.1 Campos disponíveis (Purchase Group)

Os endpoints POST /erp-data/purchase-group e PUT /erp-data/purchase-group usam os mesmos campos, com exceção de id, obrigatório apenas no PUT (identifica o registro interno para atualização).

Nos endpoints em lote (POST /erp-data/purchase-group/batch e PUT /erp-data/purchase-group/batch), cada item do array purchaseGroups segue a mesma estrutura abaixo.

Campos obrigatórios

Campo Tipo Descrição
erpId string Identificador do grupo de compra no ERP. Não enviar vazio/nulo. Máximo 64 caracteres. Deve ser único no contexto da integração.
name string Nome do grupo de compra. Não enviar vazio/nulo. Máximo 200 caracteres.
erpSupplierId string Identificador do fornecedor no ERP associado ao grupo. Não enviar vazio/nulo. Máximo 64 caracteres.
id long Obrigatório apenas no PUT; identifica o registro interno para atualização.

Campos opcionais

Campo Tipo Descrição
description string Descrição complementar do grupo de compra. Opcional; quando informado, máximo 500 caracteres.

Exemplo (POST):

POST https://api.retailportal.com/erp-data/purchase-group HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123

{
  "erpId": "PG-001",
  "name": "Grupo de Higiene",
  "description": "Grupo para itens de higiene pessoal",
  "erpSupplierId": "SUP-0001"
}

3.9.2 Batch (purchase group) (POST /erp-data/purchase-group/batch)

Formato do corpo (JSON): um único objeto raiz com a propriedade **purchaseGroups (array). Cada elemento do array é um objeto com a mesma estrutura do POST único descrito em 3.9.1**.

  • Nomes em camelCase (purchaseGroups, erpId, erpSupplierId, etc.).
  • O array **purchaseGroups não pode ser null nem vazio; caso contrário a API retorna 400**.
  • Tamanho máximo do lote: 1000 itens por requisição.

Status HTTP (referência):

  • Sucesso (enfileirado): 202 Accepted
  • Erro de validação / corpo inválido: 400 Bad Request
  • Não autorizado: 401 Unauthorized

Requisição (exemplo):

POST https://api.retailportal.com/erp-data/purchase-group/batch HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123

{
  "purchaseGroups": [
    {
      "erpId": "PG-001",
      "name": "Grupo de Higiene",
      "description": "Itens de higiene pessoal",
      "erpSupplierId": "SUP-0001"
    },
    {
      "erpId": "PG-002",
      "name": "Grupo Dermocosméticos",
      "erpSupplierId": "SUP-0002"
    }
  ]
}

3.10 Endpoint: DOCUMENTOS DE LOJA (ErpStoreDocument)

Operação URL
Criar POST /erp-data/store-document
Criar lote POST /erp-data/store-document/batch
Atualizar PUT /erp-data/store-document
Atualizar lote PUT /erp-data/store-document/batch
Última integração GET /erp-data/store-document/get-latest-integration

3.10.1 Campos disponíveis (Store Document)

Os endpoints POST /erp-data/store-document e PUT /erp-data/store-document usam os mesmos campos, com exceção de id, obrigatório apenas no PUT (identifica o registro interno para atualização).

Nos endpoints em lote (POST /erp-data/store-document/batch e PUT /erp-data/store-document/batch), cada item do array storeDocuments segue a mesma estrutura abaixo.

Campos obrigatórios

Campo Tipo Descrição
erpStoreId string Identificador da loja no ERP. Não enviar vazio/nulo. Máximo 64 caracteres.
fileUrl string URL/identificador do arquivo do documento no ERP. Não enviar vazio/nulo. Máximo 4096 caracteres.
documentType string Tipo do documento (ex.: alvará, licença, certificado). Não enviar vazio/nulo. Máximo 128 caracteres.
id long Obrigatório apenas no PUT; identifica o registro interno para atualização.

Campos opcionais

Campo Tipo Descrição
issueDate datetime Data de emissão do documento. Opcional; quando informada, deve estar em UTC explícito (Kind=Utc) e dentro de faixa temporal válida.
expirationDate datetime Data de validade do documento. Opcional; quando informada, deve estar em UTC explícito (Kind=Utc) e dentro de faixa temporal válida. Se issueDate também for informado, expirationDate deve ser maior que issueDate.

Formato de issueDate e expirationDate

A API valida que ambas as datas sejam DateTime com Kind = Utc.

  • Não use apenas data civil (YYYY-MM-DD), pois tende a desserializar como Kind=Unspecified e pode ser rejeitada.
  • Use ISO 8601 com UTC explícito, por exemplo:
  • "2026-04-01T00:00:00Z"
  • "2026-04-01T00:00:00+00:00"

Além disso:

  • expirationDate deve ser estritamente maior que issueDate quando ambas as datas forem informadas.
  • As datas devem estar dentro da faixa temporal validada pela API.

Exemplo (POST):

POST https://api.retailportal.com/erp-data/store-document HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123

{
  "erpStoreId": "LOJA-01",
  "fileUrl": "https://erp.exemplo.com/documentos/alvara-loja-01.pdf",
  "documentType": "ALVARA_FUNCIONAMENTO",
  "issueDate": "2026-01-01T00:00:00Z",
  "expirationDate": "2027-01-01T00:00:00Z"
}

3.10.2 Batch (store document) (POST /erp-data/store-document/batch)

Formato do corpo (JSON): um único objeto raiz com a propriedade storeDocuments (array). Cada elemento do array é um objeto com a mesma estrutura do POST único descrito em 3.10.1.

  • Nomes em camelCase (storeDocuments, erpStoreId, fileUrl, etc.).
  • O array storeDocuments não pode ser null nem vazio; caso contrário a API retorna 400.
  • Tamanho máximo do lote: 1000 itens por requisição.

Status HTTP (referência):

  • Sucesso (enfileirado): 202 Accepted
  • Erro de validação / corpo inválido: 400 Bad Request
  • Não autorizado: 401 Unauthorized

Requisição (exemplo):

POST https://api.retailportal.com/erp-data/store-document/batch HTTP/1.1
Content-Type: application/json
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123

{
  "storeDocuments": [
    {
      "erpStoreId": "LOJA-01",
      "fileUrl": "https://erp.exemplo.com/documentos/alvara-loja-01.pdf",
      "documentType": "ALVARA_FUNCIONAMENTO",
      "issueDate": "2026-01-01T00:00:00Z",
      "expirationDate": "2027-01-01T00:00:00Z"
    },
    {
      "erpStoreId": "LOJA-02",
      "fileUrl": "https://erp.exemplo.com/documentos/licenca-loja-02.pdf",
      "documentType": "LICENCA_SANITARIA",
      "issueDate": "2026-02-01T00:00:00Z",
      "expirationDate": "2027-02-01T00:00:00Z"
    }
  ]
}

3.11 Endpoint: RELATÓRIO DE BATCH

Endpoint: GET /erp-data/batch-job-report/{jobId}

Status HTTP:

  • Sucesso: 200 OK
  • Job não encontrado: 404 Not Found
  • Não autorizado: 401 Unauthorized

Descrição: Consulta o progresso e status de um trabalho enfileirado. Use após receber HTTP 202 Accepted.

Requisição:

GET https://api.retailportal.com/erp-data/batch-job-report/batch-job-1234567890 HTTP/1.1
X-API-Key: ERP-RETAILPORTAL-2024-SECURE-KEY-ABC123

Resposta (200 OK) — Em Processamento:

{
  "jobId": "batch-job-1234567890",
  "entityType": "ErpProduct",
  "state": "Processing",
  "isComplete": false,
  "createdAt": "2024-12-06T10:30:00Z",
  "startedAt": "2024-12-06T10:30:02Z",
  "completedAt": null,
  "duration": null,
  "totalItems": 100,
  "successCount": 45,
  "failureCount": 0,
  "retryAttempt": 0,
  "hasPartialData": false,
  "errorMessage": null
}

Resposta (200 OK) — Concluído com Sucesso:

{
  "jobId": "batch-job-1234567890",
  "entityType": "ErpProduct",
  "state": "Finished",
  "isComplete": true,
  "createdAt": "2024-12-06T10:30:00Z",
  "startedAt": "2024-12-06T10:30:02Z",
  "completedAt": "2024-12-06T10:35:15Z",
  "duration": "00:05:13",
  "totalItems": 100,
  "successCount": 100,
  "failureCount": 0,
  "retryAttempt": 0,
  "hasPartialData": false,
  "errorMessage": null,
  "exceptionDetails": null
}

Resposta (404 Not Found):

{
  "message": "Batch job not found",
  "jobId": "batch-job-invalid-id"
}

Fluxo Típico de Integração

1. POST /product/batch com 100 produtos
2. Recebe 202 Accepted + jobId
3. GET /batch-job-report/{jobId} a cada 10 segundos
4. Estado: Enqueued → Processing → Finished
5. Verifica: successCount, failureCount, errorMessage
6. Se sucesso: Próxima sincronização
   Se parcial: Analisa erros e reenvia com dados corrigidos
   Se falha: Aguarda 5 min e reenviar

Próxima Seção

  1. Modelo de Dados - Entrada