fix(cronograma): corrigir salvamento e atualizacao automatica da lista de cronogramas

This commit is contained in:
2026-08-21 14:32:52 +00:00
parent 2c20ae7e3c
commit f2fd8bd699
4 changed files with 88 additions and 296 deletions
+1 -249
View File
@@ -1,249 +1 @@
import { useState, useEffect } from 'react';
import { supabase } from '@/integrations/supabase/client';
import { toast } from 'sonner';
import { useAuth } from './useAuth';
import { CronogramaOf } from '@/types/cronograma';
export const useCronogramaOperations = () => {
const { user } = useAuth();
const [cronogramas, setCronogramas] = useState<CronogramaOf[]>([]);
const [loading, setLoading] = useState(false);
const loadCronogramas = async () => {
try {
setLoading(true);
const { data: cronogramasData, error: cronogramasError } = await supabase
.from('cronogramas_of')
.select(`
*,
ordens_fabricacao (
num_of,
descritivo
),
profiles!cronogramas_of_gestor_id_fkey (
full_name,
email
)
`)
.order('created_at', { ascending: false });
if (cronogramasError) throw cronogramasError;
// Carregar processos para cada cronograma
const cronogramasComProcessos = await Promise.all(
(cronogramasData || []).map(async (cronograma) => {
const { data: processos, error: processosError } = await supabase
.from('processos_cronograma')
.select('*')
.eq('cronograma_id', cronograma.id)
.order('ordem');
if (processosError) throw processosError;
return {
id: cronograma.id,
of_id: cronograma.of_id,
gestor_id: cronograma.gestor_id,
revisao: cronograma.revisao,
processos: processos || [],
ordem_fabricacao: cronograma.ordens_fabricacao,
gestor_profile: cronograma.profiles
} as CronogramaOf;
})
);
setCronogramas(cronogramasComProcessos);
} catch (error) {
console.error('Erro ao carregar cronogramas:', error);
toast.error('Erro ao carregar cronogramas');
} finally {
setLoading(false);
}
};
const saveCronograma = async (cronograma: Partial<CronogramaOf> & { processos: any[] }) => {
try {
if (!user) throw new Error('Usuário não autenticado');
let cronogramaId: string;
if (cronograma.id) {
// Atualizar cronograma existente
const novaRevisao = cronograma.revisao ? cronograma.revisao + 1 : 1;
const { data: updatedCronograma, error: updateError } = await supabase
.from('cronogramas_of')
.update({
gestor_id: cronograma.gestor_id,
revisao: novaRevisao,
updated_at: new Date().toISOString()
})
.eq('id', cronograma.id)
.select()
.single();
if (updateError) throw updateError;
cronogramaId = updatedCronograma.id;
// Deletar processos antigos
const { error: deleteError } = await supabase
.from('processos_cronograma')
.delete()
.eq('cronograma_id', cronogramaId);
if (deleteError) throw deleteError;
} else {
// Verificar se já existe cronograma para esta OF
const { data: existingCronograma } = await supabase
.from('cronogramas_of')
.select('id, revisao')
.eq('of_id', cronograma.of_id)
.single();
if (existingCronograma) {
// Atualizar cronograma existente
const novaRevisao = existingCronograma.revisao + 1;
const { data: updatedCronograma, error: updateError } = await supabase
.from('cronogramas_of')
.update({
gestor_id: cronograma.gestor_id,
revisao: novaRevisao,
updated_at: new Date().toISOString()
})
.eq('id', existingCronograma.id)
.select()
.single();
if (updateError) throw updateError;
cronogramaId = updatedCronograma.id;
// Deletar processos antigos
const { error: deleteError } = await supabase
.from('processos_cronograma')
.delete()
.eq('cronograma_id', cronogramaId);
if (deleteError) throw deleteError;
} else {
// Criar novo cronograma
const { data: newCronograma, error: insertError } = await supabase
.from('cronogramas_of')
.insert({
of_id: cronograma.of_id,
gestor_id: cronograma.gestor_id,
revisao: 1,
created_by: user.id
})
.select()
.single();
if (insertError) throw insertError;
cronogramaId = newCronograma.id;
}
}
// Inserir novos processos
const processosParaInserir = cronograma.processos.map(processo => ({
cronograma_id: cronogramaId,
nome_processo: processo.nome_processo,
data_inicio: processo.data_inicio,
data_fim: processo.data_fim,
ordem: processo.ordem
}));
const { error: processosError } = await supabase
.from('processos_cronograma')
.insert(processosParaInserir);
if (processosError) throw processosError;
toast.success('Cronograma salvo com sucesso!');
loadCronogramas();
return true;
} catch (error) {
console.error('Erro ao salvar cronograma:', error);
toast.error('Erro ao salvar cronograma');
return false;
}
};
const deleteCronograma = async (cronogramaId: string) => {
try {
const { error } = await supabase
.from('cronogramas_of')
.delete()
.eq('id', cronogramaId);
if (error) throw error;
toast.success('Cronograma removido com sucesso!');
loadCronogramas();
return true;
} catch (error) {
console.error('Erro ao deletar cronograma:', error);
toast.error('Erro ao remover cronograma');
return false;
}
};
const getCronogramaPorOf = async (ofId: string) => {
try {
const { data: cronograma, error } = await supabase
.from('cronogramas_of')
.select(`
*,
ordens_fabricacao (
num_of,
descritivo
),
profiles!cronogramas_of_gestor_id_fkey (
full_name,
email
)
`)
.eq('of_id', ofId)
.single();
if (error && error.code !== 'PGRST116') throw error;
if (!cronograma) return null;
const { data: processos, error: processosError } = await supabase
.from('processos_cronograma')
.select('*')
.eq('cronograma_id', cronograma.id)
.order('ordem');
if (processosError) throw processosError;
return {
id: cronograma.id,
of_id: cronograma.of_id,
gestor_id: cronograma.gestor_id,
revisao: cronograma.revisao,
processos: processos || [],
ordem_fabricacao: cronograma.ordens_fabricacao,
gestor_profile: cronograma.profiles
} as CronogramaOf;
} catch (error) {
console.error('Erro ao buscar cronograma:', error);
return null;
}
};
useEffect(() => {
loadCronogramas();
}, []);
return {
cronogramas,
loading,
loadCronogramas,
saveCronograma,
deleteCronograma,
getCronogramaPorOf
};
};
export { useCronogramas as useCronogramaOperations } from './useCronogramas';