import { useState, useCallback } from 'react'; import { useQuery } from '@tanstack/react-query'; import { supabase } from '@/integrations/supabase/client'; import { useAuth } from './useAuth'; import { toast } from 'sonner'; export interface FichaTecnicaData { id?: string; of_number: string; gestor?: string; projetista?: string; revisao?: string; quantidade?: number; data_criacao?: string; data_inicio?: string; data_termino_prev?: string; // Dados do Cliente cliente?: string; cnpj?: string; ie?: string; endereco?: string; cidade?: string; estado?: string; cep?: string; contato_contrato?: string; fone_contrato?: string; cel_contrato?: string; email_contrato?: string; contato_obra?: string; fone_obra?: string; cel_obra?: string; email_obra?: string; contato_qualid?: string; fone_qualid?: string; cel_qualid?: string; email_qualid?: string; // Dados da Obra eng_responsavel?: string; telefone_obra?: string; email_obra_responsavel?: string; endereco_obra?: string; cep_obra?: string; bairro_obra?: string; cidade_obra?: string; estado_obra?: string; observacoes_obra?: string; // Dados do Projeto descricao_resumida?: string; endereco_projeto?: string; bairro_projeto?: string; cep_projeto?: string; cidade_projeto?: string; estado_projeto?: string; horarios_trabalho?: string; condicoes_acesso?: string; // Tipo de Projeto tipo_estrutural?: boolean; tipo_residencial?: boolean; tipo_espacial?: boolean; tipo_comercial?: boolean; tipo_grades?: boolean; tipo_industrial?: boolean; tipo_cobertura?: boolean; tipo_com_montagem?: boolean; // Documentos fornecidos doc_calculo?: boolean; doc_projeto?: boolean; doc_detalhamento?: boolean; doc_cronograma?: boolean; doc_normas?: boolean; doc_especif_tecnicas?: boolean; doc_catalogo?: boolean; doc_fotos?: boolean; // Informações do projeto info_calculo_estrutural?: any; info_projeto_basico?: any; info_detalhamento?: any; info_materia_prima?: any; info_fabricacao?: any; info_grades_piso?: any; info_jateamento?: any; info_pintura_base?: any; info_pintura_inter?: any; info_pintura_acabamento?: any; info_galvanizacao?: any; info_embalagem?: any; info_transporte?: any; info_inspecao?: any; info_ensaios_lab?: any; info_databook?: any; info_pre_montagem?: any; info_placa_engenetal?: any; info_parafusos?: any; info_chumbadores?: any; info_stud_bolt?: any; info_fornec_telhas?: any; info_montagem_telhas?: any; info_forn_calhas?: any; info_mont_calhas?: any; info_steel_deck?: any; info_fornec_wall?: any; info_mont_wall?: any; info_outros_materiais?: any; // Validação necessita_validacao_pos_detalh?: boolean; // Grades de piso grades_modelo?: string; grades_padrao_comercial?: boolean; grades_padrao_sa2?: boolean; grades_padrao_sa2_meio?: boolean; grades_padrao_sa3?: boolean; // Requisitos req_ambientais_existem?: boolean; req_ambientais_quais?: string; req_saude_seguranca_existem?: boolean; req_saude_seguranca_quais?: string; // Alterações alteracao_descritivo?: string; alteracao_motivo?: string; alteracao_impacto?: string; alteracao_custo?: number; alteracao_cronograma?: string; alteracao_pecas_prontas?: string; alteracao_detalh_projeto?: string; // Cronograma cronograma_semanas?: any; // Vistos visto_gestor?: string; visto_pcp?: string; visto_eng?: string; visto_fab?: string; visto_exp?: string; visto_qual?: string; visto_colunas?: any; } export function useFichaTecnica() { const { user } = useAuth(); const [loading, setLoading] = useState(false); const [fichaTecnica, setFichaTecnica] = useState(null); // Query to fetch all fichas técnicas for the user const { data: fichasTecnicas, isLoading: isLoadingFichas } = useQuery({ queryKey: ['fichas-tecnicas', user?.id], queryFn: async () => { if (!user) return []; const { data, error } = await supabase .from('ficha_tecnica_contratos') .select('*') .eq('user_id', user.id) .order('of_number', { ascending: true }); if (error) { console.error('Erro ao buscar fichas técnicas:', error); throw error; } return data as FichaTecnicaData[]; }, enabled: !!user }); const buscarFichaTecnica = useCallback(async (ofNumber: string) => { if (!user || !ofNumber.trim()) return; setLoading(true); try { const { data, error } = await supabase .from('ficha_tecnica_contratos') .select('*') .eq('of_number', ofNumber.trim()) .eq('user_id', user.id) .maybeSingle(); if (error) { console.error('Erro ao buscar ficha técnica:', error); toast.error('Erro ao buscar ficha técnica'); return null; } console.log('Ficha técnica encontrada:', data); setFichaTecnica(data); return data; } catch (error) { console.error('Erro ao buscar ficha técnica:', error); toast.error('Erro ao buscar ficha técnica'); return null; } finally { setLoading(false); } }, [user]); const salvarFichaTecnica = useCallback(async (data: FichaTecnicaData) => { if (!user) { toast.error('Usuário não autenticado'); return false; } if (!data.of_number?.trim()) { toast.error('Número da OF é obrigatório'); return false; } setLoading(true); try { console.log('Salvando ficha técnica com datas:', { data_inicio: data.data_inicio, data_termino_prev: data.data_termino_prev }); // Criar objeto com APENAS os campos que existem no banco de dados const dataToSave = { // Campos básicos obrigatórios of_number: data.of_number.trim(), user_id: user.id, updated_at: new Date().toISOString(), // Informações básicas gestor: data.gestor || null, projetista: data.projetista || null, revisao: data.revisao || '0', quantidade: data.quantidade || null, data_criacao: data.data_criacao || new Date().toISOString().split('T')[0], data_inicio: data.data_inicio || null, data_termino_prev: data.data_termino_prev || null, // Dados do Cliente cliente: data.cliente || null, cnpj: data.cnpj || null, ie: data.ie || null, endereco: data.endereco || null, cidade: data.cidade || null, estado: data.estado || null, cep: data.cep || null, contato_contrato: data.contato_contrato || null, fone_contrato: data.fone_contrato || null, cel_contrato: data.cel_contrato || null, email_contrato: data.email_contrato || null, contato_obra: data.contato_obra || null, fone_obra: data.fone_obra || null, cel_obra: data.cel_obra || null, email_obra: data.email_obra || null, contato_qualid: data.contato_qualid || null, fone_qualid: data.fone_qualid || null, cel_qualid: data.cel_qualid || null, email_qualid: data.email_qualid || null, // Dados da Obra eng_responsavel: data.eng_responsavel || null, telefone_obra: data.telefone_obra || null, email_obra_responsavel: data.email_obra_responsavel || null, endereco_obra: data.endereco_obra || null, cep_obra: data.cep_obra || null, bairro_obra: data.bairro_obra || null, cidade_obra: data.cidade_obra || null, estado_obra: data.estado_obra || null, observacoes_obra: data.observacoes_obra || null, // Dados do Projeto descricao_resumida: data.descricao_resumida || null, endereco_projeto: data.endereco_projeto || null, bairro_projeto: data.bairro_projeto || null, cep_projeto: data.cep_projeto || null, cidade_projeto: data.cidade_projeto || null, estado_projeto: data.estado_projeto || null, horarios_trabalho: data.horarios_trabalho || null, condicoes_acesso: data.condicoes_acesso || null, // Tipos de Projeto tipo_estrutural: Boolean(data.tipo_estrutural), tipo_residencial: Boolean(data.tipo_residencial), tipo_espacial: Boolean(data.tipo_espacial), tipo_comercial: Boolean(data.tipo_comercial), tipo_grades: Boolean(data.tipo_grades), tipo_industrial: Boolean(data.tipo_industrial), tipo_cobertura: Boolean(data.tipo_cobertura), tipo_com_montagem: Boolean(data.tipo_com_montagem), // Documentos fornecidos doc_calculo: Boolean(data.doc_calculo), doc_projeto: Boolean(data.doc_projeto), doc_detalhamento: Boolean(data.doc_detalhamento), doc_cronograma: Boolean(data.doc_cronograma), doc_normas: Boolean(data.doc_normas), doc_especif_tecnicas: Boolean(data.doc_especif_tecnicas), doc_catalogo: Boolean(data.doc_catalogo), doc_fotos: Boolean(data.doc_fotos), // Informações técnicas (JSONB) info_calculo_estrutural: data.info_calculo_estrutural || { e: false, c: false, na: false, info: '' }, info_projeto_basico: data.info_projeto_basico || { e: false, c: false, na: false, info: '' }, info_detalhamento: data.info_detalhamento || { e: false, c: false, na: false, info: '' }, info_materia_prima: data.info_materia_prima || { e: false, c: false, na: false, info: '' }, info_fabricacao: data.info_fabricacao || { e: false, c: false, na: false, info: '' }, info_grades_piso: data.info_grades_piso || { e: false, c: false, na: false, info: '' }, info_jateamento: data.info_jateamento || { e: false, c: false, na: false, info: '' }, info_pintura_base: data.info_pintura_base || { e: false, c: false, na: false, info: '' }, info_pintura_inter: data.info_pintura_inter || { e: false, c: false, na: false, info: '' }, info_pintura_acabamento: data.info_pintura_acabamento || { e: false, c: false, na: false, info: '' }, info_galvanizacao: data.info_galvanizacao || { e: false, c: false, na: false, info: '' }, info_embalagem: data.info_embalagem || { e: false, c: false, na: false, info: '' }, info_transporte: data.info_transporte || { e: false, c: false, na: false, info: '' }, info_inspecao: data.info_inspecao || { e: false, c: false, na: false, info: '' }, info_ensaios_lab: data.info_ensaios_lab || { e: false, c: false, na: false, info: '' }, info_databook: data.info_databook || { e: false, c: false, na: false, info: '' }, info_pre_montagem: data.info_pre_montagem || { e: false, c: false, na: false, info: '' }, info_placa_engenetal: data.info_placa_engenetal || { e: false, c: false, na: false, info: '' }, info_parafusos: data.info_parafusos || { e: false, c: false, na: false, info: '' }, info_chumbadores: data.info_chumbadores || { e: false, c: false, na: false, info: '' }, info_stud_bolt: data.info_stud_bolt || { e: false, c: false, na: false, info: '' }, info_fornec_telhas: data.info_fornec_telhas || { e: false, c: false, na: false, info: '' }, info_montagem_telhas: data.info_montagem_telhas || { e: false, c: false, na: false, info: '' }, info_forn_calhas: data.info_forn_calhas || { e: false, c: false, na: false, info: '' }, info_mont_calhas: data.info_mont_calhas || { e: false, c: false, na: false, info: '' }, info_steel_deck: data.info_steel_deck || { e: false, c: false, na: false, info: '' }, info_fornec_wall: data.info_fornec_wall || { e: false, c: false, na: false, info: '' }, info_mont_wall: data.info_mont_wall || { e: false, c: false, na: false, info: '' }, info_outros_materiais: data.info_outros_materiais || { e: false, c: false, na: false, info: '' }, // Validação necessita_validacao_pos_detalh: Boolean(data.necessita_validacao_pos_detalh), // Grades grades_modelo: data.grades_modelo || null, grades_padrao_comercial: Boolean(data.grades_padrao_comercial), grades_padrao_sa2: Boolean(data.grades_padrao_sa2), grades_padrao_sa2_meio: Boolean(data.grades_padrao_sa2_meio), grades_padrao_sa3: Boolean(data.grades_padrao_sa3), // Requisitos req_ambientais_existem: Boolean(data.req_ambientais_existem), req_ambientais_quais: data.req_ambientais_quais || null, req_saude_seguranca_existem: Boolean(data.req_saude_seguranca_existem), req_saude_seguranca_quais: data.req_saude_seguranca_quais || null, // Alterações alteracao_descritivo: data.alteracao_descritivo || null, alteracao_motivo: data.alteracao_motivo || null, alteracao_impacto: data.alteracao_impacto || null, alteracao_custo: data.alteracao_custo || null, alteracao_cronograma: data.alteracao_cronograma || null, alteracao_pecas_prontas: data.alteracao_pecas_prontas || null, alteracao_detalh_projeto: data.alteracao_detalh_projeto || null, // Cronograma e Vistos (JSONB) cronograma_semanas: data.cronograma_semanas || {}, // Vistos visto_gestor: data.visto_gestor || null, visto_pcp: data.visto_pcp || null, visto_eng: data.visto_eng || null, visto_fab: data.visto_fab || null, visto_exp: data.visto_exp || null, visto_qual: data.visto_qual || null, visto_colunas: data.visto_colunas || { '1': false, '2': false, '3': false, '4': false } }; if (data.id) { // Atualizar registro existente const { error } = await supabase .from('ficha_tecnica_contratos') .update(dataToSave) .eq('id', data.id) .eq('user_id', user.id); if (error) { console.error('Erro ao atualizar ficha técnica:', error); toast.error(`Erro ao atualizar ficha técnica: ${error.message}`); return false; } toast.success('Ficha técnica atualizada com sucesso!'); } else { // Verificar se já existe uma ficha para esta OF const { data: existingFicha } = await supabase .from('ficha_tecnica_contratos') .select('id') .eq('of_number', data.of_number.trim()) .eq('user_id', user.id) .maybeSingle(); if (existingFicha) { // Atualizar a ficha existente const { error } = await supabase .from('ficha_tecnica_contratos') .update(dataToSave) .eq('id', existingFicha.id) .eq('user_id', user.id); if (error) { console.error('Erro ao atualizar ficha técnica existente:', error); toast.error(`Erro ao atualizar ficha técnica: ${error.message}`); return false; } toast.success('Ficha técnica atualizada com sucesso!'); } else { // Criar nova ficha const { data: newData, error } = await supabase .from('ficha_tecnica_contratos') .insert([dataToSave]) .select() .single(); if (error) { console.error('Erro ao criar ficha técnica:', error); toast.error(`Erro ao criar ficha técnica: ${error.message}`); return false; } setFichaTecnica(newData); toast.success('Ficha técnica criada com sucesso!'); } } return true; } catch (error) { console.error('Erro inesperado ao salvar ficha técnica:', error); toast.error('Erro inesperado ao salvar ficha técnica'); return false; } finally { setLoading(false); } }, [user]); const limparFichaTecnica = useCallback(() => { setFichaTecnica(null); }, []); return { fichaTecnica, fichasTecnicas, loading, isLoadingFichas, buscarFichaTecnica, salvarFichaTecnica, limparFichaTecnica, setFichaTecnica }; }