import React, { useState, useEffect } from 'react'; import { Card, CardContent, CardHeader, CardTitle } from '@/components/ui/card'; import { Input } from '@/components/ui/input'; import { Label } from '@/components/ui/label'; import { Button } from '@/components/ui/button'; import { Textarea } from '@/components/ui/textarea'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Checkbox } from '@/components/ui/checkbox'; import { toast } from 'sonner'; import { Save, FileText, User, MapPin, Settings2, Eye, Download, Search, Building2 } from 'lucide-react'; import { useSearchParams } from 'react-router-dom'; import { AlteracoesPopup } from '@/components/forms/AlteracoesPopup'; import { FichaTecnicaPreview } from '@/components/forms/FichaTecnicaPreview'; import { useThemeConfig } from '@/hooks/useThemeConfig'; import { useFichaTecnica, FichaTecnicaData } from '@/hooks/useFichaTecnica'; import { useUserManagement } from '@/hooks/useUserManagement'; interface InfoCalculoEstrutural { e: boolean; c: boolean; na: boolean; info: string; } interface FormData extends FichaTecnicaData { data_inicio: string; data_termino_prev: string; status: string; prioridade: string; } const initialFormData: FormData = { of_number: '', gestor: '', projetista: '', revisao: '0', quantidade: 0, data_inicio: '', data_termino_prev: '', status: 'aberta', prioridade: 'media', // Dados do Cliente cliente: '', cnpj: '', ie: '', endereco: '', cidade: '', estado: '', cep: '', contato_contrato: '', fone_contrato: '', cel_contrato: '', email_contrato: '', contato_obra: '', fone_obra: '', cel_obra: '', email_obra: '', contato_qualid: '', fone_qualid: '', cel_qualid: '', email_qualid: '', // Dados da Obra eng_responsavel: '', telefone_obra: '', email_obra_responsavel: '', endereco_obra: '', cep_obra: '', bairro_obra: '', cidade_obra: '', estado_obra: '', observacoes_obra: '', // Dados do Projeto descricao_resumida: '', endereco_projeto: '', bairro_projeto: '', cep_projeto: '', cidade_projeto: '', estado_projeto: '', horarios_trabalho: '', condicoes_acesso: '', // Tipos de Projeto tipo_estrutural: false, tipo_residencial: false, tipo_espacial: false, tipo_comercial: false, tipo_grades: false, tipo_industrial: false, tipo_cobertura: false, tipo_com_montagem: false, // Documentos Fornecidos doc_calculo: false, doc_projeto: false, doc_detalhamento: false, doc_cronograma: false, doc_normas: false, doc_especif_tecnicas: false, doc_catalogo: false, doc_fotos: false, // Informações Técnicas info_calculo_estrutural: { e: false, c: false, na: false, info: '' }, info_projeto_basico: { e: false, c: false, na: false, info: '' }, info_detalhamento: { e: false, c: false, na: false, info: '' }, info_materia_prima: { e: false, c: false, na: false, info: '' }, info_fabricacao: { e: false, c: false, na: false, info: '' }, info_grades_piso: { e: false, c: false, na: false, info: '' }, info_jateamento: { e: false, c: false, na: false, info: '' }, info_pintura_base: { e: false, c: false, na: false, info: '' }, info_pintura_inter: { e: false, c: false, na: false, info: '' }, info_pintura_acabamento: { e: false, c: false, na: false, info: '' }, info_galvanizacao: { e: false, c: false, na: false, info: '' }, info_embalagem: { e: false, c: false, na: false, info: '' }, info_transporte: { e: false, c: false, na: false, info: '' }, info_inspecao: { e: false, c: false, na: false, info: '' }, info_ensaios_lab: { e: false, c: false, na: false, info: '' }, info_databook: { e: false, c: false, na: false, info: '' }, info_pre_montagem: { e: false, c: false, na: false, info: '' }, info_placa_engenetal: { e: false, c: false, na: false, info: '' }, info_parafusos: { e: false, c: false, na: false, info: '' }, info_chumbadores: { e: false, c: false, na: false, info: '' }, info_stud_bolt: { e: false, c: false, na: false, info: '' }, info_fornec_telhas: { e: false, c: false, na: false, info: '' }, info_montagem_telhas: { e: false, c: false, na: false, info: '' }, info_forn_calhas: { e: false, c: false, na: false, info: '' }, info_mont_calhas: { e: false, c: false, na: false, info: '' }, info_steel_deck: { e: false, c: false, na: false, info: '' }, info_fornec_wall: { e: false, c: false, na: false, info: '' }, info_mont_wall: { e: false, c: false, na: false, info: '' }, info_outros_materiais: { e: false, c: false, na: false, info: '' }, // Validação necessita_validacao_pos_detalh: false, // Grades grades_modelo: '', grades_padrao_comercial: false, grades_padrao_sa2: false, grades_padrao_sa2_meio: false, grades_padrao_sa3: false, // Requisitos req_ambientais_existem: false, req_ambientais_quais: '', req_saude_seguranca_existem: false, req_saude_seguranca_quais: '', // Alterações alteracao_descritivo: '', alteracao_motivo: '', alteracao_impacto: '', alteracao_custo: 0, alteracao_cronograma: '', alteracao_pecas_prontas: '', alteracao_detalh_projeto: '', // Cronograma cronograma_semanas: {}, // Vistos visto_gestor: '', visto_pcp: '', visto_eng: '', visto_fab: '', visto_exp: '', visto_qual: '', visto_colunas: { '1': false, '2': false, '3': false, '4': false }, }; const CadastroOF = () => { const [searchParams] = useSearchParams(); const ofId = searchParams.get('id'); const isEditing = Boolean(ofId); const { themeConfig } = useThemeConfig(); const { buscarFichaTecnica, salvarFichaTecnica, loading: fichaTecnicaLoading } = useFichaTecnica(); const { users } = useUserManagement(); const [formData, setFormData] = useState(initialFormData); const [isSaving, setIsSaving] = useState(false); const [showPreview, setShowPreview] = useState(false); const [searchOfNumber, setSearchOfNumber] = useState(''); // Apply theme config on component mount useEffect(() => { if (themeConfig) { const root = document.documentElement; const isDark = root.classList.contains('dark'); const theme = isDark ? themeConfig.dark_theme : themeConfig.light_theme; Object.entries(theme).forEach(([key, value]) => { root.style.setProperty(`--${key}`, value); }); } }, [themeConfig]); const handleLoadOF = async () => { if (!searchOfNumber.trim()) { toast.error('Digite o número da OF para carregar'); return; } try { const data = await buscarFichaTecnica(searchOfNumber.trim()); if (data) { const parseJsonField = (field: any) => { if (typeof field === 'string') { try { return JSON.parse(field); } catch { return { e: false, c: false, na: false, info: '' }; } } return field || { e: false, c: false, na: false, info: '' }; }; setFormData({ ...initialFormData, ...data, data_inicio: data.data_inicio || '', data_termino_prev: data.data_termino_prev || '', status: 'aberta', prioridade: 'media', quantidade: data.quantidade || 0, info_calculo_estrutural: parseJsonField(data.info_calculo_estrutural), info_projeto_basico: parseJsonField(data.info_projeto_basico), info_detalhamento: parseJsonField(data.info_detalhamento), info_materia_prima: parseJsonField(data.info_materia_prima), info_fabricacao: parseJsonField(data.info_fabricacao), info_grades_piso: parseJsonField(data.info_grades_piso), info_jateamento: parseJsonField(data.info_jateamento), info_pintura_base: parseJsonField(data.info_pintura_base), info_pintura_inter: parseJsonField(data.info_pintura_inter), info_pintura_acabamento: parseJsonField(data.info_pintura_acabamento), info_galvanizacao: parseJsonField(data.info_galvanizacao), info_embalagem: parseJsonField(data.info_embalagem), info_transporte: parseJsonField(data.info_transporte), info_inspecao: parseJsonField(data.info_inspecao), info_ensaios_lab: parseJsonField(data.info_ensaios_lab), info_databook: parseJsonField(data.info_databook), info_pre_montagem: parseJsonField(data.info_pre_montagem), info_placa_engenetal: parseJsonField(data.info_placa_engenetal), info_parafusos: parseJsonField(data.info_parafusos), info_chumbadores: parseJsonField(data.info_chumbadores), info_stud_bolt: parseJsonField(data.info_stud_bolt), info_fornec_telhas: parseJsonField(data.info_fornec_telhas), info_montagem_telhas: parseJsonField(data.info_montagem_telhas), info_forn_calhas: parseJsonField(data.info_forn_calhas), info_mont_calhas: parseJsonField(data.info_mont_calhas), info_steel_deck: parseJsonField(data.info_steel_deck), info_fornec_wall: parseJsonField(data.info_fornec_wall), info_mont_wall: parseJsonField(data.info_mont_wall), info_outros_materiais: parseJsonField(data.info_outros_materiais), }); toast.success('OF carregada com sucesso!'); } else { toast.error('OF não encontrada'); } } catch (error) { toast.error('Erro ao carregar OF'); } }; const handleChange = (field: keyof FormData, value: any) => { setFormData(prev => ({ ...prev, [field]: value, })); }; const handleTechnicalInfoChange = (field: keyof FormData, key: keyof InfoCalculoEstrutural, value: any) => { setFormData(prev => ({ ...prev, [field]: { ...(prev[field] as InfoCalculoEstrutural), [key]: value, }, })); }; const handleSave = async () => { if (!formData.of_number) { toast.error('Número da OF é obrigatório'); return; } setIsSaving(true); try { const success = await salvarFichaTecnica(formData); if (success && !isEditing) { setFormData(initialFormData); } } catch (error) { console.error('Erro ao salvar:', error); toast.error('Erro ao salvar a OF'); } finally { setIsSaving(false); } }; const renderTechnicalInfoField = ( label: string, fieldName: keyof FormData, info: InfoCalculoEstrutural ) => (
handleTechnicalInfoChange(fieldName, 'e', checked as boolean) } />
handleTechnicalInfoChange(fieldName, 'c', checked as boolean) } />
handleTechnicalInfoChange(fieldName, 'na', checked as boolean) } />