Saltar al contenido principal

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.

Importante

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

  1. Busca de Rascunhos Pendentes no WMS (Query)

    • O WMS consulta a tabela IntegrationTracking para identificar importações de rascunhos que ainda não receberam retorno nem foram canceladas.
    • Os tipos de importação monitorados são: GoodsReceiptImport, PurchaseDevolutionImport e OrderReturnRequestImport.
    • 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).
  2. 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 -2028 ou 404) → é adicionado à lista de remoção.
    • Se ocorre outro erro de comunicação → é logado como warning e não é cancelado (prevenção de falsos positivos).
  3. Cancelamento no WMS (Send)

    • Para cada rascunho identificado como removido, o WMS executa a stored procedure stp_wmsapi_pedido_cancela para cancelar o pedido associado.
    • O motivo do cancelamento é registrado como "Cancelado - Rascunho removido no SAP B1".
    • Um registro de IntegrationTracking com tipo DraftsCancellationWms é criado para cada cancelamento.

🖥️ APIs Envolvidas

  • WMS → SAP B1 (GET)
    • /Drafts({docEntry}) → verifica se um rascunho ainda existe no SAP B1. Retorno com sucesso indica existência; erro -2028 ou 404 indica que o rascunho foi excluído.

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

Cenário:

  • Rascunho importado no WMS: IntegrationTracking com ExternalId = "65000", RelatedId = 87500, tipo GoodsReceiptImport
  • 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_cancela
    • CodPedido: 87500
    • CodPedidoPolo: 65000
    • DescricaoCancelamento: "Cancelado - Rascunho removido no SAP B1"

3. Resultado no WMS

  • Pedido #87500 foi cancelado no WMS.
  • IntegrationTracking registrado:
    • Tipo: DraftsCancellationWms
    • ExternalId: "65000"
    • RelatedId: 87500
    • Response: "Rascunho 65000 removido no B1. Pedido 87500 cancelado."
    • Failed: false

✅ Regras de Negócio

  • Apenas registros de IntegrationTracking com importação bem-sucedida (Failed = false) e tipos GoodsReceiptImport, PurchaseDevolutionImport ou OrderReturnRequestImport são monitorados.
  • Um rascunho é considerado "pendente" quando não existe registro de retorno correspondente (GoodsReceiptReturn, PurchaseDevolutionReturn, OrderReturnRequestReturn) nem de cancelamento (DraftsCancellationWms) com o mesmo ExternalId.
  • 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 -2028 ou 404. 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_cancela com motivo "Cancelado - Rascunho removido no SAP B1".
  • Cada cancelamento requer que o RelatedId do tracking seja válido (> 0). Registros sem RelatedId são ignorados com log de warning.
  • Cada cancelamento (sucesso ou falha) gera um registro de IntegrationTracking com tipo DraftsCancellationWms.
  • 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.

Resumo

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 IntegrationTracking para 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 IntegrationTracking de 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 IntegrationTracking buscando 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 IntegrationTracking com tipo DraftsCancellationWms. Exceções são capturadas e o tracking é marcado como Failed = 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 DraftsCancellationWms impedem que o mesmo rascunho seja cancelado mais de uma vez em ciclos futuros.
  • Rastreabilidade completa: Cada cancelamento gera um IntegrationTracking com tipo DraftsCancellationWms, vinculando ExternalId (DocEntry do B1) ao RelatedId (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 = true para análise posterior.