Pular para o conteúdo principal

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.

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. 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

  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.
    • O cursor utilizado é independente do integrador de entrada de produto acabado (IssuedProductionOrderImport).
  2. 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_HOM para 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.
  3. 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 OrderImport com operação SaidaSegregado e suboperação PRODUÇÃO.
  4. 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 IntegrationTracking são criados e o cursor é atualizado.
  5. Execução de Baixa Automática

    • Após o salvamento, o sistema busca pedidos em status Liberado com operação SaidaSegregado e suboperação PRODUÇÃO.
    • Para cada pedido encontrado, executa a stored procedure StpWmsOperProcessaBaixaAutomatica, que finaliza a movimentação de estoque 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.
    • /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, AbsoluteEntry 60800
  • Produto acabado: PA-789 – Bateria 60Ah
  • Insumo consumido: MP-001 – Placa de Chumbo (100 unidades, lote LT-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 SaidaSegregado e suboperação PRODUÇÃO.
  • Item MP-001: lote LT-MP-2026-010, 100 unidades, classificação LIBERADO.
  • Item MP-002: lote LOTE UNICO (sem lote no B1), 25 unidades, classificação LIBERADO.
  • Produtos MP-001 e MP-002 cadastrados automaticamente (caso não existissem no WMS).
  • IntegrationTracking registrado com tipo IssuedProductionOrderImport.
  • Baixa automática executada — pedido finalizado via StpWmsOperProcessaBaixaAutomatica.

✅ 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, 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 > 0 e BaseLine preenchido 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-se LOTE UNICO.
  • A RelatedOriginClassification é null para 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 endpoint BatchNumberDetails do SAP B1.
  • Após o salvamento, a baixa automática é executada para pedidos com status Liberado, operação SaidaSegregado e suboperação código 17 (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 IntegrationTracking para rastreabilidade completa.

Resumo

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 em ClosingDate (tipo IssuedProductionOrderImport).
  • Parse: Filtra ordens novas, busca transações de saída na view SD_INVENTORY_TRANSATIONS_HOM (padrão N+1), agrupa por BaseLine com filtragem de lotes, enriquece com BatchNumberDetails e converte para objetos OrderImport.
  • Send: Cadastra produtos novos no WMS, salva as movimentações de saída, atualiza o cursor, registra IntegrationTracking e 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 IssuedProductionOrderImport 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 (independente do cursor de entrada de PA) e consulta o conector.
  • B1CompletedOrderProductionConnector.GetFinishedProductionOrdersAsync(): Executa a chamada ao SAP B1 ServiceLayer no endpoint ProductionOrders com filtro boposClosed e ClosingDate >= 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 ParseMovementsFromInventoryDocsAsync com operação SaidaSegregado.
  • GetIssuedProductsInfosAsync(): Consulta transações de saída na view SD_INVENTORY_TRANSATIONS_HOM com Tipo = '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 cria OrderImport com suboperação PRODUÇÃO (código 17) e RelatedOriginClassification = 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 OrderImport no WMS, registra IntegrationTracking para cada operação e atualiza o cursor.
  • ExecutaBaixaAutomatica(): Busca pedidos em status Liberado com operação SaidaSegregado e suboperação 17 (PRODUÇÃO). Para cada pedido, executa a stored procedure StpWmsOperProcessaBaixaAutomatica que finaliza a movimentação de estoque no WMS.

Resumo do Funcionamento

  • Busca incremental: Utiliza cursor baseado em ClosingDate (tipo IssuedProductionOrderImport), 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 Liberado sã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.