+page.server.js 2.17 KB
import { error } from '@sveltejs/kit';

const API_BASE = 'http://136.112.29.74/api/finfun';

// Jerarquía finfun: Finalidad → Grupo Función → Función
// Códigos con punto: "1" (finalidad), "1.1" (grpfuncion), "1.1.1" (función)

function getNivel(codigo) {
  const parts = String(codigo).split('.');
  if (parts.length === 1) return 'finalidad';
  if (parts.length === 2) return 'grpfuncion';
  return 'funcion';
}

function getFinalidadCode(codigo) {
  return String(codigo).split('.')[0];
}

function getGrpFuncionCode(codigo) {
  const parts = String(codigo).split('.');
  return parts.slice(0, 2).join('.');
}

export async function load({ params }) {
  const { codigo } = params;

  // Cargar datos del finfun desde la API
  const res = await fetch(`${API_BASE}/${codigo}`);
  if (!res.ok) throw error(404, 'Finalidad/Función no encontrada');
  const finfun = await res.json();

  const nivel = finfun.nivel || getNivel(codigo);

  // Cargar clasificador completo para derivar padres e hijos
  let padres = [];
  let hijos = [];

  try {
    const clasRes = await fetch(`${API_BASE}/clasificador`);
    if (clasRes.ok) {
      const clasificador = await clasRes.json();

      // Padres
      if (nivel === 'funcion') {
        const finalidadCode = getFinalidadCode(codigo);
        const grpCode = getGrpFuncionCode(codigo);
        padres = clasificador.filter(c => c.finfun === finalidadCode || c.finfun === grpCode);
      } else if (nivel === 'grpfuncion') {
        const finalidadCode = getFinalidadCode(codigo);
        padres = clasificador.filter(c => c.finfun === finalidadCode);
      }

      // Hijos
      if (nivel === 'finalidad') {
        hijos = clasificador.filter(c =>
          c.nivel === 'grpfuncion' && getFinalidadCode(c.finfun) === codigo && c.finfun !== codigo
        );
      } else if (nivel === 'grpfuncion') {
        hijos = clasificador.filter(c =>
          c.nivel === 'funcion' && getGrpFuncionCode(c.finfun) === codigo
        );
      }

      padres.sort((a, b) => a.finfun.localeCompare(b.finfun));
      hijos.sort((a, b) => a.finfun.localeCompare(b.finfun));
    }
  } catch { /* clasificador optional */ }

  return {
    finfun,
    padres,
    hijos
  };
}