Sincronização de Rascunhos Removidos — Cancelamento Automático de Pedidos no WMS
📌 Descrição do Processo
A sincronização de rascunhos removidos representa o fluxo de detecção de rascunhos excluídos no SAP B1 e cancelamento automático dos pedidos correspondentes no WMS. O SAP B1 pode ter rascunhos (Drafts) que foram importados pelo WMS como pedidos. Quando esses rascunhos são excluídos no SAP B1, o WMS precisa cancelar os pedidos associados para manter a consistência entre os sistemas.
A integração garante que rascunhos removidos no SAP B1 resultem automaticamente no cancelamento dos pedidos correspondentes no WMS, com rastreabilidade completa via IntegrationTracking.
Este processo utiliza o padrão pooling — verifica periodicamente se rascunhos importados pelo WMS ainda existem no SAP B1. A detecção de remoção é feita via chamada individual ao endpoint Drafts({docEntry}) do SAP B1. Erros -2028 ou 404 indicam que o rascunho foi excluído. Erros de comunicação não resultam em cancelamento, evitando falsos positivos.
🔄 Fluxo de Sincronização
-
Busca de Rascunhos Pendentes no WMS (Query)
- O WMS consulta a tabela
IntegrationTrackingpara identificar importações de rascunhos que ainda não receberam retorno nem foram canceladas. - Os tipos de importação monitorados são:
GoodsReceiptImport,PurchaseDevolutionImporteOrderReturnRequestImport. - Um registro é considerado "pendente" quando: a importação foi bem-sucedida, não existe registro de retorno (
GoodsReceiptReturn,PurchaseDevolutionReturn,OrderReturnRequestReturn) e não existe registro de cancelamento (DraftsCancellationWms).
- O WMS consulta a tabela
-
Verificação de Existência no SAP B1 (Parse)
- Para cada rascunho pendente, o WMS faz uma chamada
GET /Drafts({docEntry})ao SAP B1. - Se o rascunho ainda existe → é ignorado (nenhuma ação necessária).
- Se o rascunho não existe (erro
-2028ou404) → é adicionado à lista de remoção. - Se ocorre outro erro de comunicação → é logado como warning e não é cancelado (prevenção de falsos positivos).
- Para cada rascunho pendente, o WMS faz uma chamada
-
Cancelamento no WMS (Send)
- Para cada rascunho identificado como removido, o WMS executa a stored procedure
stp_wmsapi_pedido_cancelapara cancelar o pedido associado. - O motivo do cancelamento é registrado como
"Cancelado - Rascunho removido no SAP B1". - Um registro de
IntegrationTrackingcom tipoDraftsCancellationWmsé criado para cada cancelamento.
- Para cada rascunho identificado como removido, o WMS executa a stored procedure
🖥️ APIs Envolvidas
- WMS → SAP B1 (GET)
/Drafts({docEntry})→ verifica se um rascunho ainda existe no SAP B1. Retorno com sucesso indica existência; erro-2028ou404indica que o rascunho foi excluído.
📦 Exemplo de Sincronização (Objeto Fictício)
Cenário:
- Rascunho importado no WMS:
IntegrationTrackingcomExternalId = "65000",RelatedId = 87500, tipoGoodsReceiptImport - Pedido WMS associado: #87500
- Ação no SAP B1: usuário exclui o rascunho
DocEntry 65000
1. Verificação no SAP B1
GET /Drafts(65000)
Resposta: Error "-2028" (Draft not found)
2. Cancelamento no WMS
- Stored procedure executada:
stp_wmsapi_pedido_cancelaCodPedido: 87500CodPedidoPolo: 65000DescricaoCancelamento:"Cancelado - Rascunho removido no SAP B1"
3. Resultado no WMS
- Pedido #87500 foi cancelado no WMS.
IntegrationTrackingregistrado:- Tipo:
DraftsCancellationWms ExternalId:"65000"RelatedId:87500Response:"Rascunho 65000 removido no B1. Pedido 87500 cancelado."Failed:false
- Tipo:
✅ Regras de Negócio
- Apenas registros de
IntegrationTrackingcom importação bem-sucedida (Failed = false) e tiposGoodsReceiptImport,PurchaseDevolutionImportouOrderReturnRequestImportsão monitorados. - Um rascunho é considerado "pendente" quando não existe registro de retorno correspondente (
GoodsReceiptReturn,PurchaseDevolutionReturn,OrderReturnRequestReturn) nem de cancelamento (DraftsCancellationWms) com o mesmoExternalId. - A verificação de existência é feita individualmente por rascunho via
GET /Drafts({docEntry}). - Um rascunho é considerado removido apenas quando o SAP B1 retorna erro
-2028ou404. Outros erros de comunicação não resultam em cancelamento (prevenção de falsos positivos). - O cancelamento no WMS é executado via stored procedure
stp_wmsapi_pedido_cancelacom motivo"Cancelado - Rascunho removido no SAP B1". - Cada cancelamento requer que o
RelatedIddo tracking seja válido (> 0). Registros semRelatedIdsão ignorados com log de warning. - Cada cancelamento (sucesso ou falha) gera um registro de
IntegrationTrackingcom tipoDraftsCancellationWms. - Se nenhuma integração B1 ativa for encontrada, o ciclo é ignorado sem erro.
- Exceções durante o cancelamento de um rascunho são logadas e o tracking é marcado como
Failed = true, sem interromper o processamento dos demais.
Esse fluxo garante que rascunhos excluídos no SAP B1 resultem automaticamente no cancelamento dos pedidos correspondentes no WMS, mantendo a consistência entre os sistemas e evitando que pedidos órfãos permaneçam ativos.
⚙️ Especificações Técnicas
Fluxo de execução
- Query: Consulta a tabela
IntegrationTrackingpara identificar importações de rascunhos pendentes de retorno ou cancelamento. - Parse: Verifica a existência de cada rascunho no SAP B1 via
GET /Drafts({docEntry}). Rascunhos não encontrados (erro-2028/404) são marcados para cancelamento. - Send: Executa o cancelamento dos pedidos no WMS via stored procedure e registra
IntegrationTrackingde cancelamento.
Detalhamento das Etapas
Query
B1SyncDraftsRemovedIntegrator.Query()
├── ErpIntegrationsService.GetErpToIntegrateAsync(EDefIntegration.B1)
└── B1SyncDraftsService.GetPendingDraftsFromWmsAsync()
└── IntegrationTrackingRepository.ObterImportacoesPendentesDeRetornoAsync()
└── [Filtro: importação bem-sucedida SEM retorno NEM cancelamento]
- B1SyncDraftsRemovedIntegrator.Query(): Obtém a configuração de integração B1 e delega a busca de rascunhos pendentes ao serviço. Se nenhuma integração ativa for encontrada, retorna lista vazia.
- GetPendingDraftsFromWmsAsync(): Consulta
IntegrationTrackingbuscando registros de importação (GoodsReceiptImport,PurchaseDevolutionImport,OrderReturnRequestImport) bem-sucedidos que não possuem registros de retorno nem de cancelamento correspondentes.
Parse
B1SyncDraftsRemovedIntegrator.Parse()
└── B1SyncDraftsService.IdentifyRemovedDraftsAsync(pendingDrafts, erpIntegration)
└── [Para cada rascunho pendente]
└── B1DraftsConnector.GetDraftByKeyAsync<object>(config, docEntry)
└── GET /Drafts({docEntry})
├── [Sucesso] → Rascunho existe → ignorado
├── [Erro -2028 / 404] → Rascunho removido → adicionado à lista
└── [Outro erro] → Log de warning → ignorado (prevenção de falso positivo)
- IdentifyRemovedDraftsAsync(): Itera sobre cada rascunho pendente, consultando o SAP B1 individualmente. Apenas rascunhos com erro de "não encontrado" são marcados para cancelamento. Outros erros são tratados como inconclusivos.
Send
B1SyncDraftsRemovedIntegrator.Send()
└── B1SyncDraftsService.SyncWmsDraftCancellationsAsync(draftsToCancel, erpIntegration)
└── [Para cada rascunho removido]
├── PedidoRepository.RequestCancelOrderAsync()
│ └── stp_wmsapi_pedido_cancela(CodPedido, CodPedidoPolo, DescricaoCancelamento)
└── SaveDraftCancellationTrackingAsync()
└── IntegrationTrackingService.SaveTrackingAsync()
└── IntegrationTracking { Type: DraftsCancellationWms }
- SyncWmsDraftCancellationsAsync(): Para cada rascunho removido, executa a stored procedure de cancelamento no WMS e cria um registro de
IntegrationTrackingcom tipoDraftsCancellationWms. Exceções são capturadas e o tracking é marcado comoFailed = true.
Resumo do Funcionamento
- Detecção por verificação individual: Cada rascunho pendente é verificado individualmente no SAP B1 via
GET /Drafts({docEntry}), sem depender de consultas em lote. - Prevenção de falsos positivos: Apenas erros específicos de "não encontrado" (
-2028,404) resultam em cancelamento. Erros de comunicação ou outros erros são ignorados, evitando cancelamentos indevidos. - Cancelamento via stored procedure: O cancelamento no WMS é executado pela procedure
stp_wmsapi_pedido_cancela, garantindo que toda a lógica de negócio do cancelamento seja respeitada. - Idempotência: Registros de
DraftsCancellationWmsimpedem que o mesmo rascunho seja cancelado mais de uma vez em ciclos futuros. - Rastreabilidade completa: Cada cancelamento gera um
IntegrationTrackingcom tipoDraftsCancellationWms, vinculandoExternalId(DocEntry do B1) aoRelatedId(CodPedido do WMS). - Tratamento de erros: Falhas no cancelamento de um rascunho são logadas e não interrompem o processamento dos demais. O tracking é marcado como
Failed = truepara análise posterior.