🚀 Initial commit: Versão atual do TrackSteel APP

This commit is contained in:
2026-03-18 21:17:53 +00:00
commit bde410c9ad
633 changed files with 108150 additions and 0 deletions

View 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
};
}