+page.server.js 2.9 KB
import { supabase } from '$lib/supabase';
import { error } from '@sveltejs/kit';

// Funciones para derivar jerarquía del código finfun
// Jerarquía: Finalidad (1 dígito) → Grupo Función (2 dígitos) → Función (3+ dígitos)
function getFinalidadCode(finfun) {
  return finfun.charAt(0);
}

function getGrpFuncionCode(finfun) {
  return finfun.substring(0, 2);
}

function getNivel(finfun) {
  if (finfun.length === 1) return 'finalidad';
  if (finfun.length === 2) return 'grpfuncion';
  return 'funcion';
}

export async function load({ params }) {
  console.time('[SERVER] Total load finfun');
  const { codigo } = params;

  console.time('[SERVER] Query clas_finfun');
  const { data, error: dbError } = await supabase
    .schema('ppto')
    .from('clas_finfun')
    .select('*')
    .eq('finfun', codigo);
  console.timeEnd('[SERVER] Query clas_finfun');

  if (dbError || !data || data.length === 0) {
    throw error(404, 'Finalidad/Función no encontrada');
  }

  // Tomar el primer resultado
  const finfun = data[0];
  const nivel = finfun.nivel || getNivel(codigo);

  // Obtener jerarquía (padres e hijos)
  let padres = [];
  let hijos = [];

  console.time('[SERVER] Query padres');

  // Buscar padres según nivel
  if (nivel === 'funcion') {
    // Padres: finalidad y grupo función
    const finalidadCode = getFinalidadCode(codigo);
    const grpFuncionCode = getGrpFuncionCode(codigo);

    const { data: padresData } = await supabase
      .schema('ppto')
      .from('clas_finfun')
      .select('*')
      .in('finfun', [finalidadCode, grpFuncionCode])
      .order('finfun');

    if (padresData) padres = padresData;
  } else if (nivel === 'grpfuncion') {
    // Padre: finalidad
    const finalidadCode = getFinalidadCode(codigo);

    const { data: padresData } = await supabase
      .schema('ppto')
      .from('clas_finfun')
      .select('*')
      .eq('finfun', finalidadCode);

    if (padresData) padres = padresData;
  }
  // finalidad no tiene padres

  console.timeEnd('[SERVER] Query padres');

  console.time('[SERVER] Query hijos');

  // Buscar hijos según nivel
  if (nivel === 'finalidad') {
    // Hijos: grupos de función que empiecen con el mismo dígito
    const { data: hijosData } = await supabase
      .schema('ppto')
      .from('clas_finfun')
      .select('*')
      .eq('nivel', 'grpfuncion')
      .like('finfun', `${codigo}%`)
      .order('finfun');

    hijos = hijosData || [];
  } else if (nivel === 'grpfuncion') {
    // Hijos: funciones que empiecen con los mismos 2 dígitos
    const { data: hijosData } = await supabase
      .schema('ppto')
      .from('clas_finfun')
      .select('*')
      .eq('nivel', 'funcion')
      .like('finfun', `${codigo}%`)
      .order('finfun');

    hijos = hijosData || [];
  }
  // funcion no tiene hijos

  console.timeEnd('[SERVER] Query hijos');

  console.timeEnd('[SERVER] Total load finfun');
  return {
    finfun,
    padres,
    hijos
  };
}