Processamento de Entradas de Insumos Processadas para o SAP B1
📌 Descrição do Processo
O processamento de entradas de insumos processadas representa o fluxo de exportação de recebimentos concluídos do WMS para o SAP B1.
O WMS atua como origem dos dados de movimentação (quantidades recebidas, lotes, devoluções), enquanto o SAP B1 recebe os documentos finalizados (PurchaseDeliveryNotes e InventoryGenEntries).
A integração garante que as entradas de insumos conferidas no WMS sejam automaticamente registradas no SAP B1, incluindo a criação de notas de entrada e lançamentos de devolução.
Este processo segrega automaticamente os movimentos em duas categorias: recebimentos normais (geram PurchaseDeliveryNotes) e devoluções (geram InventoryGenEntries). A classificação é feita com base no ReturnClassificationId configurado nos parâmetros de integração B1. Além disso, rascunhos (Drafts) processados com sucesso são marcados no SAP B1 com o número do documento gerado.
🔄 Fluxo de Exportação
-
Consulta de Pedidos Processados no WMS
- O WMS busca os pedidos de entrada marcados para retorno ao SAP B1 via
GetGoodsReceiptsToReturnAsync(). - Para cada pedido, recupera o rascunho (
Draft) correspondente no SAP B1 via/Drafts({docEntry}). - Obtém os movimentos de inventário confirmados e calcula movimentos pendentes de recebimento.
- Mapeia os códigos de produto WMS para os códigos B1 via tabela de produtos relacionados.
- O WMS busca os pedidos de entrada marcados para retorno ao SAP B1 via
-
Transformação e Segregação dos Movimentos (Parse)
- Os movimentos são segregados em recebimentos normais e devoluções, com base na classificação do armazém.
- Movimentos normais são distribuídos pelas linhas do rascunho do SAP B1, respeitando quantidades e lotes.
- Movimentos de devolução são agrupados por produto e localização, gerando entradas de inventário (
InventoryGenEntries).
-
Envio dos Documentos ao SAP B1
- Recebimentos normais: o WMS envia um
POST /PurchaseDeliveryNotescom as linhas e lotes distribuídos. Em caso de sucesso, o rascunho é atualizado viaPATCH /Drafts({docEntry})com o comentário "Processado pelo WMS". - Devoluções: para cada entrada de devolução, o WMS envia um
POST /InventoryGenEntriescom as linhas agrupadas e lotes correspondentes. - Registros de
IntegrationTrackingsão salvos para cada operação (sucesso ou falha). - Se qualquer operação for bem-sucedida, o pedido é concluído no WMS.
- Recebimentos normais: o WMS envia um
-
Logging e Auditoria
- Ao final de cada
ErpIntegration, o integrador registra um log com o total de pedidos concluídos e com falha.
- Ao final de cada
🖥️ APIs Envolvidas
-
SAP B1 → WMS (GET)
/Drafts({docEntry})→ recupera o rascunho dePurchaseDeliveryNotespara cada pedido, incluindo linhas e lotes.
-
WMS → SAP B1 (POST)
/PurchaseDeliveryNotes→ cria a nota de entrada de insumos com as linhas e lotes conferidos no WMS./InventoryGenEntries→ cria lançamentos de entrada de inventário para movimentos de devolução.
-
WMS → SAP B1 (PATCH)
/Drafts({docEntry})→ atualiza o comentário do rascunho com "Processado pelo WMS \nDocumento gerado: {docNum}".
📦 Exemplo de Processamento (Objeto Fictício)
Cenário:
- Fornecedor: Distribuidora XYZ S.A. (
C00250) - Pedido WMS: CodPedido 1500
- Draft no SAP B1: DocEntry 60200
- Produto recebido:
PA-789 – Bateria 60Ah(50 unidades, 2 lotes) - Produto devolvido:
MP-456 – Conector 12V(10 unidades, classificação de devolução)
1. PurchaseDeliveryNote enviada ao SAP B1
{
"CardCode": "C00250",
"Comments": "Entrada processada pelo WMS Pedido 1500",
"BPL_IDAssignedToInvoice": 1,
"SequenceCode": 57,
"SequenceSerial": 1,
"DocumentLines": [
{
"BaseType": 1,
"BaseEntry": 60200,
"BaseLine": 0,
"ItemCode": "PA-789",
"UnitPrice": 150.00,
"WarehouseCode": "WH01",
"Quantity": 50,
"InventoryQuantity": 50,
"BatchNumbers": [
{
"BatchNumber": "LOTE-2026-001",
"Quantity": 30,
"ItemCode": "PA-789",
"BaseLineNumber": 0,
"ManufacturingDate": "2026-03-01",
"ExpiryDate": "2028-03-01"
},
{
"BatchNumber": "LOTE-2026-002",
"Quantity": 20,
"ItemCode": "PA-789",
"BaseLineNumber": 0,
"ManufacturingDate": "2026-03-10",
"ExpiryDate": "2028-03-10"
}
]
}
]
}
2. InventoryGenEntry de devolução enviada ao SAP B1
{
"DocDate": "2026-03-25",
"Comments": "WMS: Devolução - Pedido 1500",
"BPL_IDAssignedToInvoice": 1,
"DocumentLines": [
{
"ItemCode": "MP-456",
"Quantity": 10,
"WarehouseCode": "WH02",
"BaseType": -1,
"BatchNumbers": [
{
"BatchNumber": "LOTE-DEV-001",
"Quantity": 10
}
]
}
]
}
3. Resultado
PurchaseDeliveryNotescriada com sucesso no SAP B1 → DocNum70300.- Rascunho
60200atualizado com comentário "Processado pelo WMS \nDocumento gerado: 70300". InventoryGenEntrycriada para devolução deMP-456.- Registros de
IntegrationTrackingsalvos para ambas as operações. - Pedido
1500concluído no WMS.
✅ Regras de Negócio
- Apenas pedidos de entrada marcados para retorno ao SAP B1 são processados (
GetGoodsReceiptsToReturnAsync()). - Movimentos são segregados automaticamente em recebimentos normais e devoluções com base no
ReturnClassificationIddos parâmetros B1. - Movimentos normais utilizam o tipo
CodMov == EDefMovimentacao.ColocarQuantidadeLogicamentee armazém fora da classificação de devolução. - Movimentos de devolução são identificados quando o armazém pertence à classificação de devolução configurada.
- Quantidades são distribuídas pelas linhas do rascunho respeitando a capacidade disponível em cada linha e a integridade dos lotes.
- Produtos sem código B1 mapeado na tabela de produtos relacionados são ignorados com log de aviso.
- Para
PurchaseDeliveryNotes, o campoBaseType = 1(referência a Purchase Order) é utilizado para vincular ao pedido de compra original. - Para
InventoryGenEntriesde devolução, o campoBaseType = -1indica ausência de documento base. - Rascunhos (
Drafts) são marcados como processados no SAP B1 somente após criação bem-sucedida daPurchaseDeliveryNote. - O pedido no WMS é concluído automaticamente se qualquer operação (recebimento ou devolução) for bem-sucedida.
- Falhas individuais em um pedido não interrompem o processamento dos demais pedidos.
- O processamento é feito por
ErpIntegration— cada configuração de ERP é processada independentemente, permitindo múltiplas conexões B1. - Registros de
IntegrationTrackingsão salvos para cada operação, usandoEIntegrationOperationType.GoodsReceiptReturnpara notas de entrada eEIntegrationOperationType.InventoryGenEntrypara devoluções.
Esse fluxo garante que as entradas de insumos conferidas no WMS sejam automaticamente registradas no SAP B1 como PurchaseDeliveryNotes e InventoryGenEntries, segregando recebimentos normais de devoluções, com rastreamento completo e conclusão automática dos pedidos.
⚙️ Especificações Técnicas
Fluxo de execução
- Query: Busca no WMS os pedidos de entrada pendentes de retorno, recupera os rascunhos correspondentes no SAP B1, obtém movimentos de inventário confirmados e mapeia códigos de produto WMS para B1.
- Parse: Segrega movimentos em recebimentos normais e devoluções, distribui quantidades pelas linhas do rascunho e agrupa devoluções por produto e localização, gerando os payloads prontos para o SAP B1.
- Send: Envia
PurchaseDeliveryNoteseInventoryGenEntriesao SAP B1, marca rascunhos como processados, salva registros deIntegrationTrackinge conclui os pedidos no WMS.
Detalhamento das Etapas
Query
B1ProcessedGoodsReceiptIntegrator.Query()
└── B1ProcessedGoodsReceiptService.GetProcessedGoodsReceiptsAsync()
├── ErpIntegrationsService.GetAllB1ErpIntegrations()
└── [Para cada ErpIntegration]
├── PedidoRepository.GetGoodsReceiptsToReturnAsync()
├── [Para cada Pedido] → DraftsConnector.GetDraftByKeyAsync()
├── InventarioRepository.GetConfirmedMovementsByPedidosAsync()
├── InventarioRepository.GetMissingGoodsReceiptMovement()
└── ProdutoRelacionadoRepository (mapeamento WMS → B1)
B1ProcessedGoodsReceiptIntegrator.Query(): ponto de entrada da etapa de consulta. Delega ao serviço.B1ProcessedGoodsReceiptService.GetProcessedGoodsReceiptsAsync(): orquestra a busca para todas asErpIntegrationsconfiguradas. Para cada uma, obtém os pedidos pendentes de retorno, recupera os rascunhos no SAP B1, busca movimentos confirmados e pendentes, e mapeia códigos de produto. LançaInvalidOperationExceptionse nenhuma integração B1 estiver configurada.DraftsConnector.GetDraftByKeyAsync(): consulta a API/Drafts({docEntry})do SAP B1 para obter o rascunho completo. Falhas individuais são logadas e o pedido é ignorado.InventarioRepository.GetMissingGoodsReceiptMovement(): calcula movimentos pendentes para tratar recebimentos parciais.
Parse
B1ProcessedGoodsReceiptIntegrator.Parse()
└── B1ProcessedGoodsReceiptService.ParseGoodsReceiptsAsync()
├── ParametersProvider.GetParametersOrDefault()
└── [Para cada ProcessedGoodsReceiptByIntegration]
└── [Para cada Pedido] → ParseSingleOrder()
├── Segregação: movimentos normais vs. devoluções
├── ParseReturnMovementsToInventoryGenEntries()
│ └── Agrupamento por Produto + Localização → InventoryGenEntryLine
└── ParsePurchaseDeliveryNote()
└── Distribuição de quantidades pelas linhas do rascunho
ParseSingleOrder(): segrega os movimentos do pedido em normais e devoluções com base noReturnClassificationId. Movimentos normais geramB1CreatePurchaseDeliveryNotesRequest; devoluções geramParsedInventoryGenEntry.ParseReturnMovementsToInventoryGenEntries(): agrupa movimentos de devolução por produto e localização, criando linhas deInventoryGenEntrycom lotes e quantidades consolidadas.BaseType = -1indica ausência de documento base.ParsePurchaseDeliveryNote(): distribui as quantidades recebidas pelas linhas do rascunho original, respeitando a capacidade de cada linha e mantendo a rastreabilidade de lotes viaBaseLineNumber.
Send
B1ProcessedGoodsReceiptIntegrator.Send()
└── [Para cada ParsedGoodsReceiptByIntegration]
└── B1ProcessedGoodsReceiptService.ProcessGoodsReceiptsAsync()
└── [Para cada ParsedGoodsReceiptOrder] → ProcessSingleOrderAsync()
├── SendSinglePurchaseDeliveryNoteAsync()
│ ├── B1GoodsReceiptConnector.CreatePurchaseDeliveryNoteAsync() → POST /PurchaseDeliveryNotes
│ └── DraftsConnector.MarkDraftAsProcessedAsync() → PATCH /Drafts
├── SaveSinglePurchaseDeliveryNoteTrackingAsync()
│ └── OrderIntegrationService.SaveOrderIntegrationTrackingsAsync()
├── SendReturnEntriesForOrderAsync()
│ └── [Para cada ParsedInventoryGenEntry]
│ └── B1InventoryGenConnector.CreateInventoryGenEntryAsync() → POST /InventoryGenEntries
├── SaveReturnEntriesTrackingForOrderAsync()
│ └── OrderIntegrationService.SaveOrderIntegrationTrackingsAsync()
└── ConcludeOrderService.ConcludeOrderAsync()
B1ProcessedGoodsReceiptIntegrator.Send(): itera sobre cadaParsedGoodsReceiptByIntegration, ignorando itens sem dados (HasAnyData == false). Registra log com total de pedidos concluídos e com falha.ProcessSingleOrderAsync(): processa um pedido individualmente, enviandoPurchaseDeliveryNotee/ouInventoryGenEntriesconforme aplicável. Erros são coletados sem interromper o processamento.SendSinglePurchaseDeliveryNoteAsync(): envia a nota de entrada viaPOST /PurchaseDeliveryNotes. Em caso de sucesso, marca o rascunho como processado.SendReturnEntriesForOrderAsync(): envia cada entrada de devolução individualmente viaPOST /InventoryGenEntries, rastreando resultados porCodInventarioMov.ConcludeOrderAsync(): conclui o pedido no WMS se qualquer operação foi bem-sucedida.
Resumo do Funcionamento
- Segregação automática: movimentos são automaticamente classificados em recebimentos normais e devoluções com base na configuração de
ReturnClassificationId. - Distribuição inteligente: quantidades recebidas são distribuídas pelas linhas do rascunho, respeitando capacidade e integridade de lotes.
- Multi-ERP: o fluxo suporta múltiplas configurações de
ErpIntegration, processando cada uma independentemente. - Rastreabilidade: cada operação (sucesso ou falha) é registrada no
IntegrationTrackingcom tipo de operação e IDs externos. - Conclusão automática: pedidos são concluídos no WMS assim que qualquer operação no SAP B1 é bem-sucedida.
- Tratamento de erros: falhas individuais são logadas e coletadas sem interromper o processamento dos demais pedidos. O framework base (
BaseIntegrator) captura exceções globais e aciona o hookOnError.