Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
N
node_crisp
Project
Project
Details
Activity
Releases
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
web
node_crisp
Commits
ed5d2ad0
Commit
ed5d2ad0
authored
May 31, 2021
by
Gabriel
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Agrega manejo de pasos del flujo principal
parent
d567d204
Changes
2
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
286 additions
and
0 deletions
+286
-0
handlers.js
handlers.js
+276
-0
utils.js
utils.js
+10
-0
No files found.
handlers.js
0 → 100644
View file @
ed5d2ad0
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
utils.js
0 → 100644
View file @
ed5d2ad0
module
.
exports
=
{
armarChoice
:
function
(
value
,
label
)
{
return
{
"value"
:
value
,
"label"
:
label
,
"selected"
:
false
}
}
}
\ No newline at end of file
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment