Commit ed5d2ad0 authored by Gabriel's avatar Gabriel

Agrega manejo de pasos del flujo principal

parent d567d204
const crisp = require('./crisp.js');
const utils = require('./utils.js');
const pasos = require('./pasos.js');
const is = require('./endpoints/is.js')
let OPTIONS = 4;
let VER_MAS_PROVINCIAS_ID = '99';
let MOSTRANDO_PROVINCIAS_HASTA_KEY = 'mostrando_provincias_hasta'
let ID_PROVINCIA = 'id_provincia'
let ID_AGENDA = 'id_agenda'
let ID_PERSONA_INSTITUCIONAL = 'id_persona_institucional'
let FECHA_TURNO = 'fecha_turno'
let NOMBRE_MEDICO_INPUT = 'nombre_medico_input'
let NOMBRE_MEDICO = 'nombre_medico'
let SIGUIENTE_PASO = 'siguiente_paso'
let MEDICOS_ESPECIALIDAD = 'medicos_especialidad'
let TURNOS_DISPONIBLES = 'turnos_disponibles'
let TURNO_ELEGIDO = 'turno_elegido'
let TIPO_DOCUMENTO = 'tipo_documento'
let NUMERO_DOCUMENTO = 'numero_documento'
let FECHA_NACIMIENTO = 'fecha_nacimiento'
let SEXO = 'sexo'
let CORREO = 'correo'
function getDesde(userData) {
let desde = 0;
if (userData[MOSTRANDO_PROVINCIAS_HASTA_KEY] != null) {
desde = userData[MOSTRANDO_PROVINCIAS_HASTA_KEY];
}
return desde;
}
async function getSiguientesProvinciasMostrar(userData) {
let provincias = await is.getProvincias();
let choices = [];
let desde = getDesde(userData);
let iter = desde;
for (iter; iter < desde + OPTIONS && iter < provincias.length; iter++) { //TODO: limite de 5 (provincias.length)
choices.push(utils.armarChoice(provincias[iter].id_provincia, provincias[iter].descripcion));
}
if(iter !== provincias.length){
choices.push(utils.armarChoice(VER_MAS_PROVINCIAS_ID, 'Ver más provincias'));
}
return choices;
}
function updateProvinciasMostradas(userData) {
let desde = getDesde(userData);
userData[MOSTRANDO_PROVINCIAS_HASTA_KEY] = desde + OPTIONS;
return userData;
}
function getChoiceElegida(message){
for (let i = 0; i < message.content.choices.length; i++) {
if (message.content.choices[i].selected === true) {
return message.content.choices[i];
}
}
}
function toFechaUsa(fecha){
let year = fecha.split('/')[2];
let month = fecha.split('/')[1];
let day = fecha.split('/')[0];
let fechaUSA = year + "-" + month + "-" + day;
return fechaUSA;
}
module.exports =
{
ask_reservar_turno: async function (message, userData, website_id, session_id) {
choices = [];
choices.push(utils.armarChoice("1", "Si"));
choices.push(utils.armarChoice("2", "No"));
await crisp.setSiguientePaso(website_id, session_id, pasos.pasos[1], userData);
await crisp.sendPickerMessage(website_id, session_id, pasos.pasos[1], "Hola! Puedo ayudarte a reservar un turno, ¿te gustaría hacerlo?", choices);
},
ask_provincia: async function (message, userData, website_id, session_id) {
if (message.content.choices[0].selected === true) {
let choices = await getSiguientesProvinciasMostrar(userData);
userData = updateProvinciasMostradas(userData);
await crisp.setSiguientePaso(website_id, session_id, pasos.pasos[2], userData);
await crisp.sendPickerMessage(website_id, session_id, pasos.pasos[2], "Selecciona tu provincia", choices);
} else {
await crisp.sendTextMessage(website_id, session_id, "Gracias por contactarte! Estoy acá para cuando quieras reservar un turno");
}
},
resp_provincia: async function (message, userData, website_id, session_id) {
for (let i = 0; i < message.content.choices.length; i++) {
if (message.content.choices[i].selected === true) {
if (message.content.choices[i].value === VER_MAS_PROVINCIAS_ID) {
//Ver mas provincias
let choices = await getSiguientesProvinciasMostrar(userData);
userData = updateProvinciasMostradas(userData);
await crisp.setSiguientePaso(website_id, session_id, pasos.pasos[2], userData);
await crisp.sendPickerMessage(website_id, session_id, pasos.pasos[2], "Selecciona tu provincia", choices);
} else {
//Set provincia y avanzar
userData[ID_PROVINCIA] = message.content.choices[i].value;
await this.ask_nombre_medico(message, userData, website_id, session_id);
}
}
}
},
ask_nombre_medico: async function(message, userData, website_id, session_id){
userData[SIGUIENTE_PASO] = pasos.pasos[4];
await crisp.updateUserData(website_id, session_id, userData);
await crisp.sendTextMessage(website_id, session_id,"¿Cómo se llama el médico?");
},
resp_nombre_medico: async function(message, userData, website_id, session_id){
let nombreMedico = message.content;
userData[NOMBRE_MEDICO_INPUT] = nombreMedico;
await this.ask_medico_especialidad(message, userData, website_id, session_id);
},
ask_medico_especialidad: async function(message, userData, website_id, session_id){
let medicos = await is.getMedicosByName(userData[NOMBRE_MEDICO_INPUT], userData[ID_PROVINCIA]);
let medicos_especialidad = [];
if(medicos.length > 0){
for(let i=0; i<medicos.length; i++){
//Por cada medico, obtenemos su especialidad
let id_persona_institucional = medicos[i].id_persona_institucional;
let medico_especialidades = await is.getEspecialidadesMedico(id_persona_institucional, userData[ID_PROVINCIA]);
//Y agrupamos los datos del medico
for(let j=0; medico_especialidades != null && j<medico_especialidades.length; j++){
let medico = medicos[i];
medico.especialidad = medico_especialidades[j].especialidad;
medico.agendaId = medico_especialidades[j].agendaId;
medicos_especialidad.push(medico);
}
}
}
userData[MEDICOS_ESPECIALIDAD] = JSON.stringify(medicos_especialidad);
//Armamos picker
choices = [];
for(let i=0; i<medicos_especialidad.length && i < 5; i++){
let medico_especialidad = `${medicos_especialidad[i].nombre} - Especialidad: ${medicos_especialidad[i].especialidad}`;
choices.push(utils.armarChoice(medicos_especialidad[i].agendaId.toString(), medico_especialidad));
}
//TODO: agregar 'Mostrar mas'
await crisp.sendPickerMessage(website_id, session_id, pasos.pasos[6], "Seleccione uno de los médico encontrados, según su especialidad", choices);
await crisp.setSiguientePaso(website_id, session_id, pasos.pasos[6], userData);
},
resp_medico_especialidad: async function(message, userData, website_id, session_id){
for (let i = 0; i < message.content.choices.length; i++) {
if (message.content.choices[i].selected === true) {
userData[ID_AGENDA] = parseInt(message.content.choices[i].value);
userData[NOMBRE_MEDICO] = message.content.choices[i].label.split(' -')[0]; //Quitamos la especialidad
await this.ask_fecha_turno(message, userData, website_id, session_id);
}
}
},
ask_fecha_turno: async function(message, userData, website_id, session_id){
await crisp.setSiguientePaso(website_id, session_id, pasos.pasos[8], userData);
await crisp.sendTextMessage(website_id, session_id, `Cuándo querrías atenderte con ${userData[NOMBRE_MEDICO]}? (DD/MM/AAAA)`);
},
resp_fecha_turno: async function(message, userData, website_id, session_id){
userData[FECHA_TURNO] = message.content;
let medicos_especialidad = JSON.parse(userData[MEDICOS_ESPECIALIDAD]);
for(let i=0; i<medicos_especialidad.length; i++){
if(medicos_especialidad[i].agendaId === userData[ID_AGENDA]){
userData[ID_PERSONA_INSTITUCIONAL] = medicos_especialidad[i].id_persona_institucional;
}
}
await this.ask_hora_turno(message, userData, website_id, session_id);
},
ask_hora_turno: async function(message, userData, website_id, session_id){
let turnos = await is.getTurnosDisponibles(userData[ID_AGENDA], userData[ID_PERSONA_INSTITUCIONAL], userData[FECHA_TURNO]);
let choices = [];
for(let i=0; i<turnos.length && i < 5; i++){
choices.push(utils.armarChoice(i.toString(), turnos[i].fechaHora));
}
//TODO: agregar 'Mostrar mas'
userData[TURNOS_DISPONIBLES] = JSON.stringify(turnos);
await crisp.sendPickerMessage(website_id, session_id, pasos.pasos[10], "Seleccione un turno", choices);
await crisp.setSiguientePaso(website_id, session_id, pasos.pasos[10], userData);
},
resp_hora_turno: async function(message, userData, website_id, session_id){
let turnoElegidoChoice = getChoiceElegida(message);
let turnosDisponibles = JSON.parse(userData[TURNOS_DISPONIBLES]);
let turno;
for(let i=0; i < turnosDisponibles.length; i++){
if(turnoElegidoChoice.label === turnosDisponibles[i].fechaHora){
turno = turnosDisponibles[i];
}
}
userData[TURNO_ELEGIDO] = JSON.stringify(turno);
await this.ask_tipo_documento(message, userData, website_id, session_id);
},
ask_tipo_documento: async function(message, userData, website_id, session_id){
await crisp.sendTextMessage(website_id, session_id, 'Perfecto, ahora vamos a asociar tu datos. Selecciona tu tipo de documento');
let choices = [];
choices.push(utils.armarChoice("DNI", "DNI"));
choices.push(utils.armarChoice("CDM", "CDM"));
choices.push(utils.armarChoice("CED", "CED"));
choices.push(utils.armarChoice("CIE", "CIE"));
choices.push(utils.armarChoice("CM", "CM"));
await crisp.sendPickerMessage(website_id, session_id, pasos.pasos[12], "Tipo de documento", choices);
await crisp.setSiguientePaso(website_id, session_id, pasos.pasos[12], userData);
},
resp_tipo_documento: async function(message, userData, website_id, session_id){
let tipoDocumentoElegido = getChoiceElegida(message);
userData[TIPO_DOCUMENTO] = tipoDocumentoElegido.value;
await this.ask_numero_documento(message, userData, website_id, session_id);
},
ask_numero_documento: async function(message, userData, website_id, session_id){
await crisp.setSiguientePaso(website_id, session_id, pasos.pasos[14], userData);
await crisp.sendTextMessage(website_id, session_id, 'Ingresa tu número de documento');
},
resp_numero_documento: async function(message, userData, website_id, session_id){
userData[NUMERO_DOCUMENTO] = message.content;
await this.ask_fecha_nacimiento(message, userData, website_id, session_id);
},
ask_fecha_nacimiento: async function(message, userData, website_id, session_id){
await crisp.setSiguientePaso(website_id, session_id, pasos.pasos[16], userData);
await crisp.sendTextMessage(website_id, session_id, 'Ingresa tu fecha de nacimiento (DD/MM/AAAA)');
},
resp_fecha_nacimiento: async function(message, userData, website_id, session_id){
userData[FECHA_NACIMIENTO] = message.content;
await this.ask_sexo(message, userData, website_id, session_id);
},
ask_sexo: async function(message, userData, website_id, session_id){
let choices = [];
choices.push(utils.armarChoice("M", "Masculino"));
choices.push(utils.armarChoice("F", "Femenino"));
await crisp.setSiguientePaso(website_id, session_id, pasos.pasos[18], userData);
await crisp.sendPickerMessage(website_id, session_id, pasos.pasos[12], 'Selecciona tu sexo', choices);
},
resp_sexo: async function(message, userData, website_id, session_id){
userData[SEXO] = getChoiceElegida(message).value;
await this.ask_correo(message, userData, website_id, session_id);
},
ask_correo: async function(message, userData, website_id, session_id){
await crisp.setSiguientePaso(website_id, session_id, pasos.pasos[20], userData);
await crisp.sendTextMessage(website_id, session_id, 'Ingresa tu correo electrónico');
},
resp_correo: async function(message, userData, website_id, session_id){
userData[CORREO] = message.content;
let turnoElegido = JSON.parse(userData[TURNO_ELEGIDO]);
let resp = await is.crearTurno(userData[TIPO_DOCUMENTO], userData[NUMERO_DOCUMENTO], toFechaUsa(userData[FECHA_NACIMIENTO]),
userData[SEXO], userData[CORREO], 0, turnoElegido.horarioId, turnoElegido.fechaHora);
if(resp.success === true){
await crisp.sendTextMessage(website_id, session_id,
`Listo! El turno fue reservado para el ${turnoElegido.fechaHora}, con ${userData[NOMBRE_MEDICO]}`
);
if(resp.link_mercadopago != null){
await crisp.sendTextMessage(website_id, session_id,'Haz click aquí si deseas abonar la consulta en este momento');
await crisp.sendTextMessage(website_id, session_id, resp.link_mercadopago);
}
await this.ask_reservar_otro_turno(message, userData, website_id, session_id);
}
else{
await crisp.sendTextMessage(website_id, session_id,'Ha ocurrido un error al reservar el turno, intente nuevamente');
await crisp.updateUserData(website_id, session_id, {});
await this.ask_reservar_turno(message, userData, website_id, session_id);
}
},
ask_reservar_otro_turno: async function(message, userData, website_id, session_id){
let choices = [];
choices.push(utils.armarChoice("Si", "Si"));
choices.push(utils.armarChoice("No", "No"));
await crisp.sendPickerMessage(website_id, session_id, pasos.pasos[22], "¿Quieres reservar otro turno?", choices);
await crisp.setSiguientePaso(website_id, session_id, pasos.pasos[22], userData);
},
resp_reservar_otro_turno: async function(message, userData, website_id, session_id){
let choice = getChoiceElegida(message);
if(choice.label === 'No'){
await crisp.sendTextMessage(website_id, session_id,'Estoy acá para cuando necesites reservar otro turno!');
await crisp.updateUserData(website_id, session_id, {});
}
else{
await this.ask_nombre_medico(message, userData, website_id, session_id);
}
}
}
\ No newline at end of file
module.exports =
{
armarChoice: function (value, label) {
return {
"value": value,
"label": label,
"selected": false
}
}
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment