import React, { useState, useEffect } from 'react'; import { FiArrowLeft, FiPackage, FiCalendar, FiUser, FiDollarSign, FiRotateCcw, FiCheck, FiX, FiAlertTriangle, FiPlus } from 'react-icons/fi'; import toast from 'react-hot-toast'; import '../styles/devolucoes.css'; const Devolucoes = () => { const [vendas, setVendas] = useState([]); const [loading, setLoading] = useState(true); const [vendaSelecionada, setVendaSelecionada] = useState(null); const [showModal, setShowModal] = useState(false); const [showHistoricoModal, setShowHistoricoModal] = useState(false); const [historicoVenda, setHistoricoVenda] = useState([]); const [itensDevolucao, setItensDevolucao] = useState([]); const [motivo, setMotivo] = useState(''); const [processando, setProcessando] = useState(false); const [tipoOperacao, setTipoOperacao] = useState('devolucao'); const [produtos, setProdutos] = useState([]); const [itensTroca, setItensTroca] = useState([]); useEffect(() => { carregarVendas(); }, []); const carregarVendas = async () => { try { setLoading(true); const response = await fetch('/api/devolucoes/vendas'); if (response.ok) { const data = await response.json(); setVendas(data); } else { toast.error('Erro ao carregar vendas'); } } catch (error) { console.error('Erro ao carregar vendas:', error); toast.error('Erro ao carregar vendas'); } finally { setLoading(false); } }; const carregarHistoricoVenda = async (vendaId) => { try { const response = await fetch(`/api/devolucoes/venda/${vendaId}`); if (response.ok) { const historico = await response.json(); setHistoricoVenda(historico); setShowHistoricoModal(true); } else { toast.error('Erro ao carregar histórico'); } } catch (error) { console.error('Erro ao carregar histórico:', error); toast.error('Erro ao carregar histórico'); } }; const carregarProdutos = async () => { try { const response = await fetch('/api/devolucoes/produtos'); if (response.ok) { const data = await response.json(); setProdutos(data); } } catch (error) { console.error('Erro ao carregar produtos:', error); } }; const abrirModalDevolucao = (venda) => { setVendaSelecionada(venda); setItensDevolucao(venda.itens.map(item => ({ ...item, quantidade_devolver: 0, selecionado: false }))); setItensTroca([]); setMotivo(''); setTipoOperacao('devolucao'); carregarProdutos(); setShowModal(true); }; const handleItemChange = (itemId, quantidade) => { setItensDevolucao(prev => prev.map(item => { if (item.id === itemId) { const quantidadeDevolver = Math.min(Math.max(0, parseInt(quantidade) || 0), item.quantidade); return { ...item, quantidade_devolver: quantidadeDevolver, selecionado: quantidadeDevolver > 0 }; } return item; })); }; const calcularValorDevolucao = () => { return itensDevolucao.reduce((total, item) => { if (item.selecionado && item.quantidade_devolver > 0) { return total + (parseFloat(item.valor_unitario) * item.quantidade_devolver); } return total; }, 0); }; const calcularValorTroca = () => { return itensTroca.reduce((total, item) => { return total + (parseFloat(item.valor_unitario || 0) * parseInt(item.quantidade || 0)); }, 0); }; const adicionarItemTroca = () => { setItensTroca(prev => [...prev, { id: Date.now(), produto_id: '', variacao_id: '', quantidade: 1, valor_unitario: 0, produto_nome: '', variacao_info: '' }]); }; const removerItemTroca = (id) => { setItensTroca(prev => prev.filter(item => item.id !== id)); }; const handleTrocaChange = (id, field, value) => { setItensTroca(prev => prev.map(item => { if (item.id === id) { if (field === 'produto_id') { const produto = produtos.find(p => p.id === value); return { ...item, produto_id: value, produto_nome: produto ? `${produto.marca} - ${produto.nome}` : '', variacao_id: '', variacao_info: '', valor_unitario: produto ? produto.valor_revenda : 0 }; } else if (field === 'variacao_id') { const produto = produtos.find(p => p.id === item.produto_id); const variacao = produto?.variacoes.find(v => v.id === value); return { ...item, variacao_id: value, variacao_info: variacao ? `${variacao.tamanho} - ${variacao.cor}` : '', valor_unitario: variacao ? variacao.preco_venda || produto.valor_revenda : item.valor_unitario }; } else if (field === 'quantidade') { const produto = produtos.find(p => p.id === item.produto_id); const variacao = produto?.variacoes.find(v => v.id === item.variacao_id); const quantidadeSolicitada = parseInt(value) || 0; if (variacao && quantidadeSolicitada > variacao.quantidade) { toast.error(`Estoque insuficiente! Disponível: ${variacao.quantidade}, solicitado: ${quantidadeSolicitada}`); return { ...item, [field]: variacao.quantidade }; } return { ...item, [field]: value }; } else { return { ...item, [field]: value }; } } return item; })); }; const processarDevolucao = async () => { const itensSelecionados = itensDevolucao.filter(item => item.selecionado && item.quantidade_devolver > 0); if (tipoOperacao === 'devolucao' && itensSelecionados.length === 0) { toast.error('Selecione pelo menos um item para devolução'); return; } if (tipoOperacao === 'troca') { if (itensSelecionados.length === 0) { toast.error('Selecione pelo menos um item para devolver na troca'); return; } const itensValidosTroca = itensTroca.filter(item => item.produto_id && item.variacao_id && item.quantidade > 0 ); if (itensValidosTroca.length === 0) { toast.error('Adicione pelo menos um produto para troca'); return; } } if (!motivo.trim()) { toast.error(`Informe o motivo da ${tipoOperacao}`); return; } try { setProcessando(true); const requestBody = { venda_id: vendaSelecionada.id, tipo_operacao: tipoOperacao, motivo: motivo.trim() }; if (itensSelecionados.length > 0) { requestBody.itens_devolucao = itensSelecionados.map(item => ({ item_id: item.id, quantidade_devolvida: item.quantidade_devolver })); } if (tipoOperacao === 'troca' && itensTroca.length > 0) { requestBody.itens_troca = itensTroca .filter(item => item.produto_id && item.variacao_id && item.quantidade > 0) .map(item => ({ produto_id: item.produto_id, variacao_id: item.variacao_id, quantidade: parseInt(item.quantidade), valor_unitario: parseFloat(item.valor_unitario) })); } const response = await fetch('/api/devolucoes', { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify(requestBody) }); if (response.ok) { const result = await response.json(); toast.success(result.message); setShowModal(false); carregarVendas(); } else { const error = await response.json(); toast.error(error.message || `Erro ao processar ${tipoOperacao}`); } } catch (error) { console.error(`Erro ao processar ${tipoOperacao}:`, error); toast.error(`Erro ao processar ${tipoOperacao}`); } finally { setProcessando(false); } }; const formatarMoeda = (valor) => { return new Intl.NumberFormat('pt-BR', { style: 'currency', currency: 'BRL' }).format(valor); }; const formatarData = (data) => { return new Date(data).toLocaleDateString('pt-BR'); }; if (loading) { return (

Carregando vendas...

); } return (

Devolução/Troca

Gerencie devoluções e trocas de produtos vendidos

{vendas.length === 0 ? (

Nenhuma venda encontrada

Não há vendas dos últimos 30 dias disponíveis para devolução

) : (
{vendas.map(venda => (

Venda #{venda.id_venda || venda.id.slice(-8)}

{formatarData(venda.data_venda)} {venda.cliente_nome}
{formatarMoeda(venda.valor_total)}

Produtos ({venda.itens.length})

{venda.itens.slice(0, 3).map(item => (
{item.produto_nome} {item.variacao_info}
Qtd: {item.quantidade} R$ {parseFloat(item.valor_unitario).toFixed(2)}
))} {venda.itens.length > 3 && (
+{venda.itens.length - 3} produtos
)}
))}
)}
{/* Modal de Devolução */} {showModal && vendaSelecionada && (

Devolução/Troca

Venda #{vendaSelecionada.id_venda || vendaSelecionada.id.slice(-8)}

{formatarData(vendaSelecionada.data_venda)}
{vendaSelecionada.cliente_nome}
{formatarMoeda(vendaSelecionada.valor_total)}

Tipo de Operação:

Selecione os itens para devolução:

{itensDevolucao.map(item => (
{item.produto_foto && (
{item.produto_nome}
)}
{item.produto_nome}
Código: {item.produto_codigo || 'N/A'}
{item.variacao_info} {formatarMoeda(item.valor_unitario)} Qtd: {item.quantidade}
handleItemChange(item.id, e.target.value)} className="quantidade-input" />
{item.quantidade_devolver > 0 && ( = {formatarMoeda(item.valor_unitario * item.quantidade_devolver)} )}
))}
{/* Seção de Troca */} {tipoOperacao === 'troca' && (

Produtos para Troca:

{itensTroca.map(item => (
{item.produto_id && (
)}
handleTrocaChange(item.id, 'quantidade', e.target.value)} className="input-quantidade" />
handleTrocaChange(item.id, 'valor_unitario', e.target.value)} className="input-valor" />
Total: {formatarMoeda(item.valor_unitario * item.quantidade)}
))} {itensTroca.length === 0 && (

Nenhum produto adicionado para troca

)}
)}