Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
102 commits
Select commit Hold shift + click to select a range
3eff101
alerta añadida
Pablo-H-H Jun 6, 2025
af85b57
corrreccion de eslint
Pablo-H-H Jun 6, 2025
aa2b376
quitar el centrado proque el scroll horizontal se rompe
Pablo-H-H Jun 6, 2025
6a88158
Merge pull request #197 from CodeAnd-Co/bugfix/PHHM_Analisis_Alerta_P…
Pablo-H-H Jun 6, 2025
7e8ecb2
Corrección
jotapeeeeee Jun 9, 2025
64160d8
retirarDatos ahora no desaparece el título
jotapeeeeee Jun 9, 2025
546b32d
Corrección de datos de contacto
jotapeeeeee Jun 9, 2025
46eade8
No elimnar menajes de error cuando se crea usaurio
Johnccg Jun 9, 2025
552e39e
Hacer que los mensajes de error sean iguales
Johnccg Jun 10, 2025
8ff9d55
Refactorizar función async function inicializarModuloGestionUsuarios()
Johnccg Jun 10, 2025
d579b96
Arreglar indentación
Johnccg Jun 10, 2025
2b509c5
Alerta Creada
Pablo-H-H Jun 10, 2025
23ad206
Refactorizar función function cargarPagina
Johnccg Jun 10, 2025
2f02434
Arreglar errores en crear usuario
Johnccg Jun 10, 2025
9d92449
Refactorizar fucnión mostrar usuarios
Johnccg Jun 10, 2025
405b971
Eslint
Pablo-H-H Jun 11, 2025
8311841
Merge pull request #199 from CodeAnd-Co/bugfix/PHHM_Altera_Cancelar_S…
Johnccg Jun 11, 2025
683437a
Cambiar estado GPS
Pablo-H-H Jun 11, 2025
218a7d6
Comentarios de Jsdocs
Pablo-H-H Jun 11, 2025
7377423
Merge pull request #200 from CodeAnd-Co/bugfix/PHHM_GPS_Selector_Unico
July230 Jun 11, 2025
42f6f04
Avance de refactorizar nodificar usuario
Johnccg Jun 11, 2025
0e6b09e
Refactorizar validaciónes anteriores
Johnccg Jun 11, 2025
af2327c
buscador quita parametros
Pablo-H-H Jun 11, 2025
d32763a
correcion eslint
Pablo-H-H Jun 11, 2025
17f21c7
Merge pull request #201 from CodeAnd-Co/bugfix/PHHM_Buscador_Quita_Pa…
July230 Jun 11, 2025
587949b
Refactor validación modificar usuario
Johnccg Jun 11, 2025
92f0302
Trminar refactorizacion modificar usuario
Johnccg Jun 11, 2025
e3aa092
Refactorizar configurarValidacionesCampos
Johnccg Jun 13, 2025
e3c9157
Crear carpeta para atomo contenedorSeleccion
July230 Jun 15, 2025
de7f804
Crear atomo contenedor seleccion
July230 Jun 15, 2025
af1a2cd
Agregar scroll a seleccion de tractores y columnas
July230 Jun 15, 2025
ee23c5a
Cambiar nombre de atomo
July230 Jun 15, 2025
0e5cc59
Crear molecula elemento seleccion
July230 Jun 15, 2025
c332b23
Arreglar idrol regresada
Johnccg Jun 16, 2025
eda661c
Agregar validacion de limite de caracteres en celda excel
July230 Jun 16, 2025
04ebaa0
detector y limitador completo
Pablo-H-H Jun 16, 2025
c227a5c
Merge pull request #202 from CodeAnd-Co/refactor/IJEC_RF4_resultados_…
Pablo-H-H Jun 16, 2025
93d99ab
Merge branch 'develop' of https://github.com/CodeAnd-Co/App-Local-Tra…
July230 Jun 16, 2025
ee73380
Merge branch 'develop' of https://github.com/CodeAnd-Co/App-Local-Tra…
jotapeeeeee Jun 16, 2025
1789124
Separar validacion de inicio peligroso
July230 Jun 16, 2025
9af5a78
Agregar validacion para numeros de telefono
July230 Jun 16, 2025
2fe8df3
Corregir error de eslint
July230 Jun 16, 2025
9b9bd52
Corregir error de patronInicioPeligroso
July230 Jun 16, 2025
ecbb9c0
Merge pull request #203 from CodeAnd-Co/IJEC/refactor_limite_caracter…
Pablo-H-H Jun 16, 2025
8169b5d
Refactorizar crear usuario
Johnccg Jun 17, 2025
4306f4d
Solo recargar lista de usuarios cuando se crea, modifi
Johnccg Jun 17, 2025
0b05d41
Actualizar documentación y parámetros de funciones
Johnccg Jun 17, 2025
99af942
Merge branch 'develop' of https://github.com/CodeAnd-Co/App-Local-Tra…
Johnccg Jun 17, 2025
8694c83
Arreglar mensaje de error
Johnccg Jun 17, 2025
63b6036
Merge branch 'develop' of https://github.com/CodeAnd-Co/App-Local-Tra…
Johnccg Jun 17, 2025
f3bc333
Agregar validacion para evitar espacios en blanco en correo
July230 Jun 18, 2025
3716f17
Agregar pruebas para iniciarSesion
July230 Jun 18, 2025
015a1d6
Agregar validacion para contraseña vacia
July230 Jun 18, 2025
69311c2
Agregar pruebas para correos con espacios
July230 Jun 18, 2025
d0141ad
Arreglar imports
Johnccg Jun 18, 2025
465bb6f
Añadir comentarios de trazabilidad
Johnccg Jun 18, 2025
01b5380
Dar más tiempo para actualizar variable de archivo seleccionado
Johnccg Jun 18, 2025
6051ef1
Merge pull request #204 from CodeAnd-Co/bugfix/JCCG_RF14_Corregir_def…
Pablo-H-H Jun 18, 2025
832dc1a
Corregir trazabilidad RF2
July230 Jun 18, 2025
c7c4883
Corregir validacion de espacios y evento que impide agregar espacios …
July230 Jun 18, 2025
639837a
Corregir mensaje de error inicio de sesion
July230 Jun 18, 2025
cb48a3e
Merge branch 'develop' of https://github.com/CodeAnd-Co/App-Local-Tra…
Johnccg Jun 18, 2025
ad8d9e6
Eliminar comentario
Johnccg Jun 18, 2025
cc87096
Merge pull request #207 from CodeAnd-Co/bugfix/JCCG_RF6_Arreglar_aler…
Pablo-H-H Jun 18, 2025
6f5c1dc
Arreglar imports de modulo perfil
Johnccg Jun 19, 2025
64b53fe
Comentarios
Pablo-H-H Jun 20, 2025
89539ca
Merge pull request #206 from CodeAnd-Co/bugfix/PHHM_Buscador_Quita_Pa…
Johnccg Jun 20, 2025
1f16943
Merge pull request #208 from CodeAnd-Co/refactor/IJEC_defecto_inicio_…
Johnccg Jun 20, 2025
7f5e02e
Merge pull request #209 from CodeAnd-Co/hotfix/JCCG_no_ref_arreglar_i…
Pablo-H-H Jun 20, 2025
bed7a3d
Eliminar la sobreescritura de datalabels.display
Johnccg Jun 21, 2025
b4b6481
Eliminar la sobreescritura de datalabels.display
Johnccg Jun 21, 2025
cd0391e
Actualizar lógica de etiquetas para incluir gráfica de radar
Johnccg Jun 21, 2025
9a8ef48
Agregar gráfica de radar a gráficas que usan agrupación
Johnccg Jun 21, 2025
4965d97
Arreglar espaciado de código
Johnccg Jun 21, 2025
0b50401
Merge pull request #211 from CodeAnd-Co/bugfix/JCCG_no_ref_Arreglar_v…
DanielQueijeiro Jun 21, 2025
2cbf75e
cambiar velocidad en que se bloquea la app y pantalla de bloqueo
DanielQueijeiro Jun 22, 2025
f29c739
Agregar input para color de gráfica
Johnccg Jun 22, 2025
1ea8f61
Cambiar color de gráfica
Johnccg Jun 22, 2025
8ff9ebd
Arreglar elementos de estilo
Johnccg Jun 22, 2025
8b5b8cb
Merge branch 'develop' into fix/JP_RF22_CorreccionVlookup
jotapeeeeee Jun 23, 2025
568fb5e
Mantener color cuando se cambia tipo de gráfica
Johnccg Jun 23, 2025
caade6b
Agregar documentación
Johnccg Jun 24, 2025
8bdfceb
Merge pull request #212 from CodeAnd-Co/feature/JCCG_no_ref_Cambiar_c…
July230 Jun 24, 2025
3c88ee7
habilitar dispositivos
DanielQueijeiro Jun 24, 2025
c0b0d1e
Merge branch 'develop' of https://github.com/CodeAnd-Co/App-Local-Tra…
DanielQueijeiro Jun 24, 2025
6ddcccb
arreglar detalles de la app
DanielQueijeiro Jun 25, 2025
f07abe5
desactivar devTools
DanielQueijeiro Jun 25, 2025
2350c93
menu filtros
DiegolHacker Jun 25, 2025
fef2b58
Merge branch 'develop' of https://github.com/CodeAnd-Co/App-Local-Tra…
DiegolHacker Jun 25, 2025
1d0100a
Merge pull request #213 from CodeAnd-Co/feature/DQA_RF36_bloqueo
July230 Jun 27, 2025
79a4ae1
Avance filtros
DiegolHacker Jun 27, 2025
0b872a8
Filtros en crear fórmula
DiegolHacker Jun 27, 2025
05263ce
filtros toma columna personalizada
DiegolHacker Jun 27, 2025
c9c18e9
filtros toman condiciones personalizadas
DiegolHacker Jun 27, 2025
fd30cad
Formulas y filtros funcionando
DiegolHacker Jun 27, 2025
b90dac1
Filtros funcionan con un parámetro
DiegolHacker Jun 27, 2025
62799b2
Merge branch 'develop' of https://github.com/CodeAnd-Co/App-Local-Tra…
DiegolHacker Jun 27, 2025
6638b1f
[FEAT] - Alertas en error al aplicar filtro
DiegolHacker Jun 28, 2025
efde6d6
Bugfix
DiegolHacker Jun 28, 2025
3f69dd2
eslint fix
DiegolHacker Jun 28, 2025
41b8895
fix boton cargando
DiegolHacker Jun 28, 2025
dd0779a
Merge pull request #214 from CodeAnd-Co/feat/DFJ_no-ref_filtros
DanielQueijeiro Jun 28, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
// RF48 Administrador habilita dispositivo - Nuevo requerimiento para habilitar dispositivos deshabilitados

const { habilitarDispositivo: habilitarDispositivoAPI } = require('../../domain/usuariosAPI/usuariosAPI');

/**
* Habilita un dispositivo específico que ha sido previamente deshabilitado.
*
* Esta función valida que se proporcione un ID de dispositivo y, si es válido,
* realiza una solicitud asíncrona a la API para habilitar el dispositivo correspondiente.
* Retorna un objeto con el resultado de la operación.
*
* @async
* @function habilitarDispositivo
* @param {string} idDispositivo - ID del dispositivo que se va a habilitar.
* @returns {Promise<{ok: boolean, mensaje: string}>} Resultado de la operación de habilitación.
*/
async function habilitarDispositivo(idDispositivo) {
if (!idDispositivo) {
return { ok: false, mensaje: 'ID de dispositivo no proporcionado' };
}

try {
const respuesta = await habilitarDispositivoAPI(idDispositivo);
return respuesta;

} catch {
return { ok: false, mensaje: 'Error al habilitar el dispositivo' };
}
}

module.exports = {
habilitarDispositivo,
};
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// RF47 Administrador consulta dispositivos - Nuevo requerimiento para listar todos los dispositivos

const { obtenerDispositivos: obtenerDispositivosAPI } = require('../../domain/usuariosAPI/usuariosAPI');

/**
* Obtiene la lista completa de dispositivos con información de sus propietarios.
*
* Esta función realiza una solicitud asíncrona a la API para obtener todos los dispositivos
* registrados en el sistema, incluyendo información sobre sus propietarios y estado.
* Retorna un objeto con el resultado de la operación.
*
* @async
* @function obtenerDispositivos
* @returns {Promise<{ok: boolean, dispositivos?: Array, mensaje?: string}>} Resultado de la operación con la lista de dispositivos.
*/
async function obtenerDispositivos() {
try {
const respuesta = await obtenerDispositivosAPI();
return respuesta;

} catch {
return { ok: false, mensaje: 'Error al obtener la lista de dispositivos' };
}
}

module.exports = {
obtenerDispositivos,
};
39 changes: 35 additions & 4 deletions harvester-app/src/backend/casosUso/excel/cargarExcel.js
Original file line number Diff line number Diff line change
Expand Up @@ -136,7 +136,7 @@ async function leerExcel(archivo) {
if (verificacionExcel.hayPeligro) {
reject({
exito: false,
mensaje: `El archivo subido contiene el siguiente caracter inválido: ${verificacionExcel.lugarDetectado} Caracter: ${verificacionExcel.caracterDetectado}`
mensaje: `El archivo subido contiene el siguiente problema: ${verificacionExcel.caracterDetectado}. ${verificacionExcel.lugarDetectado}`
});
}
// Almacenamos los datos usando el nombre de la hoja como clave
Expand Down Expand Up @@ -193,6 +193,7 @@ function verificarExcel(hojaJSON) {
}

const patron = /[<>&"'`#]/g
const longitudMaxima = 100;
let contadorFilas = 0;
let contadorCeldas = 0;

Expand All @@ -208,16 +209,24 @@ function verificarExcel(hojaJSON) {
if (match) {
return {
hayPeligro: true,
caracterDetectado: match[0],
caracterDetectado: `Caracter inválido: ${match[0]}`,
lugarDetectado: `Fila: ${contadorFilas} Celda: ${contadorCeldas}`
}
}

// 2. Verificar si comienza con = + -
if (celda.startsWith('=') || celda.startsWith('+') || celda.startsWith('-')) {
if (esInicioPeligroso(celda)) {
return {
hayPeligro: true,
caracterDetectado: celda[0],
caracterDetectado: `Caracter inválido: ${celda[0]}`,
lugarDetectado: `Fila: ${contadorFilas}, Celda: ${contadorCeldas}`
}
}

if (celda.length > longitudMaxima) {
return {
hayPeligro: true,
caracterDetectado: `Longitud mayor a ${longitudMaxima} caracteres`,
lugarDetectado: `Fila: ${contadorFilas}, Celda: ${contadorCeldas}`
}
}
Expand All @@ -229,6 +238,28 @@ function verificarExcel(hojaJSON) {
}



/**
* Verifica si una celda contiene un inicio potencialmente peligroso
* Permite '+' o '-' si parece un número telefónico
* @param {string} texto - Texto de la celda a verificar
* @returns {boolean} - Verdadero si la celda comienza con un carácter peligroso
*/
function esInicioPeligroso(texto) {
const patronInicioPeligroso = /^[=+-]/;
const patronNumeroTelefono = /^[+-]?\d[\d\s\-()]*$/;

if (patronInicioPeligroso.test(texto)) {
// Permitir si es numero telefónico
if (patronNumeroTelefono.test(texto)) {
return false;
}
return true;
}

return false;
}

module.exports = {
leerExcel,
}
Original file line number Diff line number Diff line change
Expand Up @@ -162,5 +162,8 @@ function indiceALetraColumna(indice) {
}

module.exports = {
aplicarFormula
aplicarFormula,
encontrarColumnaVacia,
traducirFormulaEstructurada,
indiceALetraColumna,
};
152 changes: 152 additions & 0 deletions harvester-app/src/backend/casosUso/formulas/filtrarDatos.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
const { HyperFormula } = require('hyperformula');
const { encontrarColumnaVacia } = require('./aplicarFormula.js')

const opciones = {
licenseKey: 'gpl-v3',
};

/**
* Aplica una fórmula estructurada a una hoja de Excel almacenada en localStorage.
* @param {string} nombreFormula - Nombre de la fórmula a aplicar.
* @param {string} formulaEstructurada - Fórmula estructurada a aplicar.
* @param {string|null} tractorSeleccionado - Nombre de la hoja donde se aplicará la fórmula (opcional).
* @returns {Object} Resultado de la aplicación de la fórmula.
*/

function filtrarDatos(filtro, datosExcel, tractorSeleccionado){
if(filtro.length==0){
return { resultados: datosExcel };
}

// Lógica para filtrar los datos según el filtro

const hojas = datosExcel.hojas;

// Si no se especifica hoja, usar la primera disponible
let datos = [];
let tractorUsado = '';

if (tractorSeleccionado && hojas[tractorSeleccionado]) {
datos = hojas[tractorSeleccionado];
tractorUsado = tractorSeleccionado;
} else {
// Tomar la primera hoja disponible
tractorUsado = Object.keys(hojas)[0];
datos = hojas[tractorUsado];
}

// Verificar que datos sea un array
if (!Array.isArray(datos)) {
throw new Error('Formato de datos inválido: se esperaba un array');
}

if (datos.length === 0) {
throw new Error('No hay datos disponibles en la hoja seleccionada');
}

// Obtener encabezados
const encabezados = datos[0];

// Encontrar la primera columna vacía usando método seguro
const indiceColumnaVacio = encontrarColumnaVacia(datos);



const hyperFormulaInstance = HyperFormula.buildFromArray(datos, opciones);
const sheetId = hyperFormulaInstance.getSheetId('Sheet1');

const columnaCondicion = nombreColumnaAIndice(filtro[0].Datos, encabezados);
if(columnaCondicion.error) {
return { error: true, columnaNoEncontrada: columnaCondicion.columnaNoEncontrada };
}

const filas = datos.length;

const condicionFiltro = extraerCondicionFiltro(filtro[0].Datos);

for(let columna = indiceColumnaVacio; columna < indiceColumnaVacio*2+1; columna+=1) {
hyperFormulaInstance.setCellContents({ row: 0, col: columna, sheet: sheetId }, encabezados[columna-indiceColumnaVacio]);
const columnaLetra = numeroAColumnaExcel(columna-indiceColumnaVacio+1);
hyperFormulaInstance.setCellContents({ row: 1, col: columna, sheet: 0 }, `=FILTER(${columnaLetra}2:${columnaLetra}${filas}, ${columnaCondicion}2: ${columnaCondicion}${filas}${condicionFiltro})`);
}

const resultadosFiltrados = [];
for(let fila = 0; fila < filas; fila+=1) {
const resultadoColumna = [];
for(let columna = indiceColumnaVacio; columna < indiceColumnaVacio*2+1; columna+=1) {
const valorCelda = hyperFormulaInstance.getCellValue({ row: fila, col: columna, sheet: sheetId });
if (valorCelda != null && valorCelda != undefined) {
resultadoColumna.push(valorCelda);
}
}
if (resultadoColumna.length > 0) {
resultadosFiltrados.push(resultadoColumna);
}
}

const resultados = {
hojas: {
[tractorSeleccionado]: resultadosFiltrados
}
};


return {
resultados,
};

}


function numeroAColumnaExcel(num) {
let columna = '';
while (num > 0) {
const residuo = (num - 1) % 26;
columna = String.fromCharCode(65 + residuo) + columna;
num = Math.floor((num - 1) / 26);
}
return columna;
}



/**
* @function traducirFormulaEstructurada
* @param {string} formula - Fórmula estructurada a traducir.
* @param {Array} encabezados - Encabezados de la hoja de Excel.
* @param {number} filaActiva - Fila activa para la traducción.
* @returns {string} Fórmula traducida a formato clásico de Excel.
*/

function nombreColumnaAIndice(filtro, encabezados) {
// Buscar el primer match de [@NombreColumna]
const match = filtro.match(/\[@([^\]]+)\]/);
if (!match) {
return { error: true, columnasNoEncontradas: ['No se encontró ninguna columna en el filtro'] };
}
const nombreColumna = match[1];
const columna = encabezados.indexOf(nombreColumna);
if (columna === -1) {
return { error: true, columnaNoEncontrada: [nombreColumna] };
}
return numeroAColumnaExcel(columna + 1); // +1 porque A=1, B=2, etc.
}


/**
* Extrae la condición de una fórmula tipo =FILTER([@Columna]condición)
* @param {string} filtro - Fórmula tipo =FILTER([@Columna]condición)
* @returns {string|null} La condición (por ejemplo, '>1' o '="Muy rápido"'), o null si no se encuentra.
*/
function extraerCondicionFiltro(filtro) {
// Busca la referencia estructurada y lo que sigue después de ella, hasta el paréntesis de cierre
const match = filtro.match(/\[@[^\]]+\]([^)]+)/);
if (!match) return null;
return match[1].trim();
}



module.exports = {
filtrarDatos,
}
16 changes: 13 additions & 3 deletions harvester-app/src/backend/casosUso/sesion/iniciarSesion.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// RF2 Usuario registrado inicia sesión - https://codeandco-wiki.netlify.app/docs/proyectos/tractores/documentacion/requisitos/RF2
// RF2 Usuario registrado inicia sesión - https://codeandco-wiki.netlify.app/docs/next/proyectos/tractores/documentacion/requisitos/RF2

const validador = require('validator');
const { iniciarSesion: iniciarSesionAPI } = require('../../domain/sesionAPI/sesionAPI');
Expand All @@ -10,7 +10,13 @@ const { iniciarSesion: iniciarSesionAPI } = require('../../domain/sesionAPI/sesi
* @returns {boolean} `true` si el correo es válido, de lo contrario `false`.
*/
function validarCorreo(correo) {
const regex = /^[a-z0-9!#$%&'*+=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/;
// Rechaza si hay espacios en cualquier parte
if (/\s/.test(correo)) {
return false;
}

// Validar formato de correo electrónico
const regex = /^(?!.*\s)[a-z0-9!#$%&'*+=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/;
return regex.test(correo);
}

Expand Down Expand Up @@ -42,7 +48,11 @@ function sanitizarEntrada(correo, contrasenia) {
*/
async function iniciarSesion(correo, contrasenia) {
if (!validarCorreo(correo)) {
return { ok: false, mensaje: 'Correo inválido' };
return { ok: false, mensaje: 'Correo o contraseña incorrectos' };
}

if (!contrasenia || contrasenia.trim() === '') {
return { ok: false, mensaje: 'La contraseña no puede estar vacía' };
}

// Sanitizar la entrada del correo y la contraseña
Expand Down
7 changes: 3 additions & 4 deletions harvester-app/src/backend/casosUso/usuarios/crearUsuario.js
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ function validarCorreo(correo) {
*/
async function crearUsuario({ nombre, correo, contrasenia, idRolFK }) {
if (!nombre || !correo || !contrasenia || !idRolFK) {
return { ok: false, mensaje: 'Todos los campos son obligatorios' };
return { ok: false, mensaje: `Todos los campos son obligatorios` };
}

if (!validarCorreo(correo)) {
Expand All @@ -79,9 +79,8 @@ async function crearUsuario({ nombre, correo, contrasenia, idRolFK }) {
return { ok: false, mensaje: respuesta.mensaje || 'Error al crear el usuario' };
}
return { ok: true, mensaje: respuesta.mensaje, id: respuesta.id };
// eslint-disable-next-line no-unused-vars
} catch (error) {
return { ok: false, mensaje: 'Error al crear el usuario'};
} catch {
return { ok: false, mensaje: 'Error al crear el usuario' };
}
}

Expand Down
5 changes: 3 additions & 2 deletions harvester-app/src/backend/domain/sesionAPI/sesionAPI.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
// RF2 Usuario registrado inicia sesión - https://codeandco-wiki.netlify.app/docs/proyectos/tractores/documentacion/requisitos/RF2
// RF3 Usuario cierra sesión - https://codeandco-wiki.netlify.app/docs/proyectos/tractores/documentacion/requisitos/RF3
// RF2 Usuario registrado inicia sesión - https://codeandco-wiki.netlify.app/docs/next/proyectos/tractores/documentacion/requisitos/RF2
// RF5 Usuario cierra sesión - https://codeandco-wiki.netlify.app/docs/next/proyectos/tractores/documentacion/requisitos/RF5

const { URL_BASE } = require(`${rutaBase}src/framework/utils/scripts/constantes.js`);

/**
Expand Down
Loading
Loading