Skip to content

Commit

Permalink
CIT - Instancias Notificaciones (#2004)
Browse files Browse the repository at this point in the history
* RUP - Script (Job) Encuesta Satisfacción. (#1956)

* Script (Job) Encuesta Satisfacción.

* fix(notficaciones): corrige logs en job que envío encuesta

---------

Co-authored-by: mcele <[email protected]>

* CIT - Instancias Notificaciones (rotativas)

---------

Co-authored-by: Lautaro Molina <[email protected]>
Co-authored-by: mcele <[email protected]>
  • Loading branch information
3 people authored Dec 18, 2024
1 parent eb1bec3 commit 8620b9a
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 18 deletions.
38 changes: 30 additions & 8 deletions jobs/encuestaSatisfaccion.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import { EncuestasSql } from '../config.private';
import * as sql from 'mssql';
import { notificacionesEncuestaLog as notificacionesLog } from '../modules/turnos/citasLog';
import { notificacionesEncuestaLog } from '../modules/turnos/citasLog';
import { WebHook } from '../modules/webhook/webhook.schema';
import * as mongoose from 'mongoose';
import { handleHttpRequest } from '../utils/requestHandler';
import { userScheduler } from '../config.private';
import { Constantes } from '../modules/constantes/constantes.schema';
import moment = require('moment');


const constanteKey = 'encuesta-envio';
const query = 'SELECT * FROM Mensajes WHERE MsgEnviado = 0 OR MsgEnviado IS NULL';
const query = 'SELECT * FROM Mensajes WHERE MsgEnviado IS NULL';

const config = {
user: EncuestasSql.auth.user,
Expand All @@ -22,6 +22,12 @@ const config = {

async function run(done) {
try {
let time: number;
let instancia: number;
let instAnt: number;
await timeOut().then(num => {
time = num;
});
const pool = await new sql.ConnectionPool(config).connect();
const result = await new sql.Request(pool).query(query);
for (const res of result.recordset) {
Expand All @@ -31,17 +37,20 @@ async function run(done) {
fecha: moment(res.Fecha).add(1, 'day').locale('es').format('dddd DD [de] MMMM'),
URL_Encuesta: res.URL_Encuesta,
};
const resp = await send('notificaciones:enviar', dtoMensaje);
const ultNum = res.Telefono.slice(-1);
instancia = ['0', '1', '2'].includes(ultNum) ? 1 : ['3', '4', '5'].includes(ultNum) ? 2 : 3;
await new Promise(resolve => setTimeout(resolve, instancia === instAnt ? time : time / 2));
instAnt = instancia;
const resp = await send('encuestas:enviar', dtoMensaje);
if (resp) {
const queryUp = 'UPDATE Mensajes SET MsgEnviado = 1 WHERE MensajeId = ' + res.MensajeId;
await new sql.Request(pool).query(queryUp);
}
await new Promise(resolve => setTimeout(resolve, 7500));
}
await pool.close();
done();
} catch (err) {
notificacionesLog.error('sql.request', query, err, userScheduler);
notificacionesEncuestaLog.error('sql.request', query, err, userScheduler);
return done(err);
}
}
Expand Down Expand Up @@ -71,13 +80,26 @@ async function send(event, datos) {
});
return resultado;
} catch (error) {
notificacionesLog.error('send:error', data, error, userScheduler);
notificacionesEncuestaLog.error('send:error', data, error, userScheduler);
return null;
}
} else {
notificacionesLog.error('send:not-event', event, { error: 'evento no encontrado' }, userScheduler);
notificacionesEncuestaLog.error('send:not-event', event, { error: 'evento no encontrado' }, userScheduler);
return null;
}
}

async function timeOut() {
let constante: any;
const time = 10000;
const key = 'waap-timeOut';
try {
constante = await Constantes.findOne({ key });
return constante ? parseInt(constante.nombre, 10) : time;
} catch (error) {
log.error('timeOut()', { constante, key }, { error: error.message }, userScheduler);
return time;
}
}

export = run;
39 changes: 29 additions & 10 deletions jobs/recordatorioTurnos.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { userScheduler } from '../config.private';
import * as mongoose from 'mongoose';
import { WebHook } from '../modules/webhook/webhook.schema';
import { handleHttpRequest } from '../utils/requestHandler';
import { Constantes } from '../modules/constantes/constantes.schema';

async function run(done) {
try {
Expand All @@ -16,8 +17,14 @@ async function run(done) {
}

async function recorrerAgendas() {

const fechaAgenda: Date = moment().add(1, 'days').toDate();
let instancia: number;
let instAnt: number;
let time: number;
await timeOut().then(num => {
time = num;
});
const tipoTurno = ['programado', 'gestion'];
const fechaAgenda: Date = moment().add(2, 'days').toDate();
const match = {
horaInicio: {
$gte: moment(fechaAgenda).startOf('day').toDate(),
Expand All @@ -29,17 +36,19 @@ async function recorrerAgendas() {
enviarSms: true,
'bloques.turnos.estado': 'asignado'
};

const agendasMañana: any[] = await Agenda.find(match);
for (let i = 0; i < agendasMañana.length; i++) {
const agenda = agendasMañana[i];
for (let j = 0; j < agenda.bloques.length; j++) {
const bloque = agenda.bloques[j];
for (let k = 0; k < bloque.turnos.length; k++) {
const turno = bloque.turnos[k];
if (turno.estado === 'asignado' && turno.paciente?.telefono) {
if (turno.estado === 'asignado' && turno.paciente?.telefono && tipoTurno.includes(turno.tipoTurno)) {
const ultNum = turno.paciente.telefono.slice(-1);
instancia = ['0', '1', '2'].includes(ultNum) ? 1 : ['3', '4', '5'].includes(ultNum) ? 2 : 3;
await new Promise(resolve => setTimeout(resolve, instancia === instAnt ? time : time / 2));
instAnt = instancia;
await recordarTurno(agenda, turno);
await new Promise(resolve => setTimeout(resolve, 7500));
}
}
}
Expand All @@ -52,6 +61,7 @@ async function recordarTurno(agenda, turno) {
const fechaMayor = moment(turno.horaInicio).toDate() > moment().toDate();
const idTurno = turno._id || turno.id;
const datoAgenda = dataAgenda(agenda, idTurno);

if (fechaMayor && turno.paciente.telefono && datoAgenda.organizacion) {
const dtoMensaje: any = {
idTurno: turno._id,
Expand All @@ -63,7 +73,7 @@ async function recordarTurno(agenda, turno) {
profesional: datoAgenda.profesionales ? datoAgenda.profesionales : '',
organizacion: datoAgenda.organizacion ? datoAgenda.organizacion : ''
};
await send('notificaciones:enviar', dtoMensaje);
await send('recordatorio:enviar', dtoMensaje);
}
} else {
notificacionesRecordatorioLog.error('obteneIdTurno', { turno, agenda }, { error: 'No se encontró el turno' }, userScheduler);
Expand Down Expand Up @@ -110,7 +120,6 @@ async function send(event, datos) {
});

if (subscriptions) {

const data = {
id: new mongoose.Types.ObjectId(),
subscription: subscriptions._id,
Expand All @@ -126,19 +135,29 @@ async function send(event, datos) {
json: true,
timeout: 10000,
});

return resultado;
} catch (err) {
notificacionesRecordatorioLog.error('envioNotificacion', { error: err, turno: datos }, userScheduler);
return null;
}

} else {
notificacionesRecordatorioLog.error('envioNotificacion', { turno: datos }, { error: 'evento no encontrado' }, userScheduler);
return null;
}

}
export = run;

async function timeOut() {
let constante: any;
const time = 10000;
const key = 'waap-timeOut';
try {
constante = await Constantes.findOne({ key });
return constante ? parseInt(constante.nombre, 10) : time;
} catch (error) {
log.error('timeOut()', { constante, key }, { error: error.message }, userScheduler);
return time;
}
}

export = run;

0 comments on commit 8620b9a

Please sign in to comment.