🚀 Initial commit: Versão atual do TrackSteel APP
This commit is contained in:
453
src/hooks/useFichaTecnica.tsx
Normal file
453
src/hooks/useFichaTecnica.tsx
Normal file
@@ -0,0 +1,453 @@
|
||||
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<FichaTecnicaData | null>(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
|
||||
};
|
||||
}
|
||||
Reference in New Issue
Block a user