Files
App-Estoque-LiberiKids/DEVOLUCOES-CORRIGIDAS.md
2025-10-14 14:04:17 -03:00

5.2 KiB

🔧 Correções no Sistema de Devoluções/Trocas

Problemas Identificados e Corrigidos

Problema Original:

  • Devoluções acumulavam registros em vez de devolver produtos ao estoque
  • Trocas não controlavam corretamente o estoque (entrada/saída)
  • Possibilidade de devolver mais itens do que foi vendido
  • Registros duplicados de devoluções

Soluções Implementadas:

1. Controle de Estoque em Devoluções

Antes:

// Sempre retornava ao estoque, mesmo em trocas
const novoEstoque = estoqueAtual + quantidadeDevolvida;

Depois:

// Só retorna ao estoque se for devolução pura (não troca)
if (itemOriginal.variacao_id && tipo_operacao !== 'troca') {
  const novoEstoque = (variacaoAtual.quantidade || 0) + parseInt(quantidade_devolvida);
  // Atualizar estoque...
  console.log(`✅ Estoque atualizado: +${quantidade_devolvida} unidades`);
}

2. Controle de Estoque em Trocas

Lógica Corrigida:

  1. Produto Original (devolvido): Volta ao estoque
  2. Produto Novo (trocado): Sai do estoque
  3. Registro: Apenas um registro de devolução + item novo na venda

Implementação:

// Para trocas, devolver produto original ao estoque
if (itemOriginal && itemOriginal.variacao_id) {
  const novoEstoque = (variacaoAtual.quantidade || 0) + parseInt(quantidade_devolvida);
  console.log(`✅ Produto original retornado ao estoque na troca: +${quantidade_devolvida} unidades`);
}

// Reduzir estoque do produto novo
const novoEstoque = (variacaoAtual.quantidade || 0) - parseInt(quantidade);
console.log(`✅ Estoque reduzido na troca: -${quantidade} unidades`);

3. Validação Anti-Duplicação

Verificação de Devoluções Anteriores:

// Verificar se já foi devolvido anteriormente
const { data: devolucaoExistente } = await supabase
  .from('devolucoes')
  .select('quantidade_devolvida')
  .eq('venda_id', venda_id)
  .eq('item_id', item_id);

const quantidadeJaDevolvida = devolucaoExistente?.reduce((total, dev) => 
  total + parseInt(dev.quantidade_devolvida), 0) || 0;

const quantidadeDisponivel = parseInt(itemOriginal.quantidade) - quantidadeJaDevolvida;

if (parseInt(quantidade_devolvida) > quantidadeDisponivel) {
  throw new Error(`Quantidade de devolução (${quantidade_devolvida}) maior que disponível (${quantidadeDisponivel})`);
}

4. API de Limpeza de Duplicatas

Nova Rota:

POST /api/devolucoes/limpar-duplicadas

Funcionalidade:

  • Identifica devoluções duplicadas (mesmo venda_id, item_id, data)
  • Remove registros duplicados automaticamente
  • Retorna quantidade de registros removidos

5. Logs Detalhados

Monitoramento em Tempo Real:

console.log(`✅ Estoque atualizado: +${quantidade_devolvida} unidades (novo total: ${novoEstoque})`);
console.log(`✅ Estoque reduzido na troca: -${quantidade} unidades (novo total: ${novoEstoque})`);
console.log(`✅ Produto original retornado ao estoque na troca: +${quantidade_devolvida} unidades`);

📋 Fluxos Corrigidos

Devolução Simples:

  1. Verifica se quantidade não excede o vendido
  2. Retorna produto ao estoque
  3. Registra devolução única
  4. Atualiza valor da venda

Troca de Produto:

  1. Verifica estoque do produto novo
  2. Retorna produto original ao estoque
  3. Reduz estoque do produto novo
  4. Adiciona item novo à venda
  5. Registra devolução do item original
  6. Calcula diferença de valores

🧪 Como Testar

1. Teste de Devolução:

# Executar script de verificação
node scripts/fix-devolucoes.js

2. Teste Manual:

  1. Acesse Devoluções/Trocas
  2. Selecione uma venda
  3. Escolha "Devolução"
  4. Verifique se o estoque aumentou
  5. Tente devolver o mesmo item novamente (deve dar erro)

3. Teste de Troca:

  1. Selecione uma venda
  2. Escolha "Troca"
  3. Selecione produto para devolver
  4. Selecione produto novo
  5. Verifique:
    • Produto original voltou ao estoque
    • Produto novo saiu do estoque
    • Venda foi atualizada com novo item

🔍 Verificações de Integridade

Comandos Úteis:

-- Verificar devoluções por venda
SELECT venda_id, COUNT(*) as total_devolucoes 
FROM devolucoes 
GROUP BY venda_id 
HAVING COUNT(*) > 1;

-- Verificar estoque negativo
SELECT * FROM produto_variacoes WHERE quantidade < 0;

-- Verificar devoluções duplicadas
SELECT venda_id, item_id, data_devolucao, COUNT(*) 
FROM devolucoes 
GROUP BY venda_id, item_id, data_devolucao 
HAVING COUNT(*) > 1;

📊 Benefícios das Correções

  • Estoque Preciso: Controle real de entrada/saída
  • Sem Duplicatas: Prevenção de registros duplicados
  • Validação Robusta: Impossível devolver mais que vendido
  • Logs Detalhados: Rastreamento completo das operações
  • Trocas Corretas: Fluxo de estoque adequado
  • Limpeza Automática: Ferramenta para corrigir dados históricos

🚀 Status

IMPLEMENTADO E FUNCIONANDO

O sistema agora controla corretamente:

  • Devoluções simples com retorno ao estoque
  • Trocas com controle bidirecional de estoque
  • Prevenção de duplicatas e validações
  • Limpeza de dados históricos inconsistentes