Commit ccc0658e authored by Sebastián Long's avatar Sebastián Long

Finish chatbot-turnos

parents 86355ff9 6dfc26eb
# Dependency directories
node_modules/
jspm_packages/
# environment variables file
.env
.env.test
# Stores VSCode versions used for testing VSCode extensions
.vscode-test
/.idea/codeStyles/codeStyleConfig.xml
/.idea/crisp-chatbot.iml
/.idea/modules.xml
/.idea/vcs.xml
/.idea/workspace.xml
{
"credenciales": {
"crisp": {
"identifier": "",
"key": ""
},
"isApiToken": ""
},
"baseUrl": ""
}
\ No newline at end of file
var Crisp = require("node-crisp-api");
var CrispClient = new Crisp();
const config = require('config');
var identifier = config.get('credenciales.crisp.identifier');
var key = config.get('credenciales.crisp.key');
let SIGUIENTE_PASO = 'siguiente_paso';
let localData = {};
CrispClient.authenticate(identifier, key);
async function sendTextMessage(website_id, session_id, message) {
await CrispClient.websiteConversations.sendMessage(
website_id,
session_id, {
type: "text",
from: "operator",
origin: "chat",
content: message
}
);
}
async function sendPickerMessage(website_id, session_id, id, title, choices) {
await CrispClient.websiteConversations.sendMessage(
website_id,
session_id, {
type: "picker",
from: "operator",
origin: "chat",
content: {
"id": id,
"text": title,
"choices": choices //array
}
}
);
}
async function getSiguientePaso(website_id, session_id) {
let data = await getUserData(website_id, session_id);
return data[SIGUIENTE_PASO];
}
async function setSiguientePaso(website_id, session_id, siguientePaso, userData) {
if (userData == null) {
userData = await getUserData(website_id, session_id);
}
userData[SIGUIENTE_PASO] = siguientePaso;
return await updateUserData(website_id, session_id, userData);
}
async function getUserData(website_id, session_id) {
let data = localData[website_id.concat(session_id)];
if(data == null){
await updateUserData(website_id, session_id, {});
return getUserData(website_id, session_id);
}
return data;
}
async function updateUserData(website_id, session_id, data) {
localData[website_id.concat(session_id)] = data;
}
module.exports =
{
CrispClient: CrispClient,
sendTextMessage: sendTextMessage,
sendPickerMessage: sendPickerMessage,
getSiguientePaso: getSiguientePaso,
setSiguientePaso: setSiguientePaso,
getUserData: getUserData,
updateUserData: updateUserData
}
\ No newline at end of file
const config = require('config');
const axios = require('axios');
var AUTH_TOKEN = config.get('credenciales.isApiToken');
axios.defaults.baseURL = config.get('baseUrl')
axios.defaults.headers.common = {'Authorization': `Bearer ${AUTH_TOKEN}`}
function sortProvinciasById(provincias) {
let ids = [];
for (let i = 0; i < provincias.length; i++) {
ids.push(provincias[i].id_provincia);
}
ids.sort(function (a, b) {
return parseInt(a) - parseInt(b)
});
let sortedProvincias = [];
for (let i = 0; i < ids.length; i++) {
sortedProvincias.push(getProvinciaById(provincias, ids[i]));
}
return sortedProvincias;
}
function getProvinciaById(provincias, id) {
for (let i = 0; i < provincias.length; i++) {
if (provincias[i].id_provincia === id) {
return provincias[i];
}
}
}
module.exports =
{
getProvincias: async function () {
return await axios.get('provincias/atencion')
.then(async function (response) {
let provincias = response.data;
return sortProvinciasById(provincias);
})
.catch(function (error) {
console.log(error);
});
},
getMedicosByName: async function (nombreMedico, idProvincia) {
return await axios.get(`/medicos/atencion?id_provincia=${idProvincia}&nombre=${nombreMedico}&solo_videoconsultas`)
.then(async function (response) {
return response.data.data;
})
.catch(function (error) {
console.log(error);
});
},
getEspecialidadesMedico: async function (idPersonaInstitucional, idProvincia) {
return await axios.get(`/atenciones?id_provincia=${idProvincia}&id_persona_institucional=${idPersonaInstitucional}`)
.then(async function (response) {
return response.data.data;
})
.catch(function (error) {
console.log(error);
});
},
getTurnosDisponibles: async function (idAgenda, idPersonaInstitucional, fechaUsa) {
return await axios.get(`/turnos/turnos_disponibles?id_agenda=${idAgenda}&id_persona_institucional=${idPersonaInstitucional}&fecha=${fechaUsa}`)
.then(async function (response) {
return response.data.turnos;
})
.catch(function (error) {
console.log(error);
});
},
getSiguientesTurnosDisponibles: async function (idAgenda, idPersonaInstitucional) {
return await axios.get(`/turnos/turnos_siguientes_disponibles?id_agenda=${idAgenda}&id_persona_institucional=${idPersonaInstitucional}`)
.then(async function (response) {
return response.data;
})
.catch(function (error) {
console.log(error);
});
},
existeUsuario: async function(tipo_documento, numero_documento, fecha_nacimiento, sexo){
return await axios.get(`/watson/existe_persona?tipo_documento=${tipo_documento}&numero_documento=${numero_documento}&fecha_nacimiento=${fecha_nacimiento}&sexo=${sexo}`)
.then(async function (response) {
return response.data.existe;
})
.catch(function (error) {
console.log(error);
});
},
crearTurno: async function (tipoDocumento, numeroDocumento, fechaNacimiento, sexo, mail, telefono, idHorario, fechaHora) {
return await axios.post('/watson/confirmar_reserva', {
"tipo_documento": tipoDocumento,
"numero_documento": numeroDocumento,
"fecha_nacimiento": fechaNacimiento,
"sexo": sexo,
"mail": mail,
"telefono_celular": telefono,
"id_horario": idHorario,
"fecha_hora": fechaHora
})
.then(async function (response) {
return response.data;
})
.catch(function (error) {
console.log(error);
});
}
}
\ No newline at end of file
This diff is collapsed.
const axios = require('axios');
const config = require('config');
const handlers = require('./handlers.js');
const crisp = require('./crisp.js');
const utils = require('./utils.js');
const pasos = require('./pasos.js');
const is = require('./endpoints/is.js')
crisp.CrispClient.on("message:updated", async function (message) {
darSiguientePaso(message, message.website_id, message.session_id);
})
async function darSiguientePaso(message, website_id, session_id) {
let siguientePaso = await crisp.getSiguientePaso(message.website_id, message.session_id);
let userData = await crisp.getUserData(website_id, session_id);
handlers[siguientePaso](message, userData, website_id, session_id);
}
crisp.CrispClient.on("message:send", async function (message) {
if(message.content === 'reiniciar'){
await crisp.updateUserData(message.website_id, message.session_id, {});
}
let siguientePaso = await crisp.getSiguientePaso(message.website_id, message.session_id);
if (siguientePaso == null) {
await crisp.setSiguientePaso(message.website_id, message.session_id, pasos.ASK_RESERVAR_TURNO)
}
await darSiguientePaso(message, message.website_id, message.session_id);
});
\ No newline at end of file
This diff is collapsed.
{
"name": "crisp-chatbot",
"version": "0.0.1",
"description": "Servidor para chatbot de Crisp",
"main": "index.js",
"scripts": {
"start": "node index.js",
"autoload": "nodemon index.js",
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC",
"dependencies": {
"axios": "^0.21.1",
"config": "^3.3.6",
"node-crisp-api": "^1.12.2"
},
"devDependencies": {
"nodemon": "^2.0.7"
}
}
module.exports = Object.freeze({
ASK_RESERVAR_TURNO: 'ask_reservar_turno',
ASK_PROVINCIA: 'ask_provincia',
RESP_PROVINCIA: 'resp_provincia',
ASK_NOMBRE_MEDICO: 'ask_nombre_medico',
RESP_NOMBRE_MEDICO: 'resp_nombre_medico',
ASK_MEDICO_ESPECIALIDAD: 'ask_medico_especialidad',
RESP_MEDICO_ESPECIALIDAD: 'resp_medico_especialidad',
ASK_FECHA_TURNO: 'ask_fecha_turno',
RESP_FECHA_TURNO: 'resp_fecha_turno',
RESP_FECHA_TURNO_SIGUIENTES_FECHAS: 'resp_fecha_turno_siguientes_fechas',
ASK_HORA_TURNO: 'ask_hora_turno',
RESP_HORA_TURNO: 'resp_hora_turno',
ASK_CONFIRMAR_FECHA_HORA: 'ask_confirmar_fecha_hora',
RESP_CONFIRMAR_FECHA_HORA: 'resp_confirmar_fecha_hora',
ASK_TIPO_DOCUMENTO: 'ask_tipo_documento',
RESP_TIPO_DOCUMENTO: 'resp_tipo_documento',
ASK_NUMERO_DOCUMENTO: 'ask_numero_documento',
RESP_NUMERO_DOCUMENTO: 'resp_numero_documento',
ASK_FECHA_NACIMIENTO: 'ask_fecha_nacimiento',
RESP_FECHA_NACIMIENTO: 'resp_fecha_nacimiento',
ASK_SEXO: 'ask_sexo',
RESP_SEXO: 'resp_sexo',
ASK_CORREO: 'ask_correo',
RESP_CORREO: 'resp_correo',
ASK_RESERVAR_OTRO_TURNO: 'ask_reservar_otro_turno',
RESP_RESERVAR_OTRO_TURNO: 'resp_reservar_otro_turno'
});
\ 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