Importação de Devolução de Pedido de Saída
📌 Descrição do Processo
A importação de devolução de pedido de saída representa o fluxo de recebimento de devoluções do SAP B1 para o WMS.
O SAP B1 atua como origem dos rascunhos de notas de crédito (Drafts do tipo oCreditNotes), enquanto o WMS consome esses documentos para criar pedidos de entrada do tipo devolução.
A integração garante que as notas de crédito geradas no SAP B1 sejam automaticamente registradas no WMS como pedidos de entrada com sub-operação "Devolução", incluindo produtos, quantidades e lotes.
Este processo utiliza cursor temporal para busca incremental — apenas rascunhos criados ou alterados desde a última sincronização são processados. A integração realiza verificação de duplicidade via IntegrationTracking (campo ExternalId = DocEntry), evitando reprocessamento de documentos já integrados. Além disso, apenas produtos com prefixos válidos configurados nos parâmetros B1 são incluídos.
🔄 Fluxo de Importação
-
Consulta de Rascunhos de Notas de Crédito no SAP B1
- O WMS busca rascunhos (
Drafts) do tipooCreditNotescom statusbost_Openno SAP B1, filtrando porDocDatea partir do cursor temporal. - Para cada rascunho encontrado, os detalhes completos do documento são recuperados via
/Drafts({docEntry}). - Documentos cujas linhas não contêm nenhum produto com prefixo válido são descartados.
- Documentos já presentes no
IntegrationTrackingsão filtrados para evitar duplicidade.
- O WMS busca rascunhos (
-
Transformação dos Dados (Parse)
- Os dados brutos do SAP B1 (
B1CreditNoteResponse) são convertidos para o modelo internoOrderImportvia AutoMapper. - Cada nota de crédito gera um pedido de entrada com
Operation = EntradaeSubOperation = "Devolução". - Lotes (
BatchNumbers) são mapeados paraOrderItemVolumeLots; linhas sem lote recebem um lote padrão vazio.
- Os dados brutos do SAP B1 (
-
Salvamento no WMS
- Os pedidos de devolução são persistidos no WMS via
RecordOrderService. - Registros de
IntegrationTrackingsão salvos para cada pedido (sucesso ou falha), usandoEIntegrationOperationType.OrderReturnRequestImport. - O cursor de sincronização é atualizado com a data e o
DocEntrydo último documento processado.
- Os pedidos de devolução são persistidos no WMS via
🖥️ APIs Envolvidas
- SAP B1 → WMS (GET)
/Drafts→ busca rascunhos de notas de crédito (DocObjectCode = "oCreditNotes",DocumentStatus = "bost_Open"), filtrados porDocDate >= cursor.LastTimestamp, ordenados porDocDatedescendente, com paginação via OData NextLink./Drafts({docEntry})→ recupera os detalhes completos de cada rascunho, incluindoDocumentLineseBatchNumbers.
📦 Exemplo de Importação (Objeto Fictício)
Cenário:
- Fornecedor: AutoPeças Brasil Ltda. (
C00150) - Rascunho no SAP B1: DocEntry 60300, DocNum 70400
- Produto devolvido:
PA-789 – Bateria 60Ah(20 unidades, 1 lote) - Valor total: R$ 3.000,00
1. Nota de Crédito no SAP B1
{
"DocEntry": 60300,
"DocNum": 70400,
"DocDate": "2026-03-25",
"DocTime": "14:30:00",
"CardCode": "C00150",
"CardName": "AutoPeças Brasil Ltda.",
"DocTotal": 3000.00,
"DocumentStatus": "bost_Open",
"SequenceSerial": 42,
"DocumentLines": [
{
"LineNum": 0,
"ItemCode": "PA-789",
"ItemDescription": "Bateria 60Ah",
"Quantity": 20,
"UnitPrice": 150.00,
"WarehouseCode": "WH01",
"BatchNumbers": [
{
"BatchNumber": "LOTE-2026-003",
"Quantity": 20,
"ManufacturingDate": "2026-01-15",
"ExpiryDate": "2028-01-15"
}
]
}
]
}
2. Resultado no WMS
- Pedido de entrada criado com
RelatedOrderCode = "60300",Operation = Entrada,SubOperation = "Devolução". - Produto
PA-789 – Bateria 60Ahassociado ao pedido com 20 unidades. - Lote
LOTE-2026-003registrado com data de fabricação2026-01-15e validade2028-01-15. - Registro de
IntegrationTrackingcriado comExternalId = "60300"eType = "OrderReturnRequestImport". - Cursor atualizado para
LastTimestamp = 2026-03-25T14:30:00,LastId = "60300".
✅ Regras de Negócio
- Apenas rascunhos do tipo
oCreditNotescom statusbost_Opensão consultados. - A importação é incremental — utiliza cursor temporal baseado no
DocDatedo último documento processado. - Produtos são filtrados por prefixo válido configurado nos parâmetros de integração B1 (
ValidProductPrefixes:MA,MP,PA,PI,UC,RV). Documentos sem nenhum produto com prefixo válido são descartados integralmente. - Documentos cujo
DocEntryjá exista noIntegrationTracking(tipoOrderReturnRequestImport) são ignorados, evitando duplicidade. - Todas as notas de crédito são mapeadas como pedidos de entrada (
EDefOperacaoPedido.Entrada) com sub-operação "Devolução". - O campo
SequenceSerialdo SAP B1 é mapeado comoInvoiceNumberno WMS. - Linhas de documento com
BatchNumberssão mapeadas individualmente paraOrderItemVolumeLots. Linhas sem lote recebem um lote padrão vazio (LoteConstants.DefaultEmptyLote). - Se a busca de rascunhos falhar para uma
ErpIntegration, o erro é logado e a integração continua para as demais configurações. - Se a recuperação de detalhes de um rascunho individual falhar, o documento é ignorado com log de aviso.
- O cursor é atualizado ao final da execução: em caso de falha parcial, o cursor aponta para o último pedido com erro; em caso de sucesso total, para o último pedido processado.
- O processamento é feito por
ErpIntegration— cada configuração de ERP é processada independentemente, permitindo múltiplas conexões B1.
Esse fluxo garante que as notas de crédito (devoluções) do SAP B1 sejam automaticamente importadas e registradas no WMS como pedidos de entrada do tipo devolução, de forma incremental, com controle de duplicidade e rastreamento completo de lotes.
⚙️ Especificações Técnicas
Fluxo de execução
- Query: Consulta os rascunhos de
oCreditNotesno SAP B1, recupera detalhes completos dos documentos, filtra por prefixo de produto válido e elimina duplicados já registrados noIntegrationTracking. - Parse: Converte os dados retornados do SAP B1 (
B1CreditNoteResponse) para o modelo internoOrderImportvia AutoMapper, incluindo mapeamento de lotes e parâmetros de integração B1. - Send: Persiste os pedidos de devolução no WMS, salva registros de
IntegrationTrackinge atualiza o cursor de sincronização.
Detalhamento das Etapas
Query
B1CreditNotesIntegrator.Query()
└── B1CreditNotesImportService.GetIntegratedCreditNotesAsync()
├── ErpIntegrationsService.GetErpToIntegrateAsync(B1)
└── [Para cada ErpIntegration]
├── ErpIntegrationsService.GetErpIntegrationCursorAsync(OrderReturnRequestImport)
├── DraftsConnector.GetDraftsAsync("oCreditNotes", cursor.LastTimestamp)
├── [Para cada Draft] → DraftsConnector.GetDraftByKeyAsync<B1CreditNoteResponse>()
├── Filtro por prefixos válidos de produto (ValidProductPrefixes)
└── OrderIntegrationService.VerifyOrderIntegrationTrackingAsync() (deduplicação)
B1CreditNotesIntegrator.Query(): ponto de entrada da etapa de consulta. Loga o início e delega ao serviço.B1CreditNotesImportService.GetIntegratedCreditNotesAsync(): orquestra a busca para todas asErpIntegrationsconfiguradas. Para cada uma, obtém o cursor, busca rascunhos via OData com filtro por tipo e status, recupera detalhes de cada documento, filtra por prefixo de produto e elimina duplicados viaIntegrationTracking. Retorna lista vazia com log de aviso se nenhuma integração B1 estiver configurada.DraftsConnector.GetDraftsAsync(): consulta a API/Draftsdo SAP B1 filtrando porDocObjectCode = "oCreditNotes",DocumentStatus = "bost_Open"eDocDate >= cursor. Suporta paginação via OData NextLink.DraftsConnector.GetDraftByKeyAsync(): consulta/Drafts({docEntry})para obter o documento completo. Falhas individuais são logadas e o documento é ignorado.
Parse
B1CreditNotesIntegrator.Parse()
└── B1CreditNotesImportService.ParseReturnRequestsToOrdersAsync()
└── [Para cada B1CreditNotesByIntegrator]
├── ParametersProvider.GetParametersOrDefault()
└── Mapper.MapListWithB1Parameters<B1CreditNoteResponse, OrderImport>()
├── DocEntry → RelatedOrderCode
├── CardCode → RelationalEntityId
├── DocDate + DocTime → Typing
├── DocTotal → Amount
├── SequenceSerial → InvoiceNumber
├── (constante) Operation = Entrada, SubOperation = "Devolução"
└── DocumentLines → OrderItems
└── BatchNumbers → OrderItemVolumeLots (ou lote padrão vazio)
B1CreditNotesIntegrator.Parse(): loga a quantidade de grupos e delega ao serviço.B1CreditNotesImportService.ParseReturnRequestsToOrdersAsync(): para cada grupo, obtém os parâmetros B1 e aplica AutoMapper com contexto de parâmetros. ODefaultLogisticOperationCodeé mapeado paraRelationalLogisticOperationId.- AutoMapper (B1CreditNoteProfile): converte
B1CreditNoteResponse→OrderImporteB1CreditNoteLine→OrderItem. Lotes são mapeados individualmente com datas de fabricação e validade; linhas sem lote recebemLoteConstants.DefaultEmptyLote.
Send
B1CreditNotesIntegrator.Send()
└── [Para cada ParsedReturnRequestsByIntegration]
└── B1CreditNotesImportService.SaveCreditNotesToWmsAsync()
├── RecordOrderService.RecordOrder(orders)
├── SaveIntegrationTrackings()
│ └── OrderIntegrationService.SaveOrderIntegrationTrackingsAsync()
└── UpdateIntegrationCursor()
└── ErpIntegrationsService.UpdateErpIntegrationCursorAsync()
B1CreditNotesIntegrator.Send(): itera sobre cada grupo, ignorando grupos sem pedidos (Orders.Count == 0) com log informativo.B1CreditNotesImportService.SaveCreditNotesToWmsAsync(): persiste os pedidos no WMS viaRecordOrderService, salva registros de rastreamento noIntegrationTracking(comExternalId = DocEntry,Type = OrderReturnRequestImport,Failed = !success) e atualiza o cursor temporal.UpdateIntegrationCursor(): em caso de falha parcial, o cursor aponta para o último pedido com erro (Success = false); em caso de sucesso total, para o último pedido processado (Success = true).
Resumo do Funcionamento
- Incrementalidade: a integração utiliza cursor temporal (
LastTimestamp) para processar apenas rascunhos novos ou alterados desde a última execução bem-sucedida. - Deduplicação: documentos já integrados são filtrados via
IntegrationTrackingusando oDocEntrycomoExternalId, evitando reprocessamento. - Filtro por prefixo: apenas documentos com ao menos um produto cujo código atende aos prefixos configurados (
ValidProductPrefixes) são incluídos na importação. - Multi-ERP: o fluxo suporta múltiplas configurações de
ErpIntegration, processando cada uma independentemente. - Mapeamento de lotes: lotes do SAP B1 são mapeados individualmente com quantidades, datas de fabricação e validade. Linhas sem lote recebem um lote padrão vazio.
- Tratamento de erros: falhas na busca de rascunhos ou detalhes individuais são logadas sem interromper o processamento. Falhas no salvamento de pedidos são registradas no
IntegrationTrackingcomFailed = truee o cursor é atualizado para o ponto de falha, permitindo retentativa na próxima execução.