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.
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
-
Consulta de Ordens de Produção Concluídas no SAP B1 (Query)
- O WMS consulta a API
ProductionOrdersdo SAP B1, filtrando ordens com statusboposClosedeClosingDatesuperior ao cursor da última execução. - A consulta retorna as ordens com linhas de produção expandidas, incluindo informações de lote (
BatchNumbers).
- O WMS consulta a API
-
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_HOMpara 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.
- Para as ordens novas (ainda não processadas no WMS), o sistema consulta a view
-
Conversão para Movimentações do WMS (Parse)
- As transações de inventário do SAP B1 são convertidas para objetos
OrderImportdo 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.
- As transações de inventário do SAP B1 são convertidas para objetos
-
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
IntegrationTrackingsão criados e o cursor é atualizado.
-
Notificação de Divergências ao SAP B1
- Após a movimentação no WMS, o sistema verifica pedidos com status
Movimentadoe 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) eStockTransfers(perdas). - Pedidos corrigidos com sucesso são concluídos no WMS.
- Após a movimentação no WMS, o sistema verifica pedidos com status
🖥️ 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,
AbsoluteEntry60800 - Produto acabado:
PA-789 – Bateria 60Ah(50 unidades, loteLT-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
Entradae suboperaçãoProduto Acabado. - Item
PA-789cadastrado automaticamente (caso não existisse no WMS). - Lote
LT-2026-003registrado com data de fabricação 2026-03-20 e validade 2027-03-20, classificaçãoLIBERADO. IntegrationTrackingregistrado com tipoCompletedOrderProductionImport.- Cursor atualizado para
2026-03-25.
✅ Regras de Negócio
- Apenas ordens de produção com status
ProductionOrderStatus = 'boposClosed'eClosingDateposterior 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 > 0sã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-seLOTE UNICO. - Datas de fabricação (
ManufacturingDate) e validade (ExpirationDate) são obtidas do endpointBatchNumberDetailsdo 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) →
StockTransferspara o depósito de perda configurado
- Ganhos (divergência positiva) →
- 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
IntegrationTrackingpara rastreabilidade completa.
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 emClosingDate. - Parse: Filtra ordens novas, busca transações de inventário na view
SD_INVENTORY_TRANSATIONS_HOM, enriquece com detalhes de lote viaBatchNumberDetailse converte para objetosOrderImport. - Send: Cadastra produtos novos no WMS, salva as movimentações de entrada, atualiza o cursor, registra
IntegrationTrackinge 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
ProductionOrderscom filtro de statusboposClosedeClosingDate >= 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:
- Filtra ordens ainda não processadas no WMS.
- Busca transações de inventário de entrada via
SD_INVENTORY_TRANSATIONS_HOM(chunks de 20). - Consulta detalhes de lote via
BatchNumberDetails(chunks de 20). - Converte transações para
OrderImport, agrupando por ordem de produção (BaseEntry).
- CreateOrderImportFromTransactions(): Cria o objeto
OrderImportcom itens, lotes (classificaçãoLIBERADO), datas de fabricação/validade e suboperaçãoProduto 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
OrderImportno WMS, registraIntegrationTrackingpara cada operação (sucesso ou falha) e atualiza o cursor para aClosingDatemais 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
ClosingDatepara 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
BatchNumberDetailspara 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.