Saltar al contenido principal

Exportação de Pedidos Processados — Faturamento no SAP B1

📌 Descrição do Processo

A exportação de pedidos processados representa o fluxo de faturamento de pedidos de saída do WMS para o SAP B1. O WMS identifica pedidos já separados e não notificados, enquanto o SAP B1 recebe as notas fiscais (Invoices) correspondentes, concluindo o ciclo do pedido de venda.

A integração garante que os pedidos separados no WMS sejam automaticamente faturados no SAP B1, com criação de nota fiscal, conclusão do pedido no WMS e rastreabilidade completa via IntegrationTracking.

Importante

Este processo utiliza o padrão pooling — busca periodicamente pedidos processados ainda não notificados. A integração suporta opcionalmente a criação de Pick Lists no SAP B1 antes do faturamento (desabilitado por padrão). Cada operação (criação de nota fiscal, conclusão de pedido) é registrada individualmente na tabela de auditoria IntegrationTracking.


🔄 Fluxo de Exportação

  1. Identificação de Pedidos Processados no WMS

    • O WMS consulta os pedidos já separados e ainda não notificados ao ERP, agrupados por configuração de integração B1 ativa.
    • Apenas pedidos com itens separados (ItensSeparadosNaoNotificados) são considerados.
  2. Consulta de Dados Complementares no SAP B1

    • Para cada pedido, o WMS busca as linhas do pedido original no SAP B1 via /Orders, obtendo DocEntry, LineNum, TaxCode, CFOPCode e informações de adiantamento (down payment).
    • Quando há lotes, o WMS consulta a view SD_STOCK_POSITIONS_HOM para obter o SystemSerialNumber de cada lote.
  3. Montagem das Requisições de Faturamento (Parse)

    • Os dados do pedido WMS são convertidos para B1InvoiceCreateRequest via AutoMapper.
    • Cada linha da nota fiscal recebe BaseEntry e BaseLine vinculando-a à linha original do pedido no SAP B1.
    • Informações de lote, adiantamento e dados fiscais são preenchidos nas linhas.
  4. Envio das Notas Fiscais ao SAP B1

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

    • Cada operação (sucesso ou falha) é registrada na tabela IntegrationTracking com o request, response, ExternalId (DocEntry do B1) e RelatedId (código do pedido no WMS).

🖥️ APIs Envolvidas

  • WMS → SAP B1 (GET)

    • /Orders?$filter=DocNum eq {docNum} → recupera as linhas do pedido de venda original, incluindo DocEntry, LineNum, TaxCode, CFOPCode, dados de adiantamento (U_DownPayDocEntry, U_DownPayAmount) e informações de warehouse.
    • /SD_STOCK_POSITIONS_HOM?$filter=ItemCode eq '{itemCode}' and DistNumber eq '{batchNumber}' and WhsCode eq '{warehouse}' → consulta posições de estoque para obter o SystemSerialNumber (número serial do sistema) 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. Retorna DocEntry, DocNum, SequenceSerial, DocDate.
  • WMS → SAP B1 (POST/PATCH) — opcional, desabilitado por padrão

    • /PickLists → cria pick list no SAP B1 associada ao pedido.
    • /PickLists({pickListId}) → atualiza pick list com quantidades separadas e lotes.

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

Cenário:

  • Cliente: Distribuidora XYZ S.A. (C00250)
  • Pedido WMS: #85001, referência no SAP B1: DocNum 60500
  • Produto: PA-789 – Bateria 60Ah (10 unidades, lote LT-2026-001)
  • Valor unitário: R$ 150,00

1. Pedido de Venda no SAP B1

{
"DocEntry": 60500,
"DocNum": 60500,
"CardCode": "C00250",
"CardName": "Distribuidora XYZ S.A.",
"DocumentLines": [
{
"LineNum": 0,
"ItemCode": "PA-789",
"ItemDescription": "Bateria 60Ah",
"Quantity": 10,
"UnitPrice": 150.00,
"TaxCode": "ICMS-001",
"CFOPCode": "5102",
"WarehouseCode": "WH01"
}
]
}

2. Nota Fiscal Criada no SAP B1

{
"DocEntry": 70100,
"DocNum": 70100,
"SequenceSerial": 158,
"DocDate": "2026-03-26",
"CardCode": "C00250",
"NumAtCard": "85001",
"DocumentLines": [
{
"ItemCode": "PA-789",
"Quantity": 10,
"Price": 150.00,
"BaseEntry": 60500,
"BaseLine": 0,
"TaxCode": "ICMS-001",
"CFOPCode": "5102",
"WarehouseCode": "WH01",
"BatchNumbers": [
{
"BatchNumber": "LT-2026-001",
"Quantity": 10,
"SystemSerialNumber": 42
}
]
}
]
}

3. Resultado no WMS

  • Pedido #85001 foi concluído (status atualizado para finalizado).
  • Registro de PedidoTitulo criado: número da NF 158, data 2026-03-26, código polo 70100, valor total R$ 1.500,00.
  • IntegrationTracking registrado com ExternalId = "70100" e RelatedId = 85001.

✅ Regras de Negócio

  • Apenas pedidos com itens separados e não notificados ao ERP são processados (ItensSeparadosNaoNotificados).
  • Pedidos sem Entidade.EntidadeRelacionada válida ou sem CodPedidoPolo são ignorados durante o parse.
  • Cada linha da nota fiscal deve estar vinculada à linha original do pedido no SAP B1 via BaseEntry e BaseLine.
  • Apenas produtos com prefixos válidos configurados nos parâmetros B1 são incluídos nas linhas da nota fiscal.
  • Se o pedido original possui informações de adiantamento (U_DownPayDocEntry, U_DownPayAmount), esses dados são incluídos na nota fiscal.
  • Lotes (BatchNumbers) incluem o SystemSerialNumber obtido da view SD_STOCK_POSITIONS_HOM do SAP 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 na conclusão de pedidos, o sistema registra log de warning para análise.
  • Em caso de falha ao salvar a NF (CodTitulo <= 0), o sistema registra log de warning individual.
  • Cada operação (sucesso ou falha) gera um registro de IntegrationTracking com tipo InvoiceCreation.
  • A criação de Pick Lists é suportada mas está desabilitada por padrão (UsesPickList = false).

Resumo

Esse fluxo garante que os pedidos separados no WMS sejam automaticamente faturados no SAP B1 com criação de nota fiscal, conclusão do pedido e rastreabilidade completa, mantendo ambos os sistemas sincronizados no ciclo de venda.


⚙️ Especificações Técnicas

Fluxo de execução

  • Query: Consulta pedidos processados e não notificados no WMS, agrupados por integração ERP B1 ativa.
  • Parse: Busca dados complementares no SAP B1 (linhas do pedido, lotes) e converte os pedidos WMS para requisições de nota fiscal (B1InvoiceCreateRequest).
  • 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

B1ProcessedOrderIntegrator.Query()
└── B1OrderProcessorService.GetProcessedOrdersAsync()
├── ErpIntegrationsService.GetErpToIntegrateAsync(EDefIntegration.B1)
└── OrderIntegrationService.GetErpProcessedOrdersAsync(erpIntegrationId)
└── PedidoRepository.FindItensSeparadosNaoNotificados(erpIntegrationId)
  • B1ProcessedOrderIntegrator.Query(): Ponto de entrada — delega a busca de pedidos processados ao serviço.
  • B1OrderProcessorService.GetProcessedOrdersAsync(): Para cada integração ERP B1 ativa, busca pedidos separados e não notificados, retornando uma lista de ProcessedOrdersByIntegration.
  • PedidoRepository.FindItensSeparadosNaoNotificados(): Consulta no banco de dados os pedidos com itens separados que ainda não foram notificados ao ERP.

Parse

B1ProcessedOrderIntegrator.Parse()
└── B1OrderParseService.ParsePickedOrdersAsync()
├── B1OrderConnector.GetOrderLinesAsync(poloCode)
├── AutoMapper: Pedido → B1InvoiceCreateRequest
└── B1ViewConnector.GetAllObjectsAsync<BatchViewItem>("SD_STOCK_POSITIONS_HOM")
  • B1ProcessedOrderIntegrator.Parse(): Itera sobre cada grupo de pedidos por integração, filtrando grupos sem pedidos.
  • B1OrderParseService.ParsePickedOrdersAsync(): Orquestra toda a transformação:
    1. Filtra pedidos válidos (com entidade relacionada e código polo).
    2. Consulta as linhas do pedido original no SAP B1 para obter DocEntry, LineNum, TaxCode, CFOPCode.
    3. Converte via AutoMapper para B1InvoiceCreateRequest, preenchendo BaseEntry/BaseLine.
    4. Busca SystemSerialNumber de lotes na view SD_STOCK_POSITIONS_HOM.
    5. Monta dicionários de requisições de invoice (e opcionalmente pick list).

Send

B1ProcessedOrderIntegrator.Send()
├── [Opcional] B1PickListService.SendOrderPickListsToB1Async()
│ ├── B1OrderConnector.GetOrderLinesAsync()
│ └── B1PickListConnector.CreatePickListsAsync()

└── B1InvoiceService.SendInvoicesToB1Async()
│ └── B1InvoiceConnector.CreateInvoiceAsync()

├── ConcludeOrderService.ConcludeOrderAsync()
│ └── PedidoRepository.ConcludeOrderAsync()

├── B1CommonInvoiceService.SaveOrderInvoicesAsync()
│ └── PedidoTituloService.SavePedidoTitulosAsync()

└── OrderIntegrationService.SaveOrderIntegrationTrackingsAsync()
└── IntegrationTrackingRepository.AddRangeAsync()
  • B1ProcessedOrderIntegrator.Send(): Orquestra o envio — para cada grupo de pedidos, envia pick lists (se habilitado) e depois notas fiscais.
  • B1InvoiceService.SendInvoicesToB1Async(): Envia notas fiscais ao SAP B1 em chunks paralelos de 5 via POST /Invoices.
  • ConcludeOrderService.ConcludeOrderAsync(): Conclui no WMS os pedidos cujas notas foram criadas com sucesso no B1.
  • B1CommonInvoiceService.SaveOrderInvoicesAsync(): Persiste os dados da NF no WMS como PedidoTitulo (número sequencial, data, DocNum, valor total).
  • OrderIntegrationService.SaveOrderIntegrationTrackingsAsync(): Salva registros de IntegrationTracking com request/response serializados, ExternalId = DocEntry da NF e RelatedId = código do pedido.

Resumo do Funcionamento

  • Busca incremental: Apenas pedidos separados e ainda não notificados ao ERP são processados, evitando reprocessamento.
  • Vinculação com pedido original: Cada linha da NF referencia a linha original do pedido no SAP B1 via BaseEntry/BaseLine, garantindo rastreabilidade contábil.
  • 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 B1.
  • Rastreabilidade completa: Cada operação gera um IntegrationTracking com tipo InvoiceCreation, armazenando request e response completos.
  • Tratamento de erros: Falhas na conclusão de pedidos e no salvamento de NF geram logs de warning. Falhas no envio da NF são registradas no IntegrationTracking com o erro serializado.