Logística reversa e devoluções
Devolução de compra de e-commerce, da solicitação do cliente até o estorno no meio de pagamento original, passando por coleta, recebimento e conferência.
O problema
Devolver não é desfazer. A venda já gerou nota fiscal, já movimentou estoque, já capturou pagamento e pode já ter gerado comissão. Cada uma dessas coisas precisa ser revertida no seu próprio sistema, em ordem, e qualquer uma pode falhar sozinha.
O resultado é um processo que fica em estado parcial com frequência, e esse estado precisa ser visível e retomável. “Parcialmente concluída” não é erro: é situação legítima e comum, e é exatamente onde a modelagem costuma quebrar.
O que eu construí
- Fluxo de solicitação até estorno, com o estado derivado do que os subprocessos reportam
- Estorno parcial com rateio proporcional entre os pagamentos elegíveis da compra original, com o resíduo de arredondamento no último
- Idempotência por identificador de origem: pedir a mesma devolução duas vezes devolve a primeira, não cria a segunda
- Integração com transportadora para coleta e rastreio
- Conclusão parcial como estado legítimo, com parte estornada e parte em falha, em vez de erro
Decisão que eu defendo
Estado derivado, nunca atribuído. O status da devolução é recalculado a partir dos estornos que a
compõem, e nenhum ponto do código escreve esse campo. Quem escreve status = concluida cria a
possibilidade de o status mentir, e o bug resultante é o pior tipo para o suporte, porque o sistema
não falha: ele afirma com confiança um estado que não corresponde às partes.
Custou uma função de recálculo e eliminou uma categoria inteira de chamado, não por corrigir os bugs mas por tornar a classe de bug impossível. O raciocínio completo, incluindo por que máquina de estado seria a escolha errada aqui, está em ADR 5 — Estado derivado, nunca atribuído.
Limite
Não dá para um operador marcar “concluída” à mão quando as partes dizem outra coisa. Isso apareceu como problema concreto num caso de conciliação manual: a resposta certa passou a ser corrigir a parte, não o todo, o que é mais correto e mais trabalhoso para quem opera.
Integrações
Orquestração de pagamento · transportadora e rastreio · ERP · plataforma de atendimento
Ver também
ADR 5 — Estado derivado, nunca atribuído · Pagamentos e antifraude · Backend .NET · Modelagem de domínio, DDD e CQRS