Saltar al contenido principal

Exportação de Saídas Segregadas Processadas — Faturamento de Saídas Segregadas no SAP B1

📌 Descrição do Processo

A exportação de saídas segregadas processadas representa o fluxo de faturamento de saídas segregadas do WMS para o SAP B1. O WMS identifica pedidos de saída segregada já movimentados e não notificados, enquanto o SAP B1 recebe as notas fiscais (Invoices) correspondentes, vinculadas ao pedido de venda original.

A integração garante que as saídas segregadas processadas no WMS sejam automaticamente faturadas no SAP B1, com criação de nota fiscal vinculada ao pedido de venda original, conclusão do pedido no WMS e rastreabilidade completa via IntegrationTracking.

Importante

Este processo utiliza o padrão pooling — busca periodicamente pedidos de saída segregada movimentados e ainda não notificados ao ERP. Cada nota fiscal é vinculada ao pedido de venda original no SAP B1 via BaseEntry/BaseLine. Lotes do tipo LOTE UNICO são filtrados automaticamente. A integração também busca o SystemSerialNumber de cada lote no SAP B1 antes do envio.


🔄 Fluxo de Exportação

  1. Identificação de Saídas Segregadas Processadas no WMS (Query)

    • O WMS consulta pedidos com operação SaidaSegregado, status Movimentado, que possuem referência ao SAP B1 (CodPedidoPolo).
    • Apenas pedidos que já foram importados (SegregatedExitsImport) mas ainda não foram exportados (SegregatedExitsReturn) são selecionados.
    • Para cada pedido, o WMS busca os dados do pedido de venda original no SAP B1 via /Orders, além de informações de itens (InventoryUOM) e unidades de medida.
  2. Montagem das Requisições de Faturamento (Parse)

    • Os itens do pedido WMS são agrupados por CodProduto, IdLoteClassificacao e código de produto relacionado.
    • Cada grupo é convertido em uma linha da nota fiscal (B1InvoiceCreateRequest), com BaseEntry e BaseLine vinculando ao pedido de venda original.
    • Lotes LOTE UNICO são filtrados. Para lotes reais, o SystemSerialNumber é obtido do endpoint BatchNumberDetails do SAP B1.
    • A unidade de medida é determinada pela prioridade: InventoryUOM do item → UoMEntry da linha original → fallback 6 (KG).
  3. Envio das Notas Fiscais ao SAP B1 (Send)

    • As notas fiscais são enviadas via POST /Invoices ao SAP B1, processadas em chunks paralelos de 5.
    • Para cada nota criada com sucesso, o pedido correspondente é concluído no WMS.
    • Os dados da nota fiscal (número sequencial, data, valor) são salvos como PedidoTitulo no WMS.
  4. Registro de Auditoria

    • Cada operação (sucesso ou falha) é registrada na tabela IntegrationTracking com tipo SegregatedExitsReturn, incluindo request e response serializados.

🖥️ APIs Envolvidas

  • WMS → SAP B1 (GET)

    • /Orders?$filter=DocNum eq {docNum} → recupera as linhas do pedido de venda original, incluindo DocEntry, LineNum, UnitPrice, UoMEntry, TaxCode, CFOPCode e informações de warehouse.
    • /Items → consulta detalhes dos itens para obter InventoryUOM (unidade de medida de inventário).
    • /UnitOfMeasurements → consulta todas as unidades de medida para mapear código UoM para AbsEntry.
    • /BatchNumberDetails?$filter=(ItemCode eq '{itemCode}' and Batch eq '{batch}') or ... → consulta o SystemSerialNumber de cada lote.
  • WMS → SAP B1 (POST)

    • /Invoices → cria nota fiscal (A/R Invoice) no SAP B1 com linhas vinculadas ao pedido de venda original via BaseEntry/BaseLine (tipo SalesOrder). Retorna DocEntry, DocNum, SequenceSerial, DocDate.

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

Cenário:

  • Cliente: AutoPeças Brasil Ltda. (C00180)
  • Pedido WMS: #87010, referência no SAP B1: DocNum 61200
  • Produto: PA-456 – Amortecedor Dianteiro (20 unidades, lote LT-2026-050)
  • Depósito segregado: 01.05
  • Valor unitário: R$ 85,00
  • Volumes: 4

1. Pedido de Venda Original no SAP B1

{
"DocEntry": 61200,
"DocNum": 61200,
"CardCode": "C00180",
"CardName": "AutoPeças Brasil Ltda.",
"DocumentLines": [
{
"LineNum": 0,
"ItemCode": "PA-456",
"ItemDescription": "Amortecedor Dianteiro",
"Quantity": 20,
"UnitPrice": 85.00,
"TaxCode": "ICMS-002",
"CFOPCode": "5101",
"WarehouseCode": "01.05",
"UoMEntry": 3
}
]
}

2. Nota Fiscal Criada no SAP B1

{
"DocEntry": 72300,
"DocNum": 72300,
"SequenceSerial": 201,
"DocDate": "2026-03-27",
"CardCode": "C00180",
"NumAtCard": "87010",
"Comments": "Saída segregada processada pelo WMS - Pedido 87010",
"TaxExtension": {
"PackQuantity": 4
},
"DocumentLines": [
{
"ItemCode": "PA-456",
"InventoryQuantity": 20,
"UnitPrice": 85.00,
"WarehouseCode": "01.05",
"BaseType": 17,
"BaseEntry": 61200,
"BaseLine": 0,
"UoMEntry": 3,
"BatchNumbers": [
{
"BatchNumber": "LT-2026-050",
"Quantity": 20,
"ItemCode": "PA-456",
"SystemSerialNumber": 78
}
]
}
]
}

3. Resultado no WMS

  • Pedido #87010 foi concluído (status atualizado para finalizado).
  • Registro de PedidoTitulo criado: número da NF 201, data 2026-03-27, código polo 72300, valor total R$ 1.700,00.
  • IntegrationTracking registrado com tipo SegregatedExitsReturn, ExternalId = "72300" e RelatedId = 87010.

✅ Regras de Negócio

  • Apenas pedidos com operação SaidaSegregado, status Movimentado e CodPedidoPolo preenchido são processados.
  • O pedido deve ter um IntegrationTracking de sucesso com tipo SegregatedExitsImport (já importado) e não ter um de tipo SegregatedExitsReturn (ainda não exportado).
  • Os itens do pedido são agrupados por CodProduto, IdLoteClassificacao e código de produto relacionado, consolidando quantidades por classificação em uma única linha de invoice.
  • Cada linha da nota fiscal é vinculada à linha original do pedido de venda no SAP B1 via BaseEntry e BaseLine (tipo SalesOrder).
  • Lotes com nome LOTE UNICO são filtrados e não incluídos nos BatchNumbers da nota fiscal.
  • Para lotes reais, o SystemSerialNumber é obtido do endpoint BatchNumberDetails do SAP B1 antes do envio.
  • A unidade de medida (UoMEntry) segue a prioridade: InventoryUOM do item (convertido via tabela de UoM) → UoMEntry da linha original do pedido → fallback 6 (KG).
  • O campo TaxExtension.PackQuantity é preenchido com a contagem de volumes do pedido WMS.
  • Os parâmetros SequenceCode e BplIdAssignedToInvoice são configuráveis via parâmetros de integração B1.
  • Após a criação bem-sucedida da nota fiscal, o pedido é concluído no WMS automaticamente.
  • Os dados da nota fiscal (número sequencial, data, DocNum, valor total) são persistidos como PedidoTitulo no WMS.
  • Em caso de falha no envio de uma nota fiscal, o erro é logado e o processamento continua para as próximas notas (falha não interrompe o lote).
  • Cada operação (sucesso ou falha) gera um registro de IntegrationTracking com tipo SegregatedExitsReturn.

Resumo

Esse fluxo garante que as saídas segregadas processadas no WMS sejam automaticamente faturadas no SAP B1 com criação de nota fiscal vinculada ao pedido de venda original, conclusão do pedido e rastreabilidade completa, mantendo ambos os sistemas sincronizados no ciclo de saída segregada.


⚙️ Especificações Técnicas

Fluxo de execução

  • Query: Consulta pedidos de saída segregada movimentados e não notificados no WMS, enriquecendo com dados do pedido de venda original, itens e unidades de medida do SAP B1.
  • Parse: Agrupa itens por produto e classificação, constrói requisições de nota fiscal (B1InvoiceCreateRequest) com vinculação ao pedido original, determina UoM e busca SystemSerialNumber dos lotes.
  • Send: Envia notas fiscais ao SAP B1, conclui os pedidos no WMS, salva os dados da NF como PedidoTitulo e registra auditoria no IntegrationTracking.

Detalhamento das Etapas

Query

B1ProcessedSegregatedExitsIntegrator.Query()
└── B1ProcessedSegregatedExitsService.GetProcessedSegregatedExitsAsync()
├── ErpIntegrationsService.GetErpToIntegrateAsync(EDefIntegration.B1)
└── [Para cada integração ERP B1]
├── OrderIntegrationService.GetErpProcessedSegregatedExitsAsync(erpId)
│ └── PedidoRepository.FindProcessedSegregatedExitsAsync(erpId)
├── B1OrderConnector.GetOrderByDocNumAsync(codPedidoPolo) [por pedido]
├── B1ItemConnector.GetItemsAsync(itemCodes)
└── B1UoMConnector.GetAllUnitOfMeasurementsAsync()
  • B1ProcessedSegregatedExitsIntegrator.Query(): Ponto de entrada — delega a busca ao serviço.
  • PedidoRepository.FindProcessedSegregatedExitsAsync(): Consulta pedidos com operação SaidaSegregado, status Movimentado, com tracking de importação mas sem tracking de exportação.
  • B1OrderConnector.GetOrderByDocNumAsync(): Para cada pedido, busca as linhas do pedido de venda original no SAP B1 (preços, TaxCode, CFOPCode, UoMEntry).
  • B1ItemConnector.GetItemsAsync(): Busca InventoryUOM para todos os itens únicos das ordens.
  • B1UoMConnector.GetAllUnitOfMeasurementsAsync(): Carrega o dicionário de código UoM → AbsEntry.

Parse

B1ProcessedSegregatedExitsIntegrator.Parse()
└── B1ProcessedSegregatedExitsService.ParseSegregatedExitsToB1Async()
├── [Agrupamento de itens por CodProduto + IdLoteClassificacao + CodProdutoRel]
├── [Montagem de B1InvoiceCreateRequest com BaseEntry/BaseLine]
├── [Determinação de UoMEntry: InventoryUOM → UoMEntry original → fallback 6]
├── [Filtragem de lotes LOTE UNICO]
└── B1BatchNumberDetailsConnector.GetBatchesSystemSerialNumbers(batches)
  • ParseSegregatedExitsToB1Async(): Orquestra toda a transformação:
    1. Agrupa itens do pedido WMS por produto e classificação de lote.
    2. Cria linhas de invoice com BaseEntry/BaseLine vinculando ao pedido de venda original no SAP B1.
    3. Filtra lotes LOTE UNICO dos BatchNumbers.
    4. Determina a unidade de medida com lógica de prioridade (item UoM → linha original → fallback).
    5. Busca SystemSerialNumber para todos os lotes reais via BatchNumberDetails.

Send

B1ProcessedSegregatedExitsIntegrator.Send()
└── [Para cada integração ERP]
├── B1ProcessedSegregatedExitsService.SendInvoicesToB1Async()
│ └── [Chunks de 5 invoices em paralelo]
│ ├── B1InvoiceConnector.CreateInvoiceAsync(request)
│ ├── ConcludeOrderService.ConcludeOrderAsync(codPedido)
│ └── B1CommonInvoiceService.SaveOrderInvoicesAsync()
│ └── PedidoTituloService.SavePedidoTitulosAsync()

└── B1ProcessedSegregatedExitsService.SaveIntegrationTrackingsAsync()
└── OrderIntegrationService.SaveOrderIntegrationTrackingsAsync()
└── IntegrationTrackingRepository.AddRangeAsync()
  • SendInvoicesToB1Async(): Envia notas fiscais ao SAP B1 em chunks paralelos de 5 via POST /Invoices. Para cada nota criada com sucesso, conclui o pedido no WMS e salva os dados da NF como PedidoTitulo.
  • ConcludeOrderService.ConcludeOrderAsync(): Conclui no WMS os pedidos cujas notas foram criadas com sucesso no SAP B1.
  • B1CommonInvoiceService.SaveOrderInvoicesAsync(): Persiste os dados da NF no WMS como PedidoTitulo (número sequencial, data, DocNum, valor total).
  • SaveIntegrationTrackingsAsync(): Salva registros de IntegrationTracking com tipo SegregatedExitsReturn, request/response serializados, ExternalId = DocEntry da NF e RelatedId = código do pedido.

Resumo do Funcionamento

  • Busca seletiva: Apenas pedidos de saída segregada já movimentados, importados e ainda não exportados são processados, garantindo idempotência.
  • Vinculação com pedido original: Cada linha da NF referencia a linha original do pedido de venda no SAP B1 via BaseEntry/BaseLine (tipo SalesOrder), garantindo rastreabilidade contábil.
  • Consolidação de itens: Itens são agrupados por produto e classificação de lote, consolidando quantidades em linhas únicas de invoice.
  • Resolução de UoM: Unidade de medida é determinada com lógica de prioridade em três níveis, garantindo compatibilidade com o SAP B1.
  • Processamento paralelo: Notas fiscais são enviadas ao SAP B1 em chunks de 5 para otimizar throughput.
  • Conclusão automática: Pedidos faturados com sucesso são automaticamente concluídos no WMS.
  • Persistência de NF: Dados da nota fiscal são salvos como PedidoTitulo, vinculando pedido WMS ao documento fiscal do SAP B1.
  • Rastreabilidade completa: Cada operação gera um IntegrationTracking com tipo SegregatedExitsReturn, armazenando request e response completos.
  • Tratamento de erros: Falhas no envio de uma nota fiscal são logadas e não interrompem o processamento das demais. Cada falha é registrada no IntegrationTracking com o erro serializado.