172 lines
5.2 KiB
Markdown
172 lines
5.2 KiB
Markdown
# 🔧 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:**
|
|
```javascript
|
|
// Sempre retornava ao estoque, mesmo em trocas
|
|
const novoEstoque = estoqueAtual + quantidadeDevolvida;
|
|
```
|
|
|
|
### **Depois:**
|
|
```javascript
|
|
// 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:**
|
|
```javascript
|
|
// 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:**
|
|
```javascript
|
|
// 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:**
|
|
```javascript
|
|
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:**
|
|
```bash
|
|
# 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:**
|
|
```sql
|
|
-- 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
|