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.
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
-
Consulta de Notas de Entrada no SAP B1
- O WMS busca os rascunhos (
Drafts) dePurchaseDeliveryNotesno 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.
- O WMS busca os rascunhos (
-
Busca de Produtos Relacionados
- Com os códigos de produtos extraídos, o WMS consulta a API
/Itemsdo 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.
- Com os códigos de produtos extraídos, o WMS consulta a API
-
Transformação dos Dados (Parse)
- Os dados brutos do SAP B1 são convertidos para os modelos internos do WMS:
OrderImport(pedidos) eProductImport(produtos). - O mapeamento utiliza AutoMapper e os parâmetros de integração B1 configurados.
- Os dados brutos do SAP B1 são convertidos para os modelos internos do WMS:
-
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.
- Os produtos são integrados no WMS via
🖥️ 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 deDocumentLines/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 60Ahcadastrado/atualizado no WMS com controle de lote ativo. - Pedido de entrada criado com
RelatedOrderCode = "60100". - Dois lotes registrados:
LOTE-2026-001(30 un.) eLOTE-2026-002(20 un.). - Registro de
IntegrationTrackingcriado para evitar reprocessamento. - Cursor de sincronização atualizado para
2026-03-20.
✅ Regras de Negócio
- Apenas documentos do tipo
PurchaseDeliveryNotesem 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 peloRelatedOrderCode) 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.
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
PurchaseDeliveryNotesno 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 (
B1PurchaseDeliveryNotesResponseeB1ItemResponse) para os modelos internos do WMS (OrderImporteProductImport) 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 asErpIntegrationsconfiguradas. 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/Draftsdo SAP B1 filtrando por data a partir do cursor.B1ItemConnector.GetItemsAsync(): consulta a API/Itemsdo 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 (B1ItemResponse→ProductImport) e mapeia manualmente as notas de entrada paraOrderImport, 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 cadaErpIntegration. 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 oIntegrationTrackingpara identificar pedidos já processados, retornando osRelatedOrderCodeexistentes.B1GoodsReceiptService.SaveMovementsAsync(): registra os pedidos de entrada no WMS, atualiza o cursor temporal daErpIntegratione 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
IntegrationTrackingusandoHashSetpara 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 hookOnError.