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

// Funciones para derivar jerarquía del código objeto
function getGrupoCode(objeto) {
  return objeto.charAt(0) + '0000';
}

function getSubgrupoCode(objeto) {
  return objeto.substring(0, 2) + '000';
}

function getPartidaCode(objeto) {
  return objeto.substring(0, 3) + '00';
}

function getNivel(objeto) {
  if (objeto.endsWith('0000')) return 'grupo';
  if (objeto.endsWith('000')) return 'subgrupo';
  if (objeto.endsWith('00')) return 'partida';
  return 'subpartida';
}

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

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

  if (dbError || !data || data.length === 0) {
    throw error(404, 'Objeto no encontrado');
  }

  // Tomar el primer resultado
  const objeto = data[0];
  const nivel = objeto.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 === 'subpartida') {
    // Padres: grupo, subgrupo, partida
    const grupoCode = getGrupoCode(codigo);
    const subgrupoCode = getSubgrupoCode(codigo);
    const partidaCode = getPartidaCode(codigo);

    const { data: padresData } = await supabase
      .schema('ppto')
      .from('clas_objetos')
      .select('*')
      .in('objeto', [grupoCode, subgrupoCode, partidaCode])
      .order('objeto');

    if (padresData) padres = padresData;
  } else if (nivel === 'partida') {
    // Padres: grupo, subgrupo
    const grupoCode = getGrupoCode(codigo);
    const subgrupoCode = getSubgrupoCode(codigo);

    const { data: padresData } = await supabase
      .schema('ppto')
      .from('clas_objetos')
      .select('*')
      .in('objeto', [grupoCode, subgrupoCode])
      .order('objeto');

    if (padresData) padres = padresData;
  } else if (nivel === 'subgrupo') {
    // Padre: grupo
    const grupoCode = getGrupoCode(codigo);

    const { data: padresData } = await supabase
      .schema('ppto')
      .from('clas_objetos')
      .select('*')
      .eq('objeto', grupoCode);

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

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

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

  // Buscar hijos según nivel
  if (nivel === 'grupo') {
    // Hijos: subgrupos que empiecen con el mismo dígito
    const prefix = codigo.charAt(0);
    const { data: hijosData } = await supabase
      .schema('ppto')
      .from('clas_objetos')
      .select('*')
      .eq('nivel', 'subgrupo')
      .like('objeto', `${prefix}%`)
      .order('objeto');

    hijos = hijosData || [];
  } else if (nivel === 'subgrupo') {
    // Hijos: partidas que empiecen con los mismos 2 dígitos
    const prefix = codigo.substring(0, 2);
    const { data: hijosData } = await supabase
      .schema('ppto')
      .from('clas_objetos')
      .select('*')
      .eq('nivel', 'partida')
      .like('objeto', `${prefix}%`)
      .order('objeto');

    hijos = hijosData || [];
  } else if (nivel === 'partida') {
    // Hijos: subpartidas que empiecen con los mismos 3 dígitos
    const prefix = codigo.substring(0, 3);
    const { data: hijosData } = await supabase
      .schema('ppto')
      .from('clas_objetos')
      .select('*')
      .eq('nivel', 'subpartida')
      .like('objeto', `${prefix}%`)
      .order('objeto');

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

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

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