Pular para o conteúdo principal

Importação de Ordens de Produção Concluídas — Entrada de Produto Acabado no WMS

📌 Descrição do Processo

A importação de ordens de produção concluídas representa o fluxo de entrada de produtos acabados do SAP B1 para o WMS. O SAP B1 registra as ordens de produção finalizadas (status Closed), enquanto o WMS recebe as movimentações de entrada dos produtos acabados, incluindo informações de lote, datas de fabricação e validade.

A integração garante que os produtos acabados de ordens de produção concluídas no SAP B1 sejam automaticamente importados como movimentações de entrada no WMS, com cadastro automático de produtos novos, rastreabilidade de lotes e notificação de divergências de inventário de volta ao SAP B1.

Importante

Este processo utiliza o padrão pooling com cursor incremental — busca periodicamente ordens de produção concluídas desde a última execução, baseando-se na ClosingDate. A integração também executa uma etapa de notificação ao SAP B1, corrigindo divergências de inventário (trocas de lote, ganhos e perdas) detectadas após a movimentação no WMS.


🔄 Fluxo de Importação

  1. Consulta de Ordens de Produção Concluídas no SAP B1 (Query)

    • O WMS consulta a API ProductionOrders do SAP B1, filtrando ordens com status boposClosed e ClosingDate superior ao cursor da última execução.
    • A consulta retorna as ordens com linhas de produção expandidas, incluindo informações de lote (BatchNumbers).
  2. Obtenção de Transações de Inventário e Detalhes de Lote

    • Para as ordens novas (ainda não processadas no WMS), o sistema consulta a view SD_INVENTORY_TRANSATIONS_HOM para obter as transações de entrada de produtos acabados.
    • As informações de lote (data de fabricação e validade) são enriquecidas via endpoint BatchNumberDetails.
  3. Conversão para Movimentações do WMS (Parse)

    • As transações de inventário do SAP B1 são convertidas para objetos OrderImport do WMS.
    • Cada transação vira um item do pedido com informações de lote, quantidade, classificação de propósito (LIBERADO) e datas de fabricação/validade.
  4. Cadastro de Produtos e Salvamento de Movimentações (Send)

    • Produtos novos encontrados nas ordens de produção são automaticamente cadastrados no WMS.
    • As movimentações são salvas no WMS, registros de IntegrationTracking são criados e o cursor é atualizado.
  5. Notificação de Divergências ao SAP B1

    • Após a movimentação no WMS, o sistema verifica pedidos com status Movimentado e identifica divergências de inventário (trocas de lote, ganhos e perdas).
    • Correções são enviadas ao SAP B1 via InventoryGenEntries (ganhos), InventoryGenExits (trocas de lote) e StockTransfers (perdas).
    • Pedidos corrigidos com sucesso são concluídos no WMS.

🖥️ APIs Envolvidas

  • SAP B1 → WMS (GET)

    • /ProductionOrders?$filter=ProductionOrderStatus eq 'boposClosed' and ClosingDate ge '{cursorDate}' → retorna ordens de produção concluídas com linhas e lotes expandidos ($expand=ProductionOrderLines,ProductionOrderLines($expand=BatchNumbers)).
    • /sml.svc/SD_INVENTORY_TRANSATIONS_HOM?$filter=Tipo eq 'Entrada' and BaseType eq 202 and (BaseEntry eq {entry1} or BaseEntry eq {entry2} ...) → retorna transações de inventário de entrada (produtos acabados) vinculadas às ordens de produção.
    • /BatchNumberDetails?$filter=(ItemCode eq '{itemCode}' and Batch eq '{batch}') or ... → retorna detalhes de lotes (datas de fabricação e validade).
  • WMS → SAP B1 (POST) — Notificação de Divergências

    • /InventoryGenEntries → cria entrada de inventário manual para correção de ganhos (divergências positivas de lote).
    • /InventoryGenExits → cria saída de inventário manual para correção de trocas de lote (divergências negativas compensadas).
    • /StockTransfers → cria transferência de estoque para o depósito de perda (divergências negativas não compensadas).

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

Cenário:

  • Ordem de produção: DocNum 60800, AbsoluteEntry 60800
  • Produto acabado: PA-789 – Bateria 60Ah (50 unidades, lote LT-2026-003)
  • Depósito de produção: WH-PROD
  • Data de fechamento: 2026-03-25
  • Data de fabricação do lote: 2026-03-20
  • Data de validade do lote: 2027-03-20

1. Ordem de Produção no SAP B1

{
"AbsoluteEntry": 60800,
"DocumentNumber": 60800,
"ItemNo": "PA-789",
"ProductDescription": "Bateria 60Ah",
"CompletedQuantity": 50,
"Warehouse": "WH-PROD",
"ClosingDate": "2026-03-25",
"ProductionOrderLines": [
{
"ItemNo": "MP-001",
"ItemName": "Placa de Chumbo",
"IssuedQuantity": 100,
"BatchNumbers": [
{
"BatchNumber": "LT-MP-2026-010",
"Quantity": 100,
"ItemCode": "MP-001"
}
]
}
]
}

2. Transação de Inventário (Entrada de Produto Acabado)

{
"Tipo": "Entrada",
"DocEntry": 90500,
"ItemCode": "PA-789",
"Description": "Bateria 60Ah",
"Quantity": 50,
"WarehouseCode": "WH-PROD",
"BaseType": 202,
"BaseEntry": 60800,
"Batch": "LT-2026-003"
}

3. Resultado no WMS

  • Movimentação de entrada criada para o pedido #60800 com operação Entrada e suboperação Produto Acabado.
  • Item PA-789 cadastrado automaticamente (caso não existisse no WMS).
  • Lote LT-2026-003 registrado com data de fabricação 2026-03-20 e validade 2027-03-20, classificação LIBERADO.
  • IntegrationTracking registrado com tipo CompletedOrderProductionImport.
  • Cursor atualizado para 2026-03-25.

✅ Regras de Negócio

  • Apenas ordens de produção com status ProductionOrderStatus = 'boposClosed' e ClosingDate posterior ao cursor são consultadas.
  • A importação é incremental via cursor — apenas ordens novas desde a última execução são processadas.
  • Ordens já existentes no WMS são filtradas durante o parse, evitando duplicação.
  • Apenas transações com Quantity > 0 são consideradas na entrada de produtos acabados.
  • Produtos novos encontrados nas ordens de produção são automaticamente cadastrados no WMS antes do salvamento das movimentações.
  • Apenas produtos com prefixos válidos configurados nos parâmetros B1 são considerados para cadastro automático.
  • Lotes são registrados com classificação de propósito LIBERADO. Quando o lote é vazio, utiliza-se LOTE UNICO.
  • Datas de fabricação (ManufacturingDate) e validade (ExpirationDate) são obtidas do endpoint BatchNumberDetails do SAP B1.
  • Após a movimentação no WMS, divergências de inventário são identificadas e corrigidas automaticamente no SAP B1:
    • Ganhos (divergência positiva) → InventoryGenEntries
    • Trocas de lote (divergência negativa compensada por positiva) → InventoryGenExits
    • Perdas (divergência negativa não compensada) → StockTransfers para o depósito de perda configurado
  • Pedidos são concluídos no WMS somente quando todas as correções de divergência são enviadas com sucesso ao SAP B1.
  • Em caso de falha na etapa de Query, uma InvalidOperationException é lançada, interrompendo a execução.
  • Em caso de falha nas correções de divergência, os pedidos não são concluídos e um log de erro é registrado.
  • Cada operação gera registros de IntegrationTracking para rastreabilidade completa.

Resumo

Esse fluxo garante que os produtos acabados de ordens de produção concluídas no SAP B1 sejam automaticamente importados como movimentações de entrada no WMS, com cadastro automático de produtos, rastreabilidade de lotes e correção de divergências de inventário de volta ao SAP B1, mantendo ambos os sistemas sincronizados no ciclo de produção.


⚙️ Especificações Técnicas

Fluxo de execução

  • Query: Consulta ordens de produção concluídas no SAP B1 via endpoint ProductionOrders, utilizando cursor incremental baseado em ClosingDate.
  • Parse: Filtra ordens novas, busca transações de inventário na view SD_INVENTORY_TRANSATIONS_HOM, enriquece com detalhes de lote via BatchNumberDetails e converte para objetos OrderImport.
  • Send: Cadastra produtos novos no WMS, salva as movimentações de entrada, atualiza o cursor, registra IntegrationTracking e notifica o SAP B1 com correções de divergências de inventário.

Detalhamento das Etapas

Query

B1CompletedOrderProductionIntegrator.Query()
└── B1CompletedOrderProductionService.BuscaProductionOrdersAsync()
├── ErpIntegrationsService.GetErpToIntegrateAsync(EDefIntegration.B1)
├── ErpIntegrationsService.GetErpIntegrationCursorAsync(erpIntegration, integrationType)
└── B1CompletedOrderProductionConnector.GetFinishedProductionOrdersAsync(config, cursorDate)
  • B1CompletedOrderProductionIntegrator.Query(): Ponto de entrada — delega a busca ao serviço e armazena o resultado para uso na etapa Send. Lança exceção se a consulta falhar.
  • B1CompletedOrderProductionService.BuscaProductionOrdersAsync(): Obtém a configuração de integração B1, recupera o cursor da última execução e consulta o conector para buscar ordens concluídas.
  • B1CompletedOrderProductionConnector.GetFinishedProductionOrdersAsync(): Executa a chamada ao SAP B1 ServiceLayer no endpoint ProductionOrders com filtro de status boposClosed e ClosingDate >= cursorDate, expandindo linhas e lotes.

Parse

B1CompletedOrderProductionIntegrator.Parse()
└── B1CompletedOrderProductionService.ParseEntradasDeProdutosAcabadosAsync()
└── ParseMovementsFromInventoryDocsAsync(orders, Entrada)
├── FilterNewOrdersToProcessAsync(orders, operation, parameters)
├── FetchFullInventoryDocumentsAsync(newOrders, operation, erpIntegration)
│ └── B1InventoryTransationsConnector.GetFinishedProductionInfosAsync()
├── B1BatchNumberDetailsConnector.GetBatchDetailsInChunksAsync()
└── MapDocumentsToOrderImports(transactions, orders, operation, batchDetails, parameters)
└── CreateOrderImportFromTransactions()
  • B1CompletedOrderProductionIntegrator.Parse(): Delega a conversão ao serviço. Retorna lista vazia se não houver dados.
  • ParseMovementsFromInventoryDocsAsync(): Orquestra toda a transformação:
    1. Filtra ordens ainda não processadas no WMS.
    2. Busca transações de inventário de entrada via SD_INVENTORY_TRANSATIONS_HOM (chunks de 20).
    3. Consulta detalhes de lote via BatchNumberDetails (chunks de 20).
    4. Converte transações para OrderImport, agrupando por ordem de produção (BaseEntry).
  • CreateOrderImportFromTransactions(): Cria o objeto OrderImport com itens, lotes (classificação LIBERADO), datas de fabricação/validade e suboperação Produto Acabado.

Send

B1CompletedOrderProductionIntegrator.Send()
├── B1CompletedOrderProductionService.IntegraProdutosDeOrdensAsync()
│ ├── ExtractUniqueProductCodes(productionOrders, validPrefixes)
│ ├── FilterNewProductsToImportAsync(productCodes)
│ └── RecordProductService.RecordProductsAsync(newProducts)

├── B1CompletedOrderProductionService.SaveMovementsAsync()
│ ├── RecordOrderService.RecordOrder(movements)
│ ├── SaveIntegrationTrackingsAsync(erpIntegration, results, integrationType)
│ └── UpdateCursorBasedOnResultsAsync(results, sourceOrders, erpIntegration, integrationType)

└── B1ProductionNotificationService.NotificarEntradasDeProducaoParaB1Async()
├── BuscarPedidosGatilhoAsync(parameters)
├── AgruparPedidosPorInventarioAsync(pedidosGatilho)
└── ProcessarGruposDeInventarioAsync()
├── IdentificarDivergenciasDeLote()
├── B1InventoryGenConnector.CreateInventoryGenEntryAsync() [ganhos]
├── B1InventoryGenConnector.CreateInventoryGenExitAsync() [trocas]
├── B1StockTransferConnector.PostStockTransferAsync() [perdas]
└── PedidoRepository.ConcludeOrderAsync()
  • B1CompletedOrderProductionIntegrator.Send(): Orquestra três operações sequenciais: cadastro de produtos, salvamento de movimentações e notificação de divergências.
  • IntegraProdutosDeOrdensAsync(): Extrai códigos de produtos únicos das ordens (respeitando prefixos válidos), identifica quais são novos e cadastra-os no WMS.
  • SaveMovementsAsync(): Salva as movimentações OrderImport no WMS, registra IntegrationTracking para cada operação (sucesso ou falha) e atualiza o cursor para a ClosingDate mais recente.
  • NotificarEntradasDeProducaoParaB1Async(): Busca pedidos em status Movimentado, agrupa por inventário e, para cada grupo, identifica divergências de lote (ganhos, trocas, perdas). Envia correções ao SAP B1 e conclui os pedidos no WMS quando todas as correções são bem-sucedidas.

Resumo do Funcionamento

  • Busca incremental: Utiliza cursor baseado em ClosingDate para processar apenas ordens de produção novas desde a última execução.
  • Filtragem de duplicatas: Ordens já presentes no WMS são filtradas antes do parse, evitando reprocessamento.
  • Enriquecimento de dados: Transações de inventário são cruzadas com BatchNumberDetails para obter datas de fabricação e validade dos lotes.
  • Cadastro automático de produtos: Produtos novos encontrados nas ordens de produção são cadastrados automaticamente no WMS antes da importação das movimentações.
  • Correção bidirecional: Após a movimentação no WMS, divergências de inventário são automaticamente reportadas ao SAP B1 (entradas, saídas e transferências de estoque).
  • Rastreabilidade completa: Cada operação gera registros de IntegrationTracking, permitindo auditoria de todo o fluxo.
  • Tratamento de erros: Falhas na Query interrompem a execução. Falhas nas correções de divergência impedem a conclusão dos pedidos e geram logs de erro para análise.