import React, { useState, useEffect } from 'react'; import { supabase } from '@/integrations/supabase/client'; import { toast } from 'sonner'; import { formatBrazilianDateTime } from '@/utils/dateTimeUtils'; interface ApontamentoDiario { id: string; of_number: string; etapa_fase: string; marca: string; descricao: string; processo: string; quantidade: number; peso_unitario: number; peso_total: number; data_apontamento: string; created_at: string; } interface ResumoProcesso { processo: string; quantidade: number; apontamentos: number; peso_total: number; } export const useRelatorioDiario = (selectedDate: string) => { const [apontamentos, setApontamentos] = useState([]); const [loading, setLoading] = useState(false); const fetchApontamentos = async () => { if (!selectedDate) return; setLoading(true); try { console.log('Buscando apontamentos para data:', selectedDate); const { data: apontamentosData, error } = await supabase .from('apontamentos_producao') .select(` id, of_number, quantidade_produzida, data_apontamento, created_at, tipo_apontamento, peca:pecas( id, marca, descricao, etapa_fase, peso_unitario ), componente:componentes_peca( id, marca_componente, descricao, peso_unitario ), processo:processos_fabricacao( nome ) `) .eq('data_apontamento', selectedDate) .order('of_number') .order('created_at'); if (error) { console.error('Erro ao buscar apontamentos:', error); throw error; } console.log('Apontamentos encontrados:', apontamentosData?.length || 0); console.log('Data de busca usada:', selectedDate); const apontamentosFormatados: ApontamentoDiario[] = (apontamentosData || []).map(apt => { // Determinar dados baseado no tipo de apontamento let marca, descricao, etapa_fase, peso_unitario; if (apt.tipo_apontamento === 'componente' && apt.componente) { marca = apt.componente.marca_componente; descricao = apt.componente.descricao || 'Componente'; etapa_fase = '0'; // Componentes não têm etapa/fase peso_unitario = Number(apt.componente.peso_unitario || 0); } else if (apt.tipo_apontamento === 'peca' && apt.peca) { marca = apt.peca.marca; descricao = apt.peca.descricao || 'Peça'; etapa_fase = apt.peca.etapa_fase || '0'; peso_unitario = Number(apt.peca.peso_unitario || 0); } else { marca = 'N/A'; descricao = 'N/A'; etapa_fase = '0'; peso_unitario = 0; } const peso_total = peso_unitario * apt.quantidade_produzida; return { id: apt.id, of_number: apt.of_number, etapa_fase, marca, descricao, processo: apt.processo?.nome || 'N/A', quantidade: apt.quantidade_produzida, peso_unitario, peso_total, data_apontamento: apt.data_apontamento, created_at: apt.created_at }; }); // Ordenar por OF, etapa_fase, marca apontamentosFormatados.sort((a, b) => { if (a.of_number !== b.of_number) { return a.of_number.localeCompare(b.of_number); } if (a.etapa_fase !== b.etapa_fase) { return a.etapa_fase.localeCompare(b.etapa_fase); } return a.marca.localeCompare(b.marca); }); setApontamentos(apontamentosFormatados); console.log('Apontamentos formatados:', apontamentosFormatados.length); } catch (error) { console.error('Erro ao buscar dados do relatório diário:', error); toast.error('Erro ao carregar relatório diário'); } finally { setLoading(false); } }; useEffect(() => { fetchApontamentos(); }, [selectedDate]); // Calcular resumo por processo const resumoProcessos: ResumoProcesso[] = React.useMemo(() => { const resumo = new Map(); apontamentos.forEach(apt => { const processo = apt.processo; if (!resumo.has(processo)) { resumo.set(processo, { quantidade: 0, apontamentos: 0, peso_total: 0 }); } const dados = resumo.get(processo)!; dados.quantidade += apt.quantidade; dados.apontamentos += 1; dados.peso_total += apt.peso_total; }); return Array.from(resumo.entries()) .map(([processo, dados]) => ({ processo, ...dados })) .sort((a, b) => b.quantidade - a.quantidade); }, [apontamentos]); return { apontamentos, resumoProcessos, loading, refetch: fetchApontamentos }; };