Importação de Saída de Insumos — Consumo de Matéria-Prima de Ordens de Produção no WMS
📌 Descrição do Processo
A importação de saída de insumos de produção representa o fluxo de consumo de matérias-primas registrado no SAP B1 para o WMS. O SAP B1 registra as saídas de insumos (materiais consumidos) nas ordens de produção concluídas, enquanto o WMS recebe as movimentações de saída correspondentes, incluindo informações de lote e quantidades consumidas.
A integração garante que os insumos consumidos nas ordens de produção do SAP B1 sejam automaticamente importados como movimentações de saída no WMS, com cadastro automático de produtos novos, rastreabilidade de lotes e execução de baixa automática dos pedidos.
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. Diferente do integrador de entrada de produto acabado, este integrador foca nas linhas de insumos consumidos (transações de saída) e executa uma baixa automática ao final, finalizando as movimentações no WMS via stored procedure StpWmsOperProcessaBaixaAutomatica.
🔄 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. - O cursor utilizado é independente do integrador de entrada de produto acabado (
IssuedProductionOrderImport).
- O WMS consulta a API
-
Obtenção de Transações de Saída 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 saída de insumos (Tipo = 'Saída'). - As consultas são feitas individualmente por ordem de produção (padrão N+1), pois cada ordem pode ter múltiplas linhas de insumos.
- 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 saída são agrupadas por
BaseLine(linha da ordem de produção). - Para cada grupo, se existem transações com lote, apenas essas são consideradas; caso contrário, utiliza-se a primeira transação do grupo.
- As transações filtradas são convertidas para objetos
OrderImportcom operaçãoSaidaSegregadoe suboperaçãoPRODUÇÃO.
- As transações de saída são agrupadas por
-
Cadastro de Produtos e Salvamento de Movimentações (Send)
- Produtos novos encontrados nas ordens de produção (insumos/componentes) são automaticamente cadastrados no WMS.
- As movimentações de saída são salvas no WMS, registros de
IntegrationTrackingsão criados e o cursor é atualizado.
-
Execução de Baixa Automática
- Após o salvamento, o sistema busca pedidos em status
Liberadocom operaçãoSaidaSegregadoe suboperaçãoPRODUÇÃO. - Para cada pedido encontrado, executa a stored procedure
StpWmsOperProcessaBaixaAutomatica, que finaliza a movimentação de estoque no WMS.
- Após o salvamento, o sistema busca pedidos em 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./sml.svc/SD_INVENTORY_TRANSATIONS_HOM?$filter=Tipo eq 'Saída' and BaseType eq 202 and BaseEntry eq {absoluteEntry}→ retorna transações de saída (insumos consumidos) para cada ordem de produção individualmente./BatchNumberDetails?$filter=(ItemCode eq '{itemCode}' and Batch eq '{batch}') or ...→ retorna detalhes de lotes (datas de fabricação e validade).
📦 Exemplo de Importação (Objeto Fictício)
Cenário:
- Ordem de produção: DocNum 60800,
AbsoluteEntry60800 - Produto acabado:
PA-789 – Bateria 60Ah - Insumo consumido:
MP-001 – Placa de Chumbo(100 unidades, loteLT-MP-2026-010) - Insumo consumido:
MP-002 – Ácido Sulfúrico(25 litros, sem lote) - Depósito de produção: WH-PROD
- Data de fechamento: 2026-03-25
1. Transações de Saída no SAP B1
[
{
"Tipo": "Saída",
"DocEntry": 90501,
"ItemCode": "MP-001",
"Description": "Placa de Chumbo",
"Quantity": 100,
"WarehouseCode": "WH-PROD",
"BaseType": 202,
"BaseEntry": 60800,
"BaseLine": 0,
"Batch": "LT-MP-2026-010"
},
{
"Tipo": "Saída",
"DocEntry": 90502,
"ItemCode": "MP-002",
"Description": "Ácido Sulfúrico",
"Quantity": 25,
"WarehouseCode": "WH-PROD",
"BaseType": 202,
"BaseEntry": 60800,
"BaseLine": 1,
"Batch": null
}
]
2. Resultado no WMS
- Movimentação de saída segregada criada para o pedido #60800 com operação
SaidaSegregadoe suboperaçãoPRODUÇÃO. - Item
MP-001: loteLT-MP-2026-010, 100 unidades, classificaçãoLIBERADO. - Item
MP-002: loteLOTE UNICO(sem lote no B1), 25 unidades, classificaçãoLIBERADO. - Produtos
MP-001eMP-002cadastrados automaticamente (caso não existissem no WMS). IntegrationTrackingregistrado com tipoIssuedProductionOrderImport.- Baixa automática executada — pedido finalizado via
StpWmsOperProcessaBaixaAutomatica.
✅ 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, com cursor independente do integrador de entrada de produto acabado.
- Ordens já existentes no WMS são filtradas durante o parse, evitando duplicação.
- As transações de saída são agrupadas por
BaseLine(linha da ordem de produção):- Se o grupo contém transações com lote → apenas transações com lote são utilizadas.
- Se o grupo não contém lotes → apenas a primeira transação do grupo é utilizada.
- Apenas transações com
Quantity > 0eBaseLinepreenchido são consideradas. - Produtos novos (insumos/componentes) encontrados nas ordens são automaticamente cadastrados no WMS antes do salvamento.
- 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. - A
RelatedOriginClassificationénullpara movimentações de saída de insumos (diferente da entrada de produto acabado, que utiliza o código de depósito transitório). - Datas de fabricação (
ManufacturingDate) e validade (ExpirationDate) são obtidas do endpointBatchNumberDetailsdo SAP B1. - Após o salvamento, a baixa automática é executada para pedidos com status
Liberado, operaçãoSaidaSegregadoe suboperação código17(PRODUÇÃO). - A baixa automática executa a stored procedure
StpWmsOperProcessaBaixaAutomatica, finalizando a movimentação no WMS. - Em caso de falha na etapa de Query, uma
InvalidOperationExceptioné lançada, interrompendo a execução. - Cada operação gera registros de
IntegrationTrackingpara rastreabilidade completa.
Esse fluxo garante que os insumos consumidos nas ordens de produção do SAP B1 sejam automaticamente importados como movimentações de saída no WMS, com cadastro automático de produtos, rastreabilidade de lotes e finalização automática via baixa, mantendo ambos os sistemas sincronizados no ciclo de consumo de matéria-prima.
⚙️ 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(tipoIssuedProductionOrderImport). - Parse: Filtra ordens novas, busca transações de saída na view
SD_INVENTORY_TRANSATIONS_HOM(padrão N+1), agrupa porBaseLinecom filtragem de lotes, enriquece comBatchNumberDetailse converte para objetosOrderImport. - Send: Cadastra produtos novos no WMS, salva as movimentações de saída, atualiza o cursor, registra
IntegrationTrackinge executa a baixa automática dos pedidos.
Detalhamento das Etapas
Query
B1IssuedProductionOrderIntegrator.Query()
└── B1CompletedOrderProductionService.BuscaProductionOrdersAsync(IssuedProductionOrderImport)
├── ErpIntegrationsService.GetErpToIntegrateAsync(EDefIntegration.B1)
├── ErpIntegrationsService.GetErpIntegrationCursorAsync(erpIntegration, integrationType)
└── B1CompletedOrderProductionConnector.GetFinishedProductionOrdersAsync(config, cursorDate)
- B1IssuedProductionOrderIntegrator.Query(): Ponto de entrada — delega a busca ao serviço com tipo
IssuedProductionOrderImporte 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 (independente do cursor de entrada de PA) e consulta o conector.
- B1CompletedOrderProductionConnector.GetFinishedProductionOrdersAsync(): Executa a chamada ao SAP B1 ServiceLayer no endpoint
ProductionOrderscom filtroboposClosedeClosingDate >= cursorDate.
Parse
B1IssuedProductionOrderIntegrator.Parse()
└── B1CompletedOrderProductionService.ParseSaidasDeInsumosAsync()
└── ParseMovementsFromInventoryDocsAsync(orders, SaidaSegregado)
├── FilterNewOrdersToProcessAsync(orders, operation, parameters)
├── FetchFullInventoryDocumentsAsync(newOrders, SaidaSegregado, erpIntegration)
│ └── B1InventoryTransationsConnector.GetIssuedProductsInfosAsync() [N+1]
├── B1BatchNumberDetailsConnector.GetBatchDetailsInChunksAsync()
└── MapDocumentsToOrderImports(transactions, orders, SaidaSegregado, batchDetails, parameters)
└── CreateOrderImportFromTransactions()
└── [Agrupamento por BaseLine + filtragem de lotes]
- B1IssuedProductionOrderIntegrator.Parse(): Delega a conversão ao serviço. Retorna lista vazia se não houver dados.
- ParseSaidasDeInsumosAsync(): Chama
ParseMovementsFromInventoryDocsAsynccom operaçãoSaidaSegregado. - GetIssuedProductsInfosAsync(): Consulta transações de saída na view
SD_INVENTORY_TRANSATIONS_HOMcomTipo = 'Saída'. Utiliza padrão N+1 (uma consulta por ordem de produção), adequado para o volume potencialmente alto de linhas de insumos. - CreateOrderImportFromTransactions(): Agrupa transações por
BaseLine, aplica filtragem de lotes (prioriza transações com lote quando existem) e criaOrderImportcom suboperaçãoPRODUÇÃO(código 17) eRelatedOriginClassification = null.
Send
B1IssuedProductionOrderIntegrator.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)
│
└── B1CompletedOrderProductionService.ExecutaBaixaAutomatica()
├── PedidoRepository.ObterCodPedidoPorFiltrosAsync(Liberado, 17, SaidaSegregado)
└── PedidoRepository.BaixaAutomaticaAsync(pedidosPolo)
└── StpWmsOperProcessaBaixaAutomatica [stored procedure]
- B1IssuedProductionOrderIntegrator.Send(): Orquestra três operações sequenciais: cadastro de produtos, salvamento de movimentações e baixa automática.
- IntegraProdutosDeOrdensAsync(): Extrai códigos de produtos únicos (insumos/componentes) das ordens, identifica quais são novos e cadastra-os no WMS.
- SaveMovementsAsync(): Salva as movimentações
OrderImportno WMS, registraIntegrationTrackingpara cada operação e atualiza o cursor. - ExecutaBaixaAutomatica(): Busca pedidos em status
Liberadocom operaçãoSaidaSegregadoe suboperação17(PRODUÇÃO). Para cada pedido, executa a stored procedureStpWmsOperProcessaBaixaAutomaticaque finaliza a movimentação de estoque no WMS.
Resumo do Funcionamento
- Busca incremental: Utiliza cursor baseado em
ClosingDate(tipoIssuedProductionOrderImport), independente do cursor de entrada de produto acabado. - Consulta N+1: As transações de saída são consultadas individualmente por ordem de produção, adequado para o volume potencialmente alto de insumos por OP.
- Filtragem inteligente de lotes: Transações são agrupadas por
BaseLine; se há lotes no grupo, apenas transações com lote são utilizadas, evitando duplicação de quantidade. - Cadastro automático de produtos: Insumos/componentes novos são cadastrados automaticamente no WMS.
- Baixa automática: Após o salvamento, pedidos de saída em status
Liberadosão finalizados via stored procedure, completando o ciclo de movimentação. - 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 na baixa automática geram logs de erro para análise.