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

// Funciones para derivar jerarquía del código finfun
// Jerarquía: Finalidad (1-9 o 10) → Grupo Función (2-3 dígitos) → Función (3+ dígitos)
// Nota: Finalidad 10 es especial - tiene 2 dígitos, sus hijos empiezan con "10"

function getFinalidadCode(finfun) {
  const code = String(finfun);
  // Si empieza con "10", la finalidad es "10"
  if (code.startsWith('10')) {
    return '10';
  }
  // Si no, la finalidad es el primer dígito
  return code.charAt(0);
}

function getGrpFuncionCode(finfun) {
  const code = String(finfun);
  // Si empieza con "10", el grupo función son los primeros 3 dígitos (ej: "101", "102")
  if (code.startsWith('10')) {
    return code.substring(0, 3);
  }
  // Si no, son los primeros 2 dígitos (ej: "11", "21", "93")
  return code.substring(0, 2);
}

function getNivel(finfun) {
  const code = String(finfun);
  // Finalidades 1-9 tienen longitud 1, finalidad 10 tiene longitud 2
  if (code.length === 1) return 'finalidad';
  if (code === '10') return 'finalidad';
  // GrpFuncion: 2 dígitos para 1-9, 3 dígitos para 10
  if (code.startsWith('10')) {
    if (code.length === 3) return 'grpfuncion';
    return 'funcion';
  }
  if (code.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 de esta finalidad
    const { data: hijosData } = await supabase
      .schema('ppto')
      .from('clas_finfun')
      .select('*')
      .eq('nivel', 'grpfuncion')
      .order('finfun');

    // Filtrar solo los hijos directos de esta finalidad
    // Para finalidad "1": hijos son "11", "12", ..., "19" (NO "10x")
    // Para finalidad "10": hijos son "101", "102", ..., "109"
    if (hijosData) {
      hijos = hijosData.filter(h => {
        const hijoPadre = getFinalidadCode(h.finfun);
        return hijoPadre === codigo;
      });
    }
  } else if (nivel === 'grpfuncion') {
    // Hijos: funciones de este grupo
    const grpCode = getGrpFuncionCode(codigo);
    const { data: hijosData } = await supabase
      .schema('ppto')
      .from('clas_finfun')
      .select('*')
      .eq('nivel', 'funcion')
      .order('finfun');

    // Filtrar solo los hijos directos de este grupo
    if (hijosData) {
      hijos = hijosData.filter(h => {
        const hijoGrp = getGrpFuncionCode(h.finfun);
        return hijoGrp === grpCode;
      });
    }
  }
  // funcion no tiene hijos

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

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