Pular para o conteúdo principal

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.

Importante

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

  1. 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.
  2. 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).
  3. Envio dos Documentos ao SAP B1

    • Recebimentos normais: o WMS envia um POST /PurchaseDeliveryNotes com as linhas e lotes distribuídos. Em caso de sucesso, o rascunho é atualizado via PATCH /Drafts({docEntry}) com o comentário "Processado pelo WMS".
    • Devoluções: para cada entrada de devolução, o WMS envia um POST /InventoryGenEntries com as linhas agrupadas e lotes correspondentes.
    • Registros de IntegrationTracking são salvos para cada operação (sucesso ou falha).
    • Se qualquer operação for bem-sucedida, o pedido é concluído no WMS.
  4. Logging e Auditoria

    • Ao final de cada ErpIntegration, o integrador registra um log com o total de pedidos concluídos e com falha.

🖥️ APIs Envolvidas

  • SAP B1 → WMS (GET)

    • /Drafts({docEntry}) → recupera o rascunho de PurchaseDeliveryNotes para 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

  • PurchaseDeliveryNotes criada com sucesso no SAP B1 → DocNum 70300.
  • Rascunho 60200 atualizado com comentário "Processado pelo WMS \nDocumento gerado: 70300".
  • InventoryGenEntry criada para devolução de MP-456.
  • Registros de IntegrationTracking salvos para ambas as operações.
  • Pedido 1500 concluí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 ReturnClassificationId dos parâmetros B1.
  • Movimentos normais utilizam o tipo CodMov == EDefMovimentacao.ColocarQuantidadeLogicamente e 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 campo BaseType = 1 (referência a Purchase Order) é utilizado para vincular ao pedido de compra original.
  • Para InventoryGenEntries de devolução, o campo BaseType = -1 indica ausência de documento base.
  • Rascunhos (Drafts) são marcados como processados no SAP B1 somente após criação bem-sucedida da PurchaseDeliveryNote.
  • 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 IntegrationTracking são salvos para cada operação, usando EIntegrationOperationType.GoodsReceiptReturn para notas de entrada e EIntegrationOperationType.InventoryGenEntry para devoluções.

Resumo

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 PurchaseDeliveryNotes e InventoryGenEntries ao SAP B1, marca rascunhos como processados, salva registros de IntegrationTracking e 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 as ErpIntegrations configuradas. 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ça InvalidOperationException se 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 no ReturnClassificationId. Movimentos normais geram B1CreatePurchaseDeliveryNotesRequest; devoluções geram ParsedInventoryGenEntry.
  • ParseReturnMovementsToInventoryGenEntries(): agrupa movimentos de devolução por produto e localização, criando linhas de InventoryGenEntry com lotes e quantidades consolidadas. BaseType = -1 indica 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 via BaseLineNumber.

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 cada ParsedGoodsReceiptByIntegration, ignorando itens sem dados (HasAnyData == false). Registra log com total de pedidos concluídos e com falha.
  • ProcessSingleOrderAsync(): processa um pedido individualmente, enviando PurchaseDeliveryNote e/ou InventoryGenEntries conforme aplicável. Erros são coletados sem interromper o processamento.
  • SendSinglePurchaseDeliveryNoteAsync(): envia a nota de entrada via POST /PurchaseDeliveryNotes. Em caso de sucesso, marca o rascunho como processado.
  • SendReturnEntriesForOrderAsync(): envia cada entrada de devolução individualmente via POST /InventoryGenEntries, rastreando resultados por CodInventarioMov.
  • 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 IntegrationTracking com 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 hook OnError.