import React, { useState, useEffect } from 'react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Calendar } from '@/components/ui/calendar'; import { Popover, PopoverContent, PopoverTrigger } from '@/components/ui/popover'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Dialog, DialogContent, DialogHeader, DialogTitle } from '@/components/ui/dialog'; import { CalendarIcon, Save, Plus, Trash2, ChevronUp, ChevronDown } from 'lucide-react'; import { format } from 'date-fns'; import { ptBR } from 'date-fns/locale'; import { cn } from '@/lib/utils'; import { CronogramaOf, ProcessoCronograma } from '@/types/cronograma'; import { useCronogramaOperations } from '@/hooks/useCronogramaOperations'; import { supabase } from '@/integrations/supabase/client'; import { toast } from 'sonner'; interface CronogramaFormProps { cronograma?: CronogramaOf | null; onClose: () => void; isOpen: boolean; onSaveSuccess?: () => void; } const processosDefault = [ 'Detalhamento', 'Fabricação', 'Pint/Galv', 'Instalação', 'Aceite/DB' ]; interface OFOption { id: string; num_of: string; descritivo: string; } interface GestorOption { id: string; full_name: string; email: string; } export const CronogramaForm: React.FC = ({ cronograma, onClose, isOpen, onSaveSuccess }) => { const { saveCronograma, getCronogramaPorOf } = useCronogramaOperations(); const [formData, setFormData] = useState({ of_id: '', gestor_id: '', revisao: 1, processos: processosDefault.map((nome, index) => ({ nome_processo: nome, data_inicio: '', data_fim: '', ordem: index + 1 })) as ProcessoCronograma[] }); const [ofs, setOfs] = useState([]); const [gestores, setGestores] = useState([]); const [loading, setLoading] = useState(false); useEffect(() => { if (isOpen) { loadOfs(); loadGestores(); } }, [isOpen]); useEffect(() => { if (cronograma) { console.log('Carregando cronograma para edição:', cronograma); setFormData({ of_id: cronograma.of_id, gestor_id: cronograma.gestor_id, revisao: cronograma.revisao, processos: cronograma.processos.length > 0 ? cronograma.processos.map(p => ({ id: p.id, nome_processo: p.nome_processo, data_inicio: p.data_inicio, data_fim: p.data_fim, ordem: p.ordem })) : processosDefault.map((nome, index) => ({ nome_processo: nome, data_inicio: '', data_fim: '', ordem: index + 1 })) }); } }, [cronograma]); const loadOfs = async () => { try { const { data, error } = await supabase .from('ordens_fabricacao') .select('id, num_of, descritivo') .order('num_of'); if (error) throw error; setOfs(data || []); } catch (error) { console.error('Erro ao carregar OFs:', error); } }; const loadGestores = async () => { try { const { data, error } = await supabase .from('profiles') .select('id, full_name, email') .not('full_name', 'is', null) .order('full_name'); if (error) throw error; setGestores(data || []); } catch (error) { console.error('Erro ao carregar gestores:', error); } }; const handleOfChange = async (ofId: string) => { console.log('OF selecionada:', ofId); setFormData(prev => ({ ...prev, of_id: ofId })); // Verificar se já existe cronograma para esta OF const cronogramaExistente = await getCronogramaPorOf(ofId); console.log('Cronograma existente encontrado:', cronogramaExistente); if (cronogramaExistente) { // Carregar dados do cronograma existente setFormData({ of_id: ofId, gestor_id: cronogramaExistente.gestor_id, revisao: cronogramaExistente.revisao, processos: cronogramaExistente.processos.length > 0 ? cronogramaExistente.processos.map(p => ({ id: p.id, nome_processo: p.nome_processo, data_inicio: p.data_inicio, data_fim: p.data_fim, ordem: p.ordem })) : processosDefault.map((nome, index) => ({ nome_processo: nome, data_inicio: '', data_fim: '', ordem: index + 1 })) }); toast.info('Cronograma existente carregado para edição'); } else { // Resetar para valores padrão se não houver cronograma setFormData(prev => ({ ...prev, gestor_id: '', revisao: 1, processos: processosDefault.map((nome, index) => ({ nome_processo: nome, data_inicio: '', data_fim: '', ordem: index + 1 })) })); } }; const handleProcessoChange = (index: number, field: keyof ProcessoCronograma, value: string) => { const newProcessos = [...formData.processos]; newProcessos[index] = { ...newProcessos[index], [field]: value }; setFormData({ ...formData, processos: newProcessos }); }; const addProcesso = () => { const newProcesso: ProcessoCronograma = { nome_processo: '', data_inicio: '', data_fim: '', ordem: formData.processos.length + 1 }; setFormData({ ...formData, processos: [...formData.processos, newProcesso] }); }; const removeProcesso = (index: number) => { const newProcessos = formData.processos.filter((_, i) => i !== index); // Reordenar newProcessos.forEach((processo, i) => { processo.ordem = i + 1; }); setFormData({ ...formData, processos: newProcessos }); }; const moveProcessoUp = (index: number) => { if (index === 0) return; const newProcessos = [...formData.processos]; [newProcessos[index], newProcessos[index - 1]] = [newProcessos[index - 1], newProcessos[index]]; // Atualizar ordem newProcessos.forEach((processo, i) => { processo.ordem = i + 1; }); setFormData({ ...formData, processos: newProcessos }); }; const moveProcessoDown = (index: number) => { if (index === formData.processos.length - 1) return; const newProcessos = [...formData.processos]; [newProcessos[index], newProcessos[index + 1]] = [newProcessos[index + 1], newProcessos[index]]; // Atualizar ordem newProcessos.forEach((processo, i) => { processo.ordem = i + 1; }); setFormData({ ...formData, processos: newProcessos }); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!formData.of_id || !formData.gestor_id) { toast.error('Por favor, selecione a OF e o gestor responsável'); return; } if (formData.processos.some(p => !p.nome_processo || !p.data_inicio || !p.data_fim)) { toast.error('Por favor, preencha todos os campos dos processos'); return; } setLoading(true); const success = await saveCronograma({ ...formData, id: cronograma?.id }); setLoading(false); if (success) { if (onSaveSuccess) { onSaveSuccess(); } onClose(); } }; const DatePicker = ({ date, onDateChange, placeholder }: { date: string; onDateChange: (date: string) => void; placeholder: string; }) => { const [selectedDate, setSelectedDate] = useState( date ? new Date(date + 'T12:00:00') : undefined ); return ( { if (date) { setSelectedDate(date); onDateChange(format(date, 'yyyy-MM-dd')); } }} initialFocus className="pointer-events-auto p-3" /> ); }; return ( {cronograma ? 'Editar Cronograma' : 'Novo Cronograma'}

Processos do Cronograma

{formData.processos.map((processo, index) => (
{/* Controles de ordenação */}
{/* Número de ordem */}
{index + 1}
{/* Campos do processo */}
handleProcessoChange(index, 'nome_processo', e.target.value)} placeholder="Ex: Detalhamento" />
handleProcessoChange(index, 'data_inicio', date)} placeholder="Selecionar data" />
handleProcessoChange(index, 'data_fim', date)} placeholder="Selecionar data" />
{/* Botão de remoção */}
))}
); };