Skip to main content

Importação de Entrada de Insumos do SAP B1

📌 Descrição do Processo

A importação de notas de entrada de insumos representa o fluxo de recebimento de insumos do SAP B1 para o WMS. O SAP B1 atua como origem dos documentos de entrada (PurchaseDeliveryNotes), enquanto o WMS consome esses documentos para registrar os movimentos de recebimento e cadastrar os produtos associados.

A integração garante que as notas de entrada geradas no SAP B1 sejam automaticamente refletidas no WMS, incluindo produtos, lotes e quantidades.

Importante

Este processo utiliza cursor temporal para busca incremental — apenas documentos criados ou alterados desde a última sincronização são processados. Além disso, a integração realiza verificação de duplicidade via IntegrationTracking, evitando reprocessamento de pedidos já integrados.


🔄 Fluxo de Importação

  1. Consulta de Notas de Entrada no SAP B1

    • O WMS busca os rascunhos (Drafts) de PurchaseDeliveryNotes no SAP B1, filtrando por data a partir do último cursor de sincronização.
    • Para cada rascunho encontrado, os detalhes completos do documento são recuperados.
    • Os códigos de produtos presentes nas linhas do documento são extraídos e validados por prefixo.
  2. Busca de Produtos Relacionados

    • Com os códigos de produtos extraídos, o WMS consulta a API /Items do SAP B1 para obter os dados completos dos produtos.
    • Os produtos são agrupados junto às notas de entrada em um resultado consolidado por ErpIntegration.
  3. Transformação dos Dados (Parse)

    • Os dados brutos do SAP B1 são convertidos para os modelos internos do WMS: OrderImport (pedidos) e ProductImport (produtos).
    • O mapeamento utiliza AutoMapper e os parâmetros de integração B1 configurados.
  4. Integração de Produtos e Salvamento de Movimentos

    • Os produtos são integrados no WMS via IntegrateProductsAsync.
    • Pedidos já integrados são filtrados pela verificação de IntegrationTracking.
    • Os movimentos restantes (novos) são salvos no WMS e o cursor de sincronização é atualizado.

🖥️ APIs Envolvidas

  • SAP B1 → WMS (GET)
    • /Drafts → busca rascunhos de notas de entrada de insumos (PurchaseDeliveryNotes) pendentes.
    • /PurchaseDeliveryNotes → recupera detalhes completos de cada documento, incluindo linhas (DocumentLines) e lotes (BatchNumbers).
    • /Items → consulta os dados dos produtos referenciados nas linhas dos documentos.
    • Parâmetros: filtro por DocDate (a partir do cursor), ordenação descendente, expansão de DocumentLines/BatchNumbers.

📦 Exemplo de Importação (Objeto Fictício)

Cenário:

  • Fornecedor: AutoPeças Brasil Ltda. (C00150)
  • Documento: DocEntry 60100, DocNum 70200
  • Produto: PA-789 – Bateria 60Ah
  • Quantidade: 50 unidades, divididas em 2 lotes

1. Nota de Entrada no SAP B1

{
"DocEntry": 60100,
"DocNum": 70200,
"DocDate": "2026-03-20",
"CardCode": "C00150",
"CardName": "AutoPeças Brasil Ltda.",
"Cancelled": "tNO",
"DocCurrency": "BRL",
"DocTotal": 7500.00,
"DocumentLines": [
{
"LineNum": 0,
"ItemCode": "PA-789",
"ItemDescription": "Bateria 60Ah",
"Quantity": 50,
"UnitPrice": 150.00,
"WarehouseCode": "WH01",
"MeasureUnit": "UN",
"BatchNumbers": [
{
"BatchNumber": "LOTE-2026-001",
"Quantity": 30,
"ManufacturingDate": "2026-03-01",
"ExpiryDate": "2028-03-01"
},
{
"BatchNumber": "LOTE-2026-002",
"Quantity": 20,
"ManufacturingDate": "2026-03-10",
"ExpiryDate": "2028-03-10"
}
]
}
]
}

2. Resultado no WMS

  • Produto PA-789 – Bateria 60Ah cadastrado/atualizado no WMS com controle de lote ativo.
  • Pedido de entrada criado com RelatedOrderCode = "60100".
  • Dois lotes registrados: LOTE-2026-001 (30 un.) e LOTE-2026-002 (20 un.).
  • Registro de IntegrationTracking criado para evitar reprocessamento.
  • Cursor de sincronização atualizado para 2026-03-20.

✅ Regras de Negócio

  • Apenas documentos do tipo PurchaseDeliveryNotes em status de rascunho (Drafts) são consultados.
  • A importação é incremental — utiliza cursor temporal baseado na data do último documento processado com sucesso.
  • Produtos são filtrados por prefixo válido configurado nos parâmetros de integração B1 antes de serem consultados na API /Items.
  • Pedidos já existentes no IntegrationTracking (verificados pelo RelatedOrderCode) são ignorados, evitando duplicidade.
  • Se a etapa de Query falhar, uma InvalidOperationException é lançada e o ciclo de integração é interrompido.
  • Se a etapa de integração de produtos falhar, uma InvalidOperationException é lançada com detalhes do erro.
  • Se a lista de dados parseados estiver vazia, a etapa Send retorna imediatamente sem processar.
  • O processamento é feito por ErpIntegration — cada configuração de ERP é processada individualmente, permitindo múltiplas conexões B1.

Resumo

Esse fluxo garante que as notas de entrada de insumos do SAP B1 sejam automaticamente importadas e registradas no WMS, incluindo produtos e lotes, de forma incremental e sem duplicidade.


⚙️ Especificações Técnicas

Fluxo de execução

  • Query: Consulta os rascunhos de PurchaseDeliveryNotes no SAP B1, recupera detalhes completos dos documentos e produtos associados, utilizando cursor temporal para buscar apenas registros novos desde a última execução.
  • Parse: Converte os dados retornados do SAP B1 (B1PurchaseDeliveryNotesResponse e B1ItemResponse) para os modelos internos do WMS (OrderImport e ProductImport) via AutoMapper.
  • Send: Integra os produtos no WMS, filtra pedidos já processados via IntegrationTracking, salva os movimentos de entrada e atualiza o cursor de sincronização.

Detalhamento das Etapas

Query

B1GoodsReceiptIntegrator.Query()
└── B1GoodsReceiptService.GetGoodsReceiptWithDependenciesAsync()
├── ErpIntegrationsService.GetAllB1ErpIntegrations()
└── [Para cada ErpIntegration]
├── ErpIntegrationsService.GetCursorAsync()
├── DraftsConnector.GetPurchaseDeliveryNotesDraftAsync()
├── [Para cada Draft] → Recupera detalhes completos
├── Extração de códigos de produto (com filtro de prefixo)
└── B1ItemConnector.GetItemsAsync()
  • B1GoodsReceiptIntegrator.Query(): ponto de entrada da etapa de consulta. Delega ao serviço e valida o resultado, lançando exceção em caso de falha.
  • B1GoodsReceiptService.GetGoodsReceiptWithDependenciesAsync(): orquestra a busca para todas as ErpIntegrations configuradas. Para cada uma, obtém o cursor, busca rascunhos, recupera detalhes dos documentos, extrai e filtra códigos de produto por prefixo válido, e busca os dados completos dos produtos.
  • DraftsConnector.GetPurchaseDeliveryNotesDraftAsync(): consulta a API /Drafts do SAP B1 filtrando por data a partir do cursor.
  • B1ItemConnector.GetItemsAsync(): consulta a API /Items do SAP B1 para obter dados completos dos produtos referenciados.

Parse

B1GoodsReceiptIntegrator.Parse()
└── [Para cada B1PurchaseDeliveryImportResult]
└── B1GoodsReceiptService.ParsePurchaseDeliveryNotesWithDependencies()
├── Mapper.Map<List<ProductImport>>(products)
├── Mapeamento de GoodsReceipts → OrderImport
└── Criação de ImportOrdersWithRelations
  • B1GoodsReceiptIntegrator.Parse(): itera sobre cada resultado e aplica a transformação individualmente.
  • B1GoodsReceiptService.ParsePurchaseDeliveryNotesWithDependencies(): utiliza AutoMapper para converter produtos (B1ItemResponseProductImport) e mapeia manualmente as notas de entrada para OrderImport, utilizando os parâmetros de integração B1 para definir campos como operação logística e situação.

Send

B1GoodsReceiptIntegrator.Send()
└── [Para cada B1ParsedOrderImport]
├── B1GoodsReceiptService.IntegrateProductsAsync()
│ └── RecordProductService (cadastro/atualização de produtos)
├── B1GoodsReceiptService.VerifyIntegrationTrackingAsync()
│ └── OrderIntegrationService (verificação de duplicidade)
├── Filtragem de pedidos duplicados (HashSet)
└── B1GoodsReceiptService.SaveMovementsAsync()
├── RecordOrderService (registro de pedidos)
├── ErpIntegrationsService.UpdateCursorAsync()
└── OrderIntegrationService.SaveTrackingAsync()
  • B1GoodsReceiptIntegrator.Send(): orquestra a etapa de persistência para cada ErpIntegration. Retorna imediatamente se não houver dados.
  • B1GoodsReceiptService.IntegrateProductsAsync(): cadastra ou atualiza os produtos no WMS. Lança exceção em caso de falha.
  • B1GoodsReceiptService.VerifyIntegrationTrackingAsync(): consulta o IntegrationTracking para identificar pedidos já processados, retornando os RelatedOrderCode existentes.
  • B1GoodsReceiptService.SaveMovementsAsync(): registra os pedidos de entrada no WMS, atualiza o cursor temporal da ErpIntegration e salva os registros de rastreamento.

Resumo do Funcionamento

  • Incrementalidade: a integração utiliza cursor temporal para processar apenas documentos novos ou alterados desde a última execução bem-sucedida.
  • Deduplicação: pedidos já integrados são filtrados via IntegrationTracking usando HashSet para performance otimizada.
  • Multi-ERP: o fluxo suporta múltiplas configurações de ErpIntegration, processando cada uma independentemente.
  • Integração de produtos: produtos são sempre integrados antes dos movimentos, garantindo que os itens existam no WMS antes do registro de entrada.
  • Filtro por prefixo: apenas produtos cujo código atende aos prefixos configurados nos parâmetros B1 são incluídos na importação.
  • Tratamento de erros: falhas na Query ou na integração de produtos interrompem o ciclo com InvalidOperationException. O framework base (BaseIntegrator) captura exceções e aciona o hook OnError.