+page.js 2.06 KB
export const ssr = false;

import { error } from '@sveltejs/kit';

import { API_HOST } from '$lib/api.js';
const API_BASE = API_HOST + '/api/rubro';

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

  const res = await fetch(`${API_BASE}/${codigo}`);
  if (!res.ok) throw error(404, 'Rubro no encontrado');
  const rubro = await res.json();

  const nivel = rubro.nivel;
  let padres = [];
  let hijos = [];

  try {
    const clasRes = await fetch(`${API_BASE}/clasificador`);
    if (clasRes.ok) {
      const clasificador = await clasRes.json();
      const s = String(codigo).padStart(5, '0');

      // Rubro codes are 5 digits: ABCDE
      // tipo = AB000, clase = ABC00, cuenta = ABCD0, sub_cuenta = ABCDE
      const tipoCode = s.substring(0, 2) + '000';
      const claseCode = s.substring(0, 3) + '00';
      const cuentaCode = s.substring(0, 4) + '0';

      // Padres según nivel
      const parentCodes = [];
      if (nivel === 'sub_cuenta') parentCodes.push(cuentaCode, claseCode, tipoCode);
      else if (nivel === 'cuenta') parentCodes.push(claseCode, tipoCode);
      else if (nivel === 'clase') parentCodes.push(tipoCode);

      padres = clasificador.filter(c => {
        const rc = String(c.rubro).padStart(5, '0');
        return parentCodes.includes(rc) && rc !== s;
      });

      // Hijos directos
      if (nivel === 'tipo') {
        hijos = clasificador.filter(c => c.nivel === 'clase' && String(c.rubro).padStart(5, '0').substring(0, 2) === s.substring(0, 2));
      } else if (nivel === 'clase') {
        hijos = clasificador.filter(c => (c.nivel === 'cuenta') && String(c.rubro).padStart(5, '0').substring(0, 3) === s.substring(0, 3));
      } else if (nivel === 'cuenta') {
        hijos = clasificador.filter(c => (c.nivel === 'sub_cuenta') && String(c.rubro).padStart(5, '0').substring(0, 4) === s.substring(0, 4));
      }

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

  return { rubro, padres, hijos };
}