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.
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
-
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.
-
Consulta de Dados Complementares no SAP B1
- Para cada pedido, o WMS busca as linhas do pedido original no SAP B1 via
/Orders, obtendoDocEntry,LineNum,TaxCode,CFOPCodee informações de adiantamento (down payment). - Quando há lotes, o WMS consulta a view
SD_STOCK_POSITIONS_HOMpara obter oSystemSerialNumberde cada lote.
- Para cada pedido, o WMS busca as linhas do pedido original no SAP B1 via
-
Montagem das Requisições de Faturamento (Parse)
- Os dados do pedido WMS são convertidos para
B1InvoiceCreateRequestvia AutoMapper. - Cada linha da nota fiscal recebe
BaseEntryeBaseLinevinculando-a à linha original do pedido no SAP B1. - Informações de lote, adiantamento e dados fiscais são preenchidos nas linhas.
- Os dados do pedido WMS são convertidos para
-
Envio das Notas Fiscais ao SAP B1
- As notas fiscais são enviadas via
POST /Invoicesao 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.
- As notas fiscais são enviadas via
-
Registro de Auditoria
- Cada operação (sucesso ou falha) é registrada na tabela
IntegrationTrackingcom o request, response,ExternalId(DocEntry do B1) eRelatedId(código do pedido no WMS).
- Cada operação (sucesso ou falha) é registrada na tabela
🖥️ APIs Envolvidas
-
WMS → SAP B1 (GET)
/Orders?$filter=DocNum eq {docNum}→ recupera as linhas do pedido de venda original, incluindoDocEntry,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 oSystemSerialNumber(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 viaBaseEntry/BaseLine. RetornaDocEntry,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, loteLT-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
PedidoTitulocriado: número da NF158, data2026-03-26, código polo70100, valor totalR$ 1.500,00. IntegrationTrackingregistrado comExternalId = "70100"eRelatedId = 85001.
✅ Regras de Negócio
- Apenas pedidos com itens separados e não notificados ao ERP são processados (
ItensSeparadosNaoNotificados). - Pedidos sem
Entidade.EntidadeRelacionadaválida ou semCodPedidoPolosão ignorados durante o parse. - Cada linha da nota fiscal deve estar vinculada à linha original do pedido no SAP B1 via
BaseEntryeBaseLine. - 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 oSystemSerialNumberobtido da viewSD_STOCK_POSITIONS_HOMdo 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
PedidoTitulono 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
IntegrationTrackingcom tipoInvoiceCreation. - A criação de Pick Lists é suportada mas está desabilitada por padrão (
UsesPickList = false).
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
PedidoTituloe registra auditoria noIntegrationTracking.
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:
- Filtra pedidos válidos (com entidade relacionada e código polo).
- Consulta as linhas do pedido original no SAP B1 para obter
DocEntry,LineNum,TaxCode,CFOPCode. - Converte via AutoMapper para
B1InvoiceCreateRequest, preenchendoBaseEntry/BaseLine. - Busca
SystemSerialNumberde lotes na viewSD_STOCK_POSITIONS_HOM. - 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
IntegrationTrackingcom request/response serializados,ExternalId= DocEntry da NF eRelatedId= 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
IntegrationTrackingcom tipoInvoiceCreation, 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
IntegrationTrackingcom o erro serializado.