import React, { useState } from 'react'; import { useQuery } from '@tanstack/react-query'; import { Dialog, DialogContent, DialogHeader, DialogTitle, } from '@/components/ui/dialog'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Badge } from '@/components/ui/badge'; import { Loader2, Search, AlertTriangle, Trash2 } from 'lucide-react'; import { supabase } from '@/integrations/supabase/client'; import { toast } from 'sonner'; interface CleanupDuplicatesModalProps { isOpen: boolean; onClose: () => void; } interface DuplicateGroup { chave_agrupamento: string; of_number: string; marca: string; etapa_fase: string; processo_nome: string; quantidade_total_peca: number; apontamentos: Array<{ id: string; data_apontamento: string; created_at: string; quantidade_produzida: number; tipo_apontamento: string; }>; total_apontado: number; excesso: number; } export const CleanupDuplicatesModal: React.FC = ({ isOpen, onClose, }) => { const [ofNumber, setOfNumber] = useState(''); const [duplicatesData, setDuplicatesData] = useState<{ duplicatesFound: boolean; details: DuplicateGroup[]; totalGroups: number; groupsWithDuplicates: number; } | null>(null); const [isAnalyzing, setIsAnalyzing] = useState(false); const [isCleaning, setIsCleaning] = useState(false); const analyzeOF = async () => { if (!ofNumber.trim()) { toast.error('Por favor, informe o número da OF'); return; } setIsAnalyzing(true); try { const { data, error } = await supabase.functions.invoke('cleanup-duplicates', { body: { of_number: ofNumber.trim(), action: 'analyze' // Apenas analisar, não executar limpeza } }); if (error) throw error; setDuplicatesData({ duplicatesFound: data.groupsWithDuplicates > 0, details: data.details || [], totalGroups: data.totalGroups || 0, groupsWithDuplicates: data.groupsWithDuplicates || 0 }); if (data.groupsWithDuplicates === 0) { toast.success('Nenhuma duplicata encontrada para esta OF!'); } else { toast.info(`Encontradas ${data.groupsWithDuplicates} duplicatas para análise`); } } catch (error) { console.error('Erro ao analisar duplicatas:', error); toast.error('Erro ao analisar duplicatas'); } finally { setIsAnalyzing(false); } }; const executeCleaning = async () => { setIsCleaning(true); try { const { data, error } = await supabase.functions.invoke('cleanup-duplicates', { body: { of_number: ofNumber.trim(), action: 'execute' // Executar limpeza } }); if (error) throw error; toast.success(`Limpeza concluída! ${data.duplicatesRemoved} duplicatas removidas.`); // Resetar dados após limpeza setDuplicatesData(null); setOfNumber(''); } catch (error) { console.error('Erro ao executar limpeza:', error); toast.error('Erro ao executar limpeza de duplicatas'); } finally { setIsCleaning(false); } }; const handleClose = () => { setDuplicatesData(null); setOfNumber(''); onClose(); }; const groupedByPhase = duplicatesData?.details.reduce((acc, group) => { const phase = group.etapa_fase; if (!acc[phase]) acc[phase] = []; acc[phase].push(group); return acc; }, {} as Record) || {}; return ( Limpeza de Duplicatas de Apontamentos
{/* Input para OF */}
setOfNumber(e.target.value.toUpperCase())} className="flex-1" />
{/* Resultados da análise */} {duplicatesData && (
Resumo da Análise - OF {ofNumber}
{duplicatesData.totalGroups}
Grupos Analisados
{duplicatesData.groupsWithDuplicates}
Com Duplicatas
{duplicatesData.details.reduce((sum, g) => sum + g.apontamentos.length - 1, 0)}
Registros a Remover
{/* Detalhes por fase */} {duplicatesData.duplicatesFound && (

Duplicatas Encontradas por Fase:

{Object.entries(groupedByPhase).map(([phase, groups]) => ( Fase {phase} {groups.length} duplicatas
{groups.map((group, index) => (

Marca: {group.marca} | Processo: {group.processo_nome}

Quantidade da Peça: {group.quantidade_total_peca} | Total Apontado: {group.total_apontado} {group.excesso > 0 && ( {' '}| Excesso: +{group.excesso} )}
{group.apontamentos.length} apontamentos
{group.apontamentos.map((apt, aptIndex) => (
{aptIndex === 0 ? '✅ Manter' : '🗑️ Remover'}
Data: {new Date(apt.data_apontamento).toLocaleDateString('pt-BR')}
Qtd: {apt.quantidade_produzida}
Criado: {new Date(apt.created_at).toLocaleDateString('pt-BR')}
))}
))}
))} {/* Botão para executar limpeza */}
)} {!duplicatesData.duplicatesFound && (

Nenhuma Duplicata Encontrada

A OF {ofNumber} está livre de duplicatas de apontamentos.

)}
)}
); };