From 311e71afa2141247eb8386f0cc5b705346222e40 Mon Sep 17 00:00:00 2001 From: laucharin Date: Wed, 17 Jun 2026 17:43:10 -0300 Subject: [PATCH] ref(AM): verificacion de cuenta existente y gestion de errores --- .../mobileApp/auth_routes/autenticacionApp.ts | 26 +++-------- .../mobileApp/controller/AuthController.ts | 45 +++++++++++++++++++ 2 files changed, 52 insertions(+), 19 deletions(-) diff --git a/modules/mobileApp/auth_routes/autenticacionApp.ts b/modules/mobileApp/auth_routes/autenticacionApp.ts index 2f8b00f0a3..b4e1b9a990 100644 --- a/modules/mobileApp/auth_routes/autenticacionApp.ts +++ b/modules/mobileApp/auth_routes/autenticacionApp.ts @@ -7,7 +7,7 @@ import { PacienteCtr } from '../../../core-v2/mpi/paciente/paciente.routes'; import { validar } from '../../../core-v2/mpi/validacion'; import * as ScanParse from '../../../shared/scanParse'; import * as authController from '../controller/AuthController'; -import { enviarCodigoVerificacion, generarCodigoVerificacion } from '../controller/AuthController'; +import { enviarCodigoVerificacion, generarCodigoVerificacion, generateError } from '../controller/AuthController'; import { PacienteAppCtr } from '../pacienteApp.routes'; import { registroMobileLog } from '../registroMobile.log'; import { PacienteApp } from '../schemas/pacienteApp'; @@ -229,26 +229,14 @@ router.post('/registro', Auth.validateCaptcha(), async (req: any, res, next) => const fcmToken = req.body.fcmToken; if (!ScanParse.isValid(scanText)) { - return res.status(400).send('Documento Inválido.'); + return res.status(404).send('Documento Inválido.'); } const documentoScan: any = ScanParse.scan(scanText); + const cuentaExistente = await authController.verificarCuentaExistente(documentoScan.documento, documentoScan.sexo.toLocaleLowerCase(), email); - // TODO: Llevar funcionalidad a controller - const cuentas = await PacienteAppCtr.search({ documento: documentoScan.documento, sexo: documentoScan.sexo, activacionApp: true }); - - // Verifica si el paciente se encuentra registrado y activo en la app mobile - const cuentaPaciente = cuentas.filter(c => { return c.pacientes.length; }); - if (cuentaPaciente.length > 0) { - return res.status(404).send('Ya existe una cuenta activa asociada a su documento'); - } - const pacienteApp = await PacienteAppCtr.findOne({ email }); - if (pacienteApp) { - if (pacienteApp.activacionApp) { // si existe y está activa es porque el mail esta vinculado a otro DNI - return res.status(404).send('Ya existe una cuenta activa con ese e-mail'); - } else { // existe una cuenta con ese mail pero sin activar. Se elimina y a continuacion se vuelve a crear - await PacienteAppCtr.remove(pacienteApp.id); - } + if (cuentaExistente) { + return res.status(404).send(generateError(cuentaExistente.error)); } req.body.validado = false; @@ -263,7 +251,7 @@ router.post('/registro', Auth.validateCaptcha(), async (req: any, res, next) => const tramite = Number(documentoScan.tramite); // Verifica el número de trámite if (pacienteValidado.idTramite !== tramite) { - return res.status(404).send('Número de trámite inválido'); + return res.status(404).send(generateError('tramite-invalido')); } // Guarda la foto de RENAPER en Andes await extractFoto(pacienteValidado, configPrivate.userScheduler); @@ -279,7 +267,7 @@ router.post('/registro', Auth.validateCaptcha(), async (req: any, res, next) => 'Error validando paciente al registrar cuenta', req ); - return res.status(404).send('No es posible verificar su identidad.'); + return res.status(404).send(generateError('validacion-fallida')); } // Busca el paciente y si no existe lo crea diff --git a/modules/mobileApp/controller/AuthController.ts b/modules/mobileApp/controller/AuthController.ts index 0a57b6cd40..d0283e9e94 100644 --- a/modules/mobileApp/controller/AuthController.ts +++ b/modules/mobileApp/controller/AuthController.ts @@ -6,6 +6,7 @@ import * as debug from 'debug'; import { PacienteCtr } from '../../../core-v2/mpi/paciente/paciente.routes'; import { sendEmail, IEmail, ISms, sendSms } from '../../../utils/roboSender'; import { IPushNotification, sendPushNotification } from './PushClientFCM'; +import { PacienteAppCtr } from '../pacienteApp.routes'; const log = debug('AuthController'); @@ -252,6 +253,50 @@ export function createUserFromPaciente(pacienteData, contacto) { }); } +export async function verificarCuentaExistente(documento, sexo, email) { + + const cuentasActivas = await PacienteAppCtr.search({ documento, sexo, activacionApp: true }); + + // Filtramos por cuenta de paciente + const cuentaPaciente = cuentasActivas?.filter(c => !c.profesionalId) || []; + if (cuentaPaciente.length) { + return { error: 'existe-cuenta-paciente-activa' }; + } + const pacienteApp = await PacienteAppCtr.findOne({ email }); + if (pacienteApp) { + if (pacienteApp.activacionApp) { // si existe en una cuenta activa es porque el mail esta vinculado a otro DNI + return { error: 'existe-email-vinculado' }; + } else { // existe una cuenta con ese mail pero sin activar. + // Se elimina la cuenta y continua el proceso de registro con el nuevo DNI escaneado + await PacienteAppCtr.remove(pacienteApp.id); + } + } + return null; +} + +export function generateError(code) { + let message = ''; + switch (code) { + case 'existe-cuenta-paciente-activa': + message = 'Ya existe una cuenta activa asociada al documento escaneado. Por favor inicie sesión con esa cuenta o restablezca la contraseña.'; + break; + case 'existe-email-vinculado': + message = 'El e-mail ingresado ya se encuentra vinculado a otra cuenta. Por favor ingrese un e-mail diferente.'; + break; + case 'tramite-invalido': + message = 'El número de trámite ingresado no es válido.'; + break; + case 'validacion-fallida': + message = 'No es posible verificar la identidad del paciente. Si el error persiste, por favor intente nuevamente mas tarde.'; + break; + default: + message = 'Error en la verificación de la cuenta. Por favor intente nuevamente.'; + } + return { + code, + message + }; +} /** * Actualiza los datos de la cuenta mobile