From 2959635e9c236801748bfc1c1af6a470f031c6e9 Mon Sep 17 00:00:00 2001 From: aldoEMatamala <123381977+aldoEMatamala@users.noreply.github.com> Date: Thu, 23 Apr 2026 11:24:51 -0300 Subject: [PATCH 1/3] feat(IN-681) Egreso falta traslado (#2212) --- core/tm/schemas/tipoPrestacion.ts | 3 ++- modules/turnos/controller/agenda.ts | 2 ++ modules/turnos/routes/turno.ts | 38 +++++++++++++++++++++++++++-- modules/turnos/schemas/turno.ts | 7 +++++- modules/webex/webex.controller.ts | 27 ++++++++++++++++++++ 5 files changed, 73 insertions(+), 4 deletions(-) create mode 100644 modules/webex/webex.controller.ts diff --git a/core/tm/schemas/tipoPrestacion.ts b/core/tm/schemas/tipoPrestacion.ts index 3608009d11..3fc328e800 100644 --- a/core/tm/schemas/tipoPrestacion.ts +++ b/core/tm/schemas/tipoPrestacion.ts @@ -18,6 +18,7 @@ export interface ITipoPrestacion extends Document { queries: [Types.ObjectId]; agendaDinamica?: Boolean; teleConsulta?: Boolean; + videoConferencia?: Boolean; } export const tipoPrestacionSchema = new Schema({ @@ -49,7 +50,7 @@ export const tipoPrestacionSchema = new Schema({ required: false }, queries: [Types.ObjectId], - teleConsulta: { + videoConferencia: { type: Boolean, required: false, default: false diff --git a/modules/turnos/controller/agenda.ts b/modules/turnos/controller/agenda.ts index 09aa90b665..67e29858d4 100644 --- a/modules/turnos/controller/agenda.ts +++ b/modules/turnos/controller/agenda.ts @@ -125,6 +125,7 @@ export async function liberarTurno(req, data, turno) { turno.nota = null; turno.confirmedAt = null; turno.reasignado = undefined; // Esto es necesario cuando se libera un turno reasignado + turno.webexLinks = null; turno.updatedAt = new Date(); turno.updatedBy = req.user.usuario || req.user; let cant = 1; @@ -186,6 +187,7 @@ export function suspenderTurno(req, data, turno) { const efector = data.organizacion; delete turno.paciente; delete turno.tipoPrestacion; + turno.webexLinks = null; turno.motivoSuspension = req.body.motivoSuspension; turno.avisoSuspension = req.body.avisoSuspension; turno.updatedAt = new Date(); diff --git a/modules/turnos/routes/turno.ts b/modules/turnos/routes/turno.ts index f38b1b6ee8..af69c864b4 100644 --- a/modules/turnos/routes/turno.ts +++ b/modules/turnos/routes/turno.ts @@ -13,6 +13,7 @@ import { NotificationService } from '../../mobileApp/controller/NotificationServ import * as prepagasController from '../../obraSocial/controller/prepagas'; import { updateRegistroHistorialSolicitud } from '../../rup/controllers/prestacion'; import { turnosLog } from '../citasLog'; +import * as webexController from '../../webex/webex.controller'; import { getHistorial } from '../controller/historialCitasController/historialCitasController'; import * as turnosController from '../controller/turnosController'; import { Agenda } from '../schemas/agenda'; @@ -72,7 +73,7 @@ router.patch('/turno/agenda/:idAgenda', async (req, res, next) => { usuario.organizacion = (req as any).user.organizacion; const tipoTurno = (esHoy ? 'delDia' : 'programado'); const fecha = new Date(); - const turno = { + const turno: any = { horaInicio: (agendaRes as any).horaInicio, estado: 'asignado', tipoTurno, @@ -84,8 +85,11 @@ router.patch('/turno/agenda/:idAgenda', async (req, res, next) => { updatedAt: fecha, updatedBy: usuario, fechaHoraDacion: fecha, - usuarioDacion: usuario + usuarioDacion: usuario, + videoConferencia: req.body.videoConferencia || false }; + + const turnos = ((agendaRes as any).bloques[0].turnos); turnos.push(turno); let update; @@ -309,6 +313,21 @@ router.patch('/turno/:idTurno/bloque/:idBloque/agenda/:idAgenda/', async (req: a update[etiquetaMotivoConsulta] = req.body.motivoConsulta; update[estadoFacturacion] = req.body.estadoFacturacion; + const etiquetaVideoConferencia = bloqueTurno + '.videoConferencia'; + const etiquetaWebexLinks = bloqueTurno + '.webexLinks'; + update[etiquetaVideoConferencia] = req.body.videoConferencia || false; + + if (update[etiquetaVideoConferencia]) { + const profesional = agendaRes.profesionales?.[0] || usuario.documento; + const turnoObj = { + _id: req.body.idTurno, + horaInicio: agendaRes.bloques[posBloque].turnos[posTurno].horaInicio, + paciente: req.body.paciente + }; + update[etiquetaWebexLinks] = await webexController.generateWebexLinks(turnoObj, agendaRes, profesional); + } + + if (req.body.reasignado) { update[etiquetaReasignado] = req.body.reasignado; } @@ -511,6 +530,21 @@ router.put('/turno/:idTurno/bloque/:idBloque/agenda/:idAgenda/', async (req, res update[etiquetaTurno] = req.body.turno; + if (req.body.turno.videoConferencia) { + + const profesional = agendaRes.profesionales?.[0] || usuario.documento; + const turnoObj = { + horaInicio: agendaRes.bloques[posBloque].turnos[posTurno].horaInicio, + paciente: req.body.turno.paciente + }; + + const link = await webexController.generateWebexLinks(turnoObj, agendaRes, profesional); + + + req.body.turno.webexLinks = link; + } + + // Actualiza los audit de update de la agenda update.updatedAt = new Date(); update.updatedBy = Auth.getAuditUser(req); diff --git a/modules/turnos/schemas/turno.ts b/modules/turnos/schemas/turno.ts index 1feda97aca..a21f21f1a5 100644 --- a/modules/turnos/schemas/turno.ts +++ b/modules/turnos/schemas/turno.ts @@ -89,7 +89,12 @@ const turnoSchema = new mongoose.Schema({ fechaHoraDacion: Date, usuarioDacion: mongoose.Schema.Types.Mixed, profesional: mongoose.Schema.Types.ObjectId, - notificar: Boolean + notificar: Boolean, + videoConferencia: Boolean, + webexLinks: { + patientLink: String, + professionalLink: String + } }); export = turnoSchema; diff --git a/modules/webex/webex.controller.ts b/modules/webex/webex.controller.ts new file mode 100644 index 0000000000..b200987998 --- /dev/null +++ b/modules/webex/webex.controller.ts @@ -0,0 +1,27 @@ +import * as debug from 'debug'; +import { services } from './../../services'; + +const dbgWebex = debug('dbgWebex'); + +export async function generateWebexLinks(turno: any, agenda: any, usuario: string) { + try { + const params = { + idTurno: String(turno._id || turno.horaInicio), + }; + + const servicio = services.get('teleconsulta'); + const result: any = await servicio.exec(params); + + if (result && result.baseUrl && result.host?.[0] && result.guest?.[0]) { + return { + professionalLink: result.baseUrl + result.host[0].short, + patientLink: result.baseUrl + result.guest[0].short, + }; + } + + return null; + } catch (error) { + dbgWebex('Error generating Webex links: %O', error?.message || error); + return null; + } +} From 7fb2984c6aa82dc901a795d6f22b29d2327b2af7 Mon Sep 17 00:00:00 2001 From: Fabio-Ramirez Date: Fri, 8 May 2026 11:23:06 -0300 Subject: [PATCH 2/3] Teleconsulta - Iniciar una videollamada desde RUP --- modules/turnos/controller/turnosController.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/modules/turnos/controller/turnosController.ts b/modules/turnos/controller/turnosController.ts index a7086e33bb..13fc03d3e5 100644 --- a/modules/turnos/controller/turnosController.ts +++ b/modules/turnos/controller/turnosController.ts @@ -158,6 +158,7 @@ export function getTurno(req) { turno.bloque_id = elem.bloque_id; turno.organizacion = elem.organizacion; turno.profesionales = elem.profesionales; + turno.webexLinks = elem.webexLinks; turno.paciente = (elem.pacientes_docs && elem.pacientes_docs.length > 0) ? elem.pacientes_docs[0] : elem.bloques.turnos.paciente; turnos.push(turno); }); From 1d2d9ed5f0d5562592f88247dac8aeecfa00c82b Mon Sep 17 00:00:00 2001 From: Fabio-Ramirez Date: Tue, 12 May 2026 11:50:53 -0300 Subject: [PATCH 3/3] Corrigue el dato de teleconsulta --- core/tm/schemas/tipoPrestacion.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/core/tm/schemas/tipoPrestacion.ts b/core/tm/schemas/tipoPrestacion.ts index 3fc328e800..1562710def 100644 --- a/core/tm/schemas/tipoPrestacion.ts +++ b/core/tm/schemas/tipoPrestacion.ts @@ -50,6 +50,11 @@ export const tipoPrestacionSchema = new Schema({ required: false }, queries: [Types.ObjectId], + teleConsulta: { + type: Boolean, + required: false, + default: false + }, videoConferencia: { type: Boolean, required: false,