diff --git a/core/tm/schemas/tipoPrestacion.ts b/core/tm/schemas/tipoPrestacion.ts index 3608009d11..1562710def 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({ @@ -53,6 +54,11 @@ export const tipoPrestacionSchema = new Schema({ type: Boolean, required: false, default: false + }, + 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/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); }); 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; + } +}