Skip to content

Commit

Permalink
Merge branch 'version-2' into version-2
Browse files Browse the repository at this point in the history
  • Loading branch information
1cgonza authored Nov 14, 2024
2 parents 4b2a139 + 70e11ee commit 0b02868
Show file tree
Hide file tree
Showing 43 changed files with 884 additions and 374 deletions.
12 changes: 8 additions & 4 deletions .github/workflows/despliegue.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
name: Despliegue
name: 🦍 Despliegue

on:
push:
Expand All @@ -11,18 +11,22 @@ jobs:

steps:
- name: 🐯 Obtener código del repositorio
uses: actions/checkout@v3
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: 🐜 Activar Corepack
run: corepack enable

- name: 🐝 Usar Node
uses: actions/setup-node@v3
uses: actions/setup-node@v4
with:
node-version: 'lts/*'
cache: 'yarn'

- name: 🦒 Instalar dependencias y hacer build
run: |
yarn install --frozen-lockfile
yarn install --immutable
yarn build
- name: 🦅 Enviar por SFTP
uses: wangyucode/sftp-upload-action@v2.0.2
Expand Down
3 changes: 3 additions & 0 deletions aplicaciones/procesador/fuente/aplicacion.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import { readdir, rm } from 'fs/promises';
import { rutaEstaticosDatos, rutaEstaticosDescarga } from './utilidades/constantes';
import calcularPesos from './datosDescarga';
import JuegoCategorias from './modulos/JuegoCategorias';
import VariableDoble from './modulos/VariableDoble';

async function inicio() {
await vaciarProcesados();
Expand Down Expand Up @@ -68,6 +69,8 @@ async function procesarDatos() {
await ya25.procesar('2.5: porcentaje marco integral', 'YA_2.5', 'Sheet 1', 'ya2-5');
const ya26 = new VariableSingular('educ_inicial_icbf', true, 'conteo');
await ya26.procesar('2.6: educación inicial icbf', 'YA_2.6', 'Sheet 1', 'ya2-6');
const ya27 = new VariableDoble('#_estudiantes', true, 'conteo', 1);
await ya27.procesar('2.7: matriculados', 'YA_2.7', 'Sheet1', 'ya2-7');

/** 3 */
const ya31 = new VariableSingular('promedio_matematicas', true, 'promedio');
Expand Down
291 changes: 291 additions & 0 deletions aplicaciones/procesador/fuente/modulos/VariableDoble.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,291 @@
import { limpiarDepartamento, limpiarMunicipio } from '../limpieza/lugar';
import type {
Departamento,
Errata,
Municipio,
RespuestaPorcentaje2,
VariableDoble,
VariableValorSingular,
} from '@/tipos';
import { esNumero, guardarJSON, redondearDecimal } from '../utilidades/ayudas';
import maquinaXlsx from '../utilidades/maquinaXlsx';
import { departamentos } from '../utilidades/lugaresColombia';
import { DatosIndicadorNal, TiposEstructura } from '../../../../tipos/compartidos';

export default class {
datosNacionales: DatosIndicadorNal;
datosDepartamentos: RespuestaPorcentaje2;
datosMunicipios: RespuestaPorcentaje2;
errata: { fila: number; error: string }[];
nombreVariableValor: VariableValorSingular;
estructura: TiposEstructura;
exportarMunicipios: boolean;

constructor(
nombreVariable: VariableValorSingular,
ascendente: boolean,
estructura: TiposEstructura,
unidadMedida = 100
) {
this.datosNacionales = {
ascendente,
estructura,
unidadMedida,
datos: {},
datosMunicipio: true,
maxNal: 0,
minNal: Infinity,
maxDep: 0,
minDep: Infinity,
maxMun: 0,
minMun: Infinity,
};
this.errata = [];
this.datosMunicipios = {};
this.datosDepartamentos = {};
this.nombreVariableValor = nombreVariable;
this.estructura = estructura;
this.exportarMunicipios = true;
}

async procesar(nombreReferencia: string, nombreArchivo: string, hoja: string, nombreParaArchivo: string) {
await maquinaXlsx(nombreReferencia, nombreArchivo, hoja, this.procesarMunicipios);
this.procesarDepartamentos();
this.procesarNacional();

if (!this.exportarMunicipios) this.datosNacionales.datosMunicipio = false;
guardarJSON(this.datosMunicipios, `${nombreParaArchivo}-mun`);
guardarJSON(this.datosDepartamentos, `${nombreParaArchivo}-dep`);
guardarJSON(this.datosNacionales, `${nombreParaArchivo}-nal`);

if (this.errata.length) guardarJSON(this.errata, `Errata ${nombreParaArchivo}`);
}

validarValor(valor: number, numeroFila: number) {
if (valor && isNaN(valor)) {
this.errata.push({ fila: numeroFila, error: `el valor no es un número: ${valor}` });
return false;
}

return true;
}

procesarMunicipios = (fila: VariableDoble, numeroFila: number) => {
const valor = fila['#_estudiantes'];
const categoria = fila.sector;

if (fila.hasOwnProperty('codmpio')) {
const municipio = limpiarMunicipio(+fila.codmpio);
const tieneValor = this.validarValor(valor, numeroFila);
if (!tieneValor) return;

// Si no existe el municipio
if (municipio.hasOwnProperty('error') && valor) {
// El código de datos nacionales es 1001 entonces lo podemos comparar directo.
if (fila.codmpio == 1001) {
this.datosNacionales.datos[fila.anno] = valor;
return;
}
// Si termina en 00 y no lo encontró antes significa que es el dato del departamento.
// else if (`${fila.codmpio}`.slice(-2) === '00') {
// // Poner ceros al principio y convertir a texto para que quede bien al comparar con código departamento.
// const codigoCompleto = `${fila.codmpio}`.padStart(5, '0');
// const codigoDep = codigoCompleto.slice(0, 2); // sacar los primeros dos números.
// const dep = departamentos.datos.find((obj) => obj[0] === codigoDep); // buscar el departamento.

// // agregar datos del departamento si existen.
// if (dep) {
// if (!this.datosDepartamentos[fila.anno]) {
// this.datosDepartamentos[fila.anno] = [];
// }

// this.datosDepartamentos[fila.anno].push([(dep as Departamento)[0], valor]);
// return;
// } else {
// this.errata.push({ fila: numeroFila, error: `No existe departamento con código: ${codigoDep}` });
// }
// }

// No pasó ninguna prueba, registrar en errata para revisar el caso.
this.errata.push({ fila: numeroFila, error: (municipio as Errata).mensaje });
return;
}

this.registrarAño(numeroFila, fila.anno, { datos: municipio, valor, categoria });
} else {
// if (fila.hasOwnProperty('coddepto') && fila.coddepto) {
// const departamento = limpiarDepartamento(+fila.coddepto);
// const tieneValor = this.validarValor(valor, numeroFila);
// if (!tieneValor) return;
// this.revisarMinMax(valor, 'maxDep', 'minDep');
// this.exportarMunicipios = false;
// this.registrarAño(numeroFila, fila.anno, null, { datos: departamento, valor });
// } else {
// this.errata.push({ fila: numeroFila, error: `No hay valor en coddepto` });
// }
}
};

procesarDepartamentos() {
if (this.exportarMunicipios) {
for (const año in this.datosMunicipios) {
const datosAño = this.datosMunicipios[año];
const deps: { [codDep: string]: [total: number, noOficial: number, oficial: number][] } = {};

datosAño.forEach((municipio) => {
const codDepartamento = municipio[0].slice(0, 2);
if (!deps[codDepartamento]) {
deps[codDepartamento] = [];
}

deps[codDepartamento].push([municipio[1], municipio[2], municipio[3]]);
});

for (const codDep in deps) {
const yaExiste =
this.datosDepartamentos[año] && this.datosDepartamentos[año].find(([codigo]) => codigo === codDep);

if (yaExiste) {
// Ya existen datos departamentales, no hacer nada.
} else {
// No hay datos de este departamento en la tabla original, procesarlos con los datos que tenemos de los municipios.
const departamento = limpiarDepartamento(+codDep);

if (departamento.hasOwnProperty('error')) {
this.errata.push({ fila: Infinity, error: (departamento as Errata).mensaje });
} else {
if (!this.datosDepartamentos[año]) {
this.datosDepartamentos[año] = [];
}

const suma = deps[codDep].reduce(
(valorAnterior, valorActual) => [
valorAnterior[0] + valorActual[0],
valorAnterior[1] + valorActual[1],
valorAnterior[2] + valorActual[2],
],
[0, 0, 0]
);
if (this.estructura === 'conteo') {
this.revisarMinMax(suma[0], 'maxDep', 'minDep');
this.datosDepartamentos[año].push([(departamento as Departamento)[0], suma[0], suma[1], suma[2]]);
} else {
// const porcentaje = redondearDecimal(suma / deps[codDep].length, 1, 2);
// this.revisarMinMax(porcentaje, 'maxDep', 'minDep');
// this.datosDepartamentos[año].push([(departamento as Departamento)[0], porcentaje]);
}
}
}
}
}
}
}

procesarNacional() {
for (const año in this.datosDepartamentos) {
if (this.datosNacionales.datos[año]) {
this.revisarMinMax(this.datosNacionales.datos[año] as number, 'maxNal', 'minNal');
// Ya existen datos a nivel nacional para este año
} else {
// No hay datos nacionales, sacarlos a partir de los datos departamentales.
const datosAño = this.datosDepartamentos[año];
const suma = datosAño.reduce(
(depAnterior, valorActual) => [
'',
depAnterior[1] + valorActual[1],
depAnterior[2] + valorActual[2],
depAnterior[3] + valorActual[3],
],
['', 0, 0, 0]
);

if (this.estructura === 'conteo') {
this.revisarMinMax(suma[1], 'maxNal', 'minNal');
this.datosNacionales.datos[año] = [suma[1], suma[2], suma[3]];
} else {
// const porcentaje = redondearDecimal(suma[1] / datosAño.length, 1, 2);
// this.revisarMinMax(porcentaje, 'maxNal', 'minNal');
// this.datosNacionales.datos[año] = porcentaje;
}
}
}
}

registrarAño(
numeroFila: number,
año: number | string,
municipio: { datos: Municipio | Errata; valor?: number; categoria?: string } | null,
departamento?: { datos: Departamento | Errata; valor?: number; categoria?: string }
) {
if (año) {
if (esNumero(`${año}`)) {
const indice = parseInt(`${año}`.replace(',', ''));

if (!indice) {
console.log(año, indice, parseInt(`${año}`), esNumero(`${año}`));
}

if (!this.datosMunicipios[indice]) {
this.datosMunicipios[indice] = [];
}

if (!this.exportarMunicipios) {
if (!this.datosDepartamentos[indice]) {
this.datosDepartamentos[indice] = [];
}
}

if (municipio && municipio.valor) {
const codMunicipio = (municipio.datos as Municipio)[3];
let existe = this.datosMunicipios[indice].find(([lugar]) => lugar === codMunicipio);

if (!existe) {
existe = [(municipio.datos as Municipio)[3], 0, 0, 0];

if (municipio.categoria && municipio.categoria === 'NO_OFICIAL') {
existe[3] = redondearDecimal(municipio.valor, 1, 2);
} else if (municipio.categoria && municipio.categoria === 'OFICIAL') {
existe[2] = redondearDecimal(municipio.valor, 1, 2);
}

existe[1] = existe[3] + existe[2];
this.revisarMinMax(existe[1], 'maxMun', 'minMun');

this.datosMunicipios[indice].push(existe);
} else {
if (municipio.categoria && municipio.categoria === 'NO_OFICIAL') {
existe[3] = redondearDecimal(municipio.valor, 1, 2);
} else if (municipio.categoria && municipio.categoria === 'OFICIAL') {
existe[2] = redondearDecimal(municipio.valor, 1, 2);
}

existe[1] = existe[3] + existe[2];

this.revisarMinMax(existe[1], 'maxMun', 'minMun');
}
}

if (departamento && departamento.valor) {
// this.datosDepartamentos[indice].push([
// (departamento.datos as Departamento)[0],
// redondearDecimal(departamento.valor, 1, 2),
// ]);
}
} else {
this.errata.push({ fila: numeroFila, error: `El año ${año} no es número.` });
}
} else {
this.errata.push({ fila: numeroFila, error: `No hay año en esta fila, sino ${año}` });
}
}

revisarMinMax(valor: number, llaveMax: 'maxNal' | 'maxDep' | 'maxMun', llaveMin: 'minNal' | 'minDep' | 'minMun') {
if (this.datosNacionales[llaveMax] < valor) {
this.datosNacionales[llaveMax] = valor;
}

if (this.datosNacionales[llaveMin] > valor) {
this.datosNacionales[llaveMin] = valor;
}
}
}
15 changes: 14 additions & 1 deletion aplicaciones/procesador/fuente/tipos.ts
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,10 @@ export type RespuestaPorcentaje = {
[año: string]: [lugar: string, porcentaje: number, variable2?: number][];
};

export type RespuestaPorcentaje2 = {
[año: string]: [lugar: string, total: number, noOficial: number, oficial: number][];
};

export type RespuestaCategorias = {
[año: string]: [lugar: string, valor: { [categoria: string]: number }][];
};
Expand Down Expand Up @@ -126,12 +130,21 @@ export type VariableValorSingular =
| 'porcentaje'
| 'P51'
| 'educ_inicial_icbf'
| 'porcentaje_nacidos_vivos_personal_calificado';
| 'porcentaje_nacidos_vivos_personal_calificado'
| '#_estudiantes';

export type VariablesSingulares = {
[llave in VariableValorSingular]: number;
};

export type VariableDoble = {
'#_estudiantes': number;
sector: string;
codmpio: number;
anno: number;
coddepto?: number;
};

export type VariablesNumDen = {
anno: string;
departamento: string;
Expand Down
2 changes: 1 addition & 1 deletion aplicaciones/procesador/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
"@types/cli-color": "^2.0.6",
"@types/cli-progress": "^3.11.6",
"@types/geojson": "^7946.0.14",
"@types/node": "^22.7.5",
"@types/node": "^22.9.0",
"nodemon": "^3.1.7",
"rimraf": "^6.0.1",
"ts-node": "^10.9.2"
Expand Down
3 changes: 3 additions & 0 deletions aplicaciones/www/astro.config.mjs
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
import { defineConfig } from 'astro/config';
import sitemap from '@astrojs/sitemap';
import robotsTxt from 'astro-robots-txt';

export default defineConfig({
publicDir: './estaticos',
compressHTML: true,
outDir: './publico',
site: 'https://imagina.uniandes.edu.co',
base: '/especiales/siya',
integrations: [sitemap(), robotsTxt()],
build: {
assets: 'estaticos',
},
Expand Down
Loading

0 comments on commit 0b02868

Please sign in to comment.