Exportação de Notas de Crédito Processadas — Devolução ao SAP B1
📌 Descrição do Processo
A exportação de notas de crédito processadas representa o fluxo de devolução de mercadorias do WMS para o SAP B1. O WMS identifica pedidos de devolução já movimentados e ainda não retornados ao ERP, enquanto o SAP B1 recebe as notas de crédito (CreditNotes) correspondentes, concretizando a devolução no módulo fiscal/financeiro.
A integração garante que as devoluções processadas no WMS sejam automaticamente registradas como notas de crédito no SAP B1, incluindo produtos, quantidades, lotes e dados fiscais, com conclusão automática do pedido e rastreabilidade completa via IntegrationTracking.
Este processo utiliza o padrão pooling — busca periodicamente pedidos de devolução já movimentados. A integração opera sobre rascunhos (Drafts) do tipo oCreditNotes previamente importados do SAP B1 para o WMS. A prevenção de duplicidade é feita via verificação de IntegrationTracking: apenas pedidos com tracking de importação (OrderReturnRequestImport) bem-sucedido e sem tracking de retorno (OrderReturnRequestReturn) são processados.
🔄 Fluxo de Exportação
-
Identificação de Devoluções Processadas no WMS
- O WMS consulta pedidos com status
Movimentado, operaçãoEntradae sub-operaçãoDevolucaoEntrada, agrupados por integração ERP B1 ativa. - Apenas pedidos que possuem tracking de importação (
OrderReturnRequestImport) bem-sucedido e que não possuem tracking de retorno (OrderReturnRequestReturn) são selecionados. - Para cada pedido, o rascunho original (
Draftdo tipooCreditNotes) é recuperado do SAP B1 viaCodPedidoPolo(que corresponde aoDocEntrydo rascunho). - Os movimentos de inventário confirmados são carregados, junto com o mapeamento de códigos de produto WMS → SAP B1.
- O WMS consulta pedidos com status
-
Montagem das Requisições de Nota de Crédito (Parse)
- Os movimentos confirmados do tipo
ColocarQuantidadeLogicamentesão agrupados por produto e endereço de armazenagem. - Para cada grupo, uma linha de documento (
DocumentLine) é criada comItemCode,InventoryQuantity,UnitPrice,WarehouseCode,TaxCode,CFOPCode,BaseEntryeBaseLine— obtidos do rascunho original no SAP B1. - Lotes (
BatchNumbers) são mapeados a partir dos movimentos, incluindoBatchNumber, quantidade, datas de admissão e validade. - O request final (
B1CreditNoteCreateRequest) é montado via AutoMapper a partir do rascunho, comDocDueDatedefinido como hoje + 15 dias eCommentsindicando o pedido WMS de origem.
- Os movimentos confirmados do tipo
-
Envio das Notas de Crédito ao SAP B1
- Cada nota de crédito é enviada individualmente via
POST /CreditNotesao SAP B1. - Para cada nota criada com sucesso, o pedido correspondente é concluído no WMS e o rascunho original é marcado como processado no SAP B1.
- Cada nota de crédito é enviada individualmente via
-
Registro de Auditoria
- Cada operação (sucesso ou falha) é registrada na tabela
IntegrationTrackingcom tipoOrderReturnRequestReturn, armazenando request, response,ExternalId(DocEntry da nota de crédito no B1) eRelatedId(código do pedido no WMS).
- Cada operação (sucesso ou falha) é registrada na tabela
🖥️ APIs Envolvidas
-
WMS → SAP B1 (GET)
/Drafts({docEntry})→ recupera o rascunho original da nota de crédito (oCreditNotes) comDocumentLines,BatchNumbers, dados fiscais e referências de documento.
-
WMS → SAP B1 (POST)
/CreditNotes→ cria nota de crédito definitiva no SAP B1, com linhas vinculadas ao documento base viaBaseEntry/BaseLine. RetornaDocEntryeDocNum.
-
WMS → SAP B1 (PATCH)
/Drafts({docEntry})→ marca o rascunho como processado após criação bem-sucedida da nota de crédito.
📦 Exemplo de Exportação (Objeto Fictício)
Cenário:
- Fornecedor: AutoPeças Brasil Ltda. (
C00150) - Pedido de devolução WMS: #92010, referência no SAP B1 (Draft): DocEntry 60300
- Produto devolvido:
PA-789 – Bateria 60Ah(15 unidades, loteLT-2026-050) - Valor unitário: R$ 150,00
1. Rascunho (Draft) no SAP B1
{
"DocEntry": 60300,
"DocNum": 70400,
"DocDate": "2026-03-20",
"CardCode": "C00150",
"CardName": "AutoPeças Brasil Ltda.",
"DocumentStatus": "bost_Open",
"SequenceSerial": 42,
"SequenceCode": 3,
"DocumentLines": [
{
"LineNum": 0,
"ItemCode": "PA-789",
"ItemDescription": "Bateria 60Ah",
"Quantity": 20,
"UnitPrice": 150.00,
"TaxCode": "ICMS-001",
"CFOPCode": "1202",
"WarehouseCode": "WH01",
"BaseType": 234,
"BaseEntry": 60250,
"BaseLine": 0,
"UoMEntry": 1
}
]
}
2. Nota de Crédito Enviada ao SAP B1
{
"CardCode": "C00150",
"DocDate": "2026-03-20",
"TaxDate": "2026-03-20",
"DocDueDate": "2026-04-10",
"Comments": "WMS: Devolução processada - Pedido 92010",
"SequenceSerial": 42,
"SequenceCode": 3,
"BPL_IDAssignedToInvoice": 1,
"DocumentLines": [
{
"ItemCode": "PA-789",
"InventoryQuantity": 15,
"UnitPrice": 150.00,
"TaxCode": "ICMS-001",
"CFOPCode": "1202",
"WarehouseCode": "WH01",
"BaseType": 234,
"BaseEntry": 60250,
"BaseLine": 0,
"UoMEntry": 1,
"BatchNumbers": [
{
"BatchNumber": "LT-2026-050",
"Quantity": 15,
"AddmisionDate": "2026-03-25",
"ExpiryDate": "2027-03-25",
"BaseLineNumber": 0,
"ItemCode": "PA-789"
}
]
}
]
}
3. Resultado
- SAP B1 retorna: DocEntry 71200, DocNum 71200.
- Pedido #92010 foi concluído no WMS.
- Rascunho DocEntry 60300 foi marcado como processado no SAP B1.
IntegrationTrackingregistrado comExternalId = "71200",RelatedId = 92010, tipoOrderReturnRequestReturn.
✅ Regras de Negócio
- Apenas pedidos com status
Movimentado, operaçãoEntradae sub-operaçãoDevolucaoEntradasão elegíveis. - O pedido deve possuir
CodPedidoPoloválido (correspondente aoDocEntrydo rascunho no SAP B1). - O pedido deve ter um tracking de importação (
OrderReturnRequestImport) bem-sucedido — indicando que a solicitação de devolução foi previamente importada do SAP B1. - O pedido não deve ter tracking de retorno (
OrderReturnRequestReturn) — evitando reprocessamento de devoluções já enviadas. - Apenas movimentos do tipo
ColocarQuantidadeLogicamentecom status confirmado são considerados para montar as linhas da nota de crédito. - Todos os produtos do pedido devem possuir mapeamento de código WMS → SAP B1 (
ProdutoRelacionado); caso contrário, o pedido é descartado no parse. - Os movimentos são agrupados por produto e endereço, consolidando quantidades na mesma linha de documento.
- O
WarehouseCodeda linha é obtido da classificação do endereço do movimento; caso não disponível, utiliza o valor do rascunho original. - Informações de lote (
BatchNumber, quantidade, datas de admissão e validade) são extraídas dos movimentos de inventário. DocDueDateé calculado como data atual + 15 dias.BPL_IDAssignedToInvoiceutiliza oDefaultBranchIddos parâmetros B1 da integração.- Após criação bem-sucedida da nota de crédito, o pedido é concluído no WMS e o rascunho é marcado como processado no SAP B1.
- Falhas individuais não bloqueiam o processamento dos demais pedidos do mesmo lote.
- Cada operação (sucesso ou falha) gera um registro de
IntegrationTrackingcom tipoOrderReturnRequestReturn.
Esse fluxo garante que as devoluções processadas no WMS sejam automaticamente registradas como notas de crédito no SAP B1, mantendo a consistência fiscal e de estoque entre ambos os sistemas, com rastreabilidade completa e prevenção de duplicidade.
⚙️ Especificações Técnicas
Fluxo de execução
- Query: Consulta pedidos de devolução movimentados e não retornados no WMS, recupera os rascunhos correspondentes no SAP B1, carrega movimentos de inventário confirmados e mapeamento de produtos.
- Parse: Agrupa movimentos por produto/endereço, monta as linhas da nota de crédito com lotes, e converte o rascunho do SAP B1 para
B1CreditNoteCreateRequestvia AutoMapper. - Send: Envia notas de crédito ao SAP B1, conclui pedidos no WMS, marca rascunhos como processados e registra auditoria no
IntegrationTracking.
Detalhamento das Etapas
Query
B1ProcessedCreditNotesIntegrator.Query()
└── B1ProcessedCreditNotesService.GetProcessedCreditNotesAsync()
├── ErpIntegrationsService.GetErpToIntegrateAsync(EDefIntegration.B1)
├── PedidoRepository.GetProcessedCreditNotesAsync(erpIntegrationId)
│ └── Filtros: Movimentado + Entrada + DevolucaoEntrada
│ + tem OrderReturnRequestImport (sucesso)
│ + não tem OrderReturnRequestReturn
├── B1DraftsConnector.GetDraftByKeyAsync<B1CreditNoteResponse>(docEntry)
├── InventarioRepository.GetConfirmedMovementsByPedidosAsync(codPedidos)
└── ProdutoRelacionadoRepository.GetAll() → mapeamento CodProduto → CodProdutoRel
- B1ProcessedCreditNotesIntegrator.Query(): Ponto de entrada — delega ao serviço de notas de crédito processadas.
- B1ProcessedCreditNotesService.GetProcessedCreditNotesAsync(): Para cada integração ERP B1 ativa, busca pedidos de devolução elegíveis, recupera os rascunhos do SAP B1, carrega os movimentos confirmados e o mapeamento de produtos. Retorna
List<ProcessedCreditNotesByIntegration>. - PedidoRepository.GetProcessedCreditNotesAsync(): Consulta EF Core com filtros de status, operação, sub-operação e validação de trackings existentes.
- B1DraftsConnector.GetDraftByKeyAsync():
GET /Drafts({docEntry})— recupera o rascunho completo com linhas, lotes e referências. - InventarioRepository.GetConfirmedMovementsByPedidosAsync(): Busca movimentos confirmados (tipo
ColocarQuantidadeLogicamente, status 3) agrupados por pedido.
Parse
B1ProcessedCreditNotesIntegrator.Parse()
└── B1ProcessedCreditNotesService.ParseToB1Async()
├── Filtra movimentos: apenas ColocarQuantidadeLogicamente
├── Valida mapeamento de produtos (WMS → B1)
├── Agrupa movimentos por (Produto + Endereço)
├── Monta DocumentLines com BatchNumbers
├── AutoMapper: B1CreditNoteResponse → B1CreditNoteCreateRequest
└── Define Comments, DocDueDate, BPL_IDAssignedToInvoice
- B1ProcessedCreditNotesIntegrator.Parse(): Delega toda a transformação ao serviço.
- B1ProcessedCreditNotesService.ParseToB1Async(): Para cada pedido de cada integração:
- Valida existência do rascunho e dos movimentos confirmados.
- Filtra movimentos do tipo
ColocarQuantidadeLogicamente. - Valida que todos os produtos possuem mapeamento B1 (descarta pedido se algum faltar).
- Agrupa movimentos por produto + endereço, consolidando quantidades.
- Cria
B1CreditNoteDocumentLinecom dados do rascunho (TaxCode,CFOPCode,BaseEntry,BaseLine,UoMEntry) e quantidades/lotes dos movimentos. - Converte rascunho para
B1CreditNoteCreateRequestvia AutoMapper, adicionandoCommentseDocDueDate. - Mantém mapeamento
CreditNoteToCodPedidopara rastreabilidade nas fases seguintes.
Send
B1ProcessedCreditNotesIntegrator.Send()
└── [Para cada integração com CreditNotes]
├── B1ProcessedCreditNotesService.SendCreditNotesToB1Async()
│ ├── B1CreditNoteConnector.CreateCreditNoteAsync() → POST /CreditNotes
│ ├── ConcludeOrderService.ConcludeOrderAsync() → Conclui pedido no WMS
│ └── B1DraftsConnector.MarkDraftAsProcessedAsync() → Marca rascunho como processado
│
└── B1ProcessedCreditNotesService.SaveIntegrationTrackingsAsync()
└── OrderIntegrationService.SaveOrderIntegrationTrackingsAsync()
└── IntegrationTrackingRepository.AddRangeAsync()
- B1ProcessedCreditNotesIntegrator.Send(): Itera sobre cada grupo de integração, trata exceções individualmente e loga contadores de sucesso/falha.
- B1ProcessedCreditNotesService.SendCreditNotesToB1Async(): Para cada nota de crédito, envia via
POST /CreditNotes. Em caso de sucesso: conclui o pedido no WMS e marca o rascunho como processado no B1. RetornaDictionary<int, Result<B1CreditNoteCreateResponse>>. - B1CreditNoteConnector.CreateCreditNoteAsync(): Envia a requisição HTTP
POST /CreditNotesao SAP B1 Service Layer e retornaResult<B1CreditNoteCreateResponse>comDocEntryeDocNum. - ConcludeOrderService.ConcludeOrderAsync(): Atualiza o status do pedido para concluído no banco do WMS.
- B1DraftsConnector.MarkDraftAsProcessedAsync(): Marca o rascunho original no SAP B1 com o número do documento gerado.
- B1ProcessedCreditNotesService.SaveIntegrationTrackingsAsync(): Monta
IntegrationUpdateResultpara cada operação e persiste viaOrderIntegrationService, comExternalId= DocEntry eRelatedId= CodPedido.
Resumo do Funcionamento
- Busca com prevenção de duplicidade: Apenas pedidos de devolução com tracking de importação e sem tracking de retorno são processados, garantindo que cada devolução seja enviada ao SAP B1 uma única vez.
- Vinculação com rascunho original: Os dados fiscais e de linha (
TaxCode,CFOPCode,BaseEntry,BaseLine) são herdados do rascunho original do SAP B1, mantendo consistência contábil. - Consolidação de movimentos: Movimentos de inventário são agrupados por produto e endereço, evitando linhas duplicadas na nota de crédito.
- Rastreabilidade de lotes: Informações completas de lote (número, quantidade, datas) são preservadas do WMS para o SAP B1.
- Conclusão automática: Pedidos faturados com sucesso são automaticamente concluídos no WMS e os rascunhos correspondentes são marcados como processados no SAP B1.
- Resiliência a falhas: Erros em pedidos individuais são tratados isoladamente — falhas não interrompem o processamento dos demais pedidos do mesmo lote. Exceções são capturadas no nível da integração com log de erro.
- Rastreabilidade completa: Cada operação gera um
IntegrationTrackingcom tipoOrderReturnRequestReturn, armazenando request e response completos, vinculandoRelatedId(CodPedido) aoExternalId(DocEntry do B1).