Log Taller
Log Taller
Gracias a mis padres por brindarme su apoyo emocional y económico, a mis amigos por
estar siempre ahí, a mis profesores por enseñarme gran parte de lo que sé y a la educación
pública por permitir que se me haya enseñado todo el conocimiento que me hacer ser quien
soy hoy.
Resumen
El objetivo de este proyecto es diseñar e implementar una aplicación web que facilita una
tarea presente en muchos tipos de negocios, la gestión de citas.
La gestión de citas es un proceso que históricamente siempre ha consistido en un flujo de
información a través del teléfono, mediante el cual el cliente pregunta la disponibilidad de una
hora concreta, el empleado comprueba esa hora en un libro de citas y le responde acorde al
libro. Con esta aplicación lo que se busca es substituir la llamada telefónica por una consulta
en nuestra página web, la cual contendrá directamente el libro de citas, liberando al empleado
de la gestión de la cita.
La aplicación está dividida en dos capas: el backend, que gestiona la lógica de negocio y
expone esta mediante una API REST implementada con Java, utilizando el framework Spring
Boot y persistiendo los datos en una base de datos MySql, y el frontend, que gestiona la in-
terfaz con la que interactúa el usuario y hace llamadas al backend en base a estas interaccio-
nes, implementado como una aplicación web SPA usando JavaScript, React, React-Redux y
Material-UI entre otros.
Abstract
The goal of this project is to design and implement a web application that facilitates a task
present in many kinds of businesses, the appointment management.
Appointment management is a process that historically has always consisted of a flow
of information through a telephone, in which the client asks the availability of a given hour,
the employee checks the hour on an appointment book and responds accordingly. With this
application what we want is to replace the phone call with a search on our web page, which
will contain the appointment book, releasing the employee from managing the appointment.
The application is divided into two layers, the backend, which manages the business logic
and exposes it through a REST API implemented with Java, using the Spring Boot framework
and persisting the data in a MySql database, and the frontend, which manages the interface
with which the user interacts and makes calls to the backend based on these interactions,
implemented as a SPA web application using JavaScript, React-Redux and Material-UI among
others.
Palabras clave: Keywords:
• Java • Java
• Javascript • Javascript
• Aplicación web SPA • SPA web application
• Spring Boot • Spring Boot
• React • React
• React-Redux • React-Redux
• Cita • Appointment
2
Índice general
1 Introducción 1
1.1 Contexto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Visión global del sistema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
3 Metodología 9
3.1 Metodología escogida . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.2 Razonamiento de la elección . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
5 Planificación 17
5.1 Iteraciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
5.1.1 Iteración 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
5.1.2 Iteración 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
5.1.3 Iteración 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
5.1.4 Iteración 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
5.1.5 Iteración 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
5.1.6 Iteración 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.1.7 Iteración 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
i
ÍNDICE GENERAL
5.1.8 Iteración 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.2 Planificación temporal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
5.3 Cálculo de costes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
6 Fundamentos tecnológicos 22
6.1 Tecnologías utilizadas en el backend . . . . . . . . . . . . . . . . . . . . . . . . 22
6.1.1 Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
6.1.2 Maven . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
6.1.3 Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
6.1.4 MySql . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
6.1.5 Postman . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
6.1.6 Jacoco . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
6.1.7 Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
6.2 Tecnologías utilizadas en el frontend . . . . . . . . . . . . . . . . . . . . . . . 24
6.2.1 JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
6.2.2 React . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
6.2.3 React Redux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
6.2.4 Material-UI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
6.2.5 Npm . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
6.2.6 Redux DevTools . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
6.2.7 Visual Studio Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
6.3 Tecnologías complementarias . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
6.3.1 Git . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
6.3.2 Docker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
7 Desarrollo 27
7.1 Estructura de la aplicación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
7.1.1 Estructura del backend . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
7.1.2 Estructura del frontend . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
7.2 Modelo de datos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
7.3 Iteración 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
7.3.1 Análisis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
7.3.2 Diseño e implementación . . . . . . . . . . . . . . . . . . . . . . . . . 31
7.4 Iteración 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
7.4.1 Análisis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
7.4.2 Diseño e implementación . . . . . . . . . . . . . . . . . . . . . . . . . 38
7.5 Iteración 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
7.5.1 Análisis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
ii
ÍNDICE GENERAL
Lista de acrónimos 66
Glosario 67
Bibliografía 68
iii
Índice de figuras
iv
ÍNDICE DE FIGURAS
v
Índice de tablas
vi
Capítulo 1
Introducción
1.1 Contexto
Desde la existencia del teléfono este ha sido utilizado para llamar a establecimientos para
reservar cita previamente. Es un proceso que, en el negocio, requiere de una persona que esté
atenta al teléfono y, dependiendo del volumen de citas, esta tarea puede llegar a consumir
mucho tiempo a lo largo de una jornada. Por eso, muchos establecimientos de un tamaño ya
considerable, contratan directamente a un empleado para gestionar citas.
El problema es que muchos negocios de pequeño tamaño, debido a sus pequeños márgenes
de beneficio, no pueden permitirse el lujo de contratar a un empleado para ello. Por tanto,
cuando reciben una llamada pausan su trabajo para atenderla, produciendo perdidas de tiempo
y productividad.
Desarrollar una aplicación, lo más versátil posible, que ayude a gestionar citas de forma
telemática, podría ser de utilidad para muchas empresas de pequeño tamaño. Exponiendo el
libro de citas en una página web, el cliente puede ser él quien directamente apunte la cita.
La aplicación sería general y válida para pequeños negocios con tiempos de atención fi-
jos (e.g. una clínica de fisioterapia). Por una parte, los negocios gestionarían las citas con la
aplicación (la aplicación podría gestionar las citas de múltiple negocios) y pagarían una cuota
mensual por su uso, ahorrando costes de desarrollo y mantenimiento (hardware y software).
El pago de la cuota mensual por parte de las empresas queda fuera del alcance del TFG. Por
otra parte, los clientes podrían acceder gratuitamente a la aplicación para solicitar cita en un
negocio concreto.
Para los negocios con tiempos de atención variables en función del cliente (e.g. una pe-
luquería), la aplicación no sería tan útil. Este tipo de negocios queda fuera del alcance del
TFG.
1
CAPÍTULO 1. INTRODUCCIÓN
1.2 Objetivos
El objetivo de este proyecto es elaborar una aplicación web que mejore el flujo de infor-
mación de los negocios en la tarea de solicitar cita previa. Como se ilustra en la figura 1.1
(página 2), un flujo canónico requiere de un empleado para mediar entre el cliente y el libro
de citas.
Lo que se quiere obtener es un flujo de información sin necesidad del empleado, resultando
en una tarea más ágil y sencilla, como se ve ilustrado en la figura 1.2 (página 2), de forma que
se ahorre tiempo, dinero y recursos.
2
CAPÍTULO 1. INTRODUCCIÓN
Las citas también se podrán cancelar. Existen tres situaciones en las que se puede dar una
cancelación: un cliente con cuenta cancela una cita; un empleado cancela una cita; un cliente
sin cuenta cancela la cita. El cliente o empleado con cuenta cancela la cita fácilmente, a través
de nuestra aplicación. Si el empleado cancela la cita debe justificar su cancelación, tras lo
cual, se le envía un correo electrónico al cliente. De no estar registrado el cliente, se avisa al
empleado de que tiene que llamar al cliente para notificar la cancelación. En el caso de que un
cliente sin cuenta quiera cancelar la cita, tiene que llamar al negocio, para que sea el empleado
quien la cancele.
Cuando se quieran efectuar cambios que afecten a citas, como añadir bloqueos o modi-
ficaciones del horario, se informará de aquellas citas que se verán afectadas si se efectúa el
cambio. Se pedirá una justificación y se notificará a los clientes vía correo electrónico. Por
otra parte, cuando se realicen estas modificaciones, también se pueden ver afectadas citas de
clientes que no tienen correo electrónico, porque la han solicitado de manera telefónica. Por
tanto también se le avisa al dueño de la necesidad de informar telefónicamente a estos clientes.
3
CAPÍTULO 1. INTRODUCCIÓN
4
Capítulo 2
L a gestión de citas es un proceso vital para muchos tipos de negocios, como resultado
existen muchas opciones en el mercado, con servicios base como historial de clientes,
estadísticas o recordatorios.
A continuación se muestran algunas de las soluciones más utilizadas y sus funcionalidades
más destacadas.
2.1 Timify
Timify [1], servicio enfocado a la gestión de citas, ofrecen además reuniones virtuales para
consultas, clases o reuniones en remoto; gestión de salas y recursos, para reducir los tiempos
de inactividad en tareas dependientes de estos o colas virtuales, para tareas del estilo vacuna-
ción, donde se vacuna primero al que antes llega. Opcionalmente también dispone de gestión
de sucursales y acceso a su Application Programming Interface (API) REST para desarrolla-
dores. Por último, la empresa que desarrolla Timify, también ofrece soluciones personalizadas
para aquellas empresas que necesiten un software de gestión de citas hecho a medida.
Timify es usado por más de 45000 empresas y gestionan un volumen de más de 3.2 millones
de citas mensualmente. Entre sus clientes destacan grandes empresas como Telefónica, Marc
O’Polo o Intersport.
En la figura 2.1 (página 7) podemos ver parte del proceso de reserva online que expone de
ejemplo Timify en su página web.
2.2 Reservio
Reservio [2] es un proyecto software que diseña sistemas de gestión de citas adaptán-
dose al sector del cliente. No aporta funcionalidades más allá de las comunes, como gestión
de calendarios, recordatorios, administración de clientes, integración con Google calendar o
5
CAPÍTULO 2. ESTADO DEL ARTE
2.3 SimplyBook
SimplyBook [3] es la opción más interesante en cuestión de servicios. Ofrece integración
con Maps, Facebook e Instagram para poder solicitar citas a través de sus apps, plantillas para
páginas web en función del sector de negocio, gestión de ventas con TPV, sistema de puntos
para los clientes, pagos online, etc… También ofrecen acceso a su API.
Entre sus clientes figuran Paypal, Facebook y WordPress. En la figura 2.3 (página 8) se
visualiza un proceso de reservar mesa en una cafetería, en una de las plantillas que ofrece
SimplyBook.
6
CAPÍTULO 2. ESTADO DEL ARTE
7
CAPÍTULO 2. ESTADO DEL ARTE
8
Capítulo 3
Metodología
A continuación comentaremos cual es la metodología escogida para llevar a cabo este pro-
yecto, sus características, como la hemos usado y alternativas que han sido consideradas
con la justificación de su descarte.
9
CAPÍTULO 3. METODOLOGÍA
Permite su uso parcial. El hecho de tener una aplicación, aunque no completa, funcional,
es explotable. Por ejemplo, al terminar una iteración, se puede utilizar como si tuviese un uso
real, permitiendo darse cuenta de errores que de otra manera sería más complicado identificar.
Cuesta menos realizar cambios en los requisitos. Debido a que los requisitos pueden sufrir
modificaciones en la fase de desarrollo, se puede hacer uso de la fase de análisis de la siguiente
iteración para modificar los requisitos.
Separación de intereses. La división en bloques facilita la detección de fallos al solo en-
capsularse en un determinado rango de código que estamos creando. El código anteriormente
implementado ya ha sido testado en su fase por lo tanto el origen del fallo no puede estar ahí.
Se podrían haber utilizado otros tipos de metodologías de desarrollo software, pero, por
desgracia, no se adecuaban correctamente a la concepción de nuestro producto.
El desarrollo en espiral está diseñado para ser usado en proyectos de grande tamaño, cuyos
requisitos son poco claros y complejos. Debido a que nuestro proyecto no es de complejidad
elevada, y tenemos los requisitos claramente definidos desde un primer momento, esta meto-
dología no es de gran utilidad.
La metodología SCRUM no es tan explotable, debido a que una de sus grandes ventajas es
el trabajo colaborativo, pero en el proyecto solo participamos mi tutor y yo. Además existen
roles como Product Owner que no se dan en nuestra situación.
Por último, no se ha utilizado el desarrollo en cascada, porque solo hay una fase de tes-
teo. Esto implica que todos los fallos que se pueden dar se van acumulando a lo largo de
la implementación, solo para ser detectados todos a la vez. Esto provoca volver a la fase de
implementación y, por lo tanto, romper el esquema del modelo en cascada.
10
Capítulo 4
A continuación analizaremos cuales son los roles (actores) que pueden jugar nuestros usua-
su rol.
rios y cuales son las funcionalidades (casos de uso) que pueden utilizar en función de
4.1 Actores
El mayor factor limitante en cuanto a funcionalidades disponibles es estar registrado. Los
usuarios no registrado solo podrán buscar negocios y consultar sus detalles y reseñas. Los
usuarios registrados pueden tener tres categorías de permisos:
• Cliente: Todo usuario registrado como mínimo podrá disparar casos de uso asociados
a cliente, como consultar su historial de citas, solicitar cita, actualizar sus datos, etc…
• Empleado: Un empleado puede invocar las funcionalidades propias del cliente. Ade-
más, puede consultar el horario de citas que los clientes han solicitado con él y solicitar
cita para una persona que no pueda acceder a la aplicación.
• Dueño: El dueño de un negocio será el único que puede realizar modificaciones sobre
este, como sus datos,horarios, empleados, etc… Si el dueño lo desea también puede ser
empleado en su propio negocio.
11
CAPÍTULO 4. ANÁLISIS DE REQUISITOS GLOBAL
• CU-04 Usuario actualiza perfil: El usuario puede cambiar alguno o todos sus datos,
se le presentan los ya existentes y cambia el que desee. Cualquier usuario registrado
puede ejecutar este caso de uso.
• CU-05 Usuario cierra sesión: Un usuario autenticado puede cerrar la sesión cuando
lo desee.
• CU-06 Usuario crea negocio: Cualquier usuario, dueño de un negocio, puede regis-
trarlo, para ello especifica datos básicos: nombre, descripción, teléfono, duración de ci-
tas,etc… Especifica también si en su negocio se reserva una cita con un empleado(e.g. un
psicólogo) o se reserva un material o recurso(e.g. un restaurante). Se le permite añadir
o eliminar estos recursos o empleados y en el caso de utilizar empleados puede añadirse
también él como empleado. Al añadir empleado este puede tener una cuenta previamen-
te creada o no. Por último también define los horarios de atención: hora de comienzo y
fin, fecha de comienzo de validez y fin y el día de la semana al que corresponde.
• CU-08 Usuario busca negocios: Cualquier usuario, registrado o no, puede buscar ne-
gocios. Para ello puede utilizar su nombre, dirección, provincia o sector del negocio,
todos de manera opcional. Este proceso se ve ilustrado en la figura 4.1 (página 13).
• CU-10 Dueño modifica horario de atención: Cualquier usuario registrado, que dis-
ponga de un negocio, puede cambiar el horario de atención de este. Puede introducir
o eliminar horarios existentes. En el caso de eliminar un horario con citas pendientes
en él, se avisará de que serán eliminadas y se pedirá una justificación para avisar a los
clientes vía correo electrónico.
12
CAPÍTULO 4. ANÁLISIS DE REQUISITOS GLOBAL
13
CAPÍTULO 4. ANÁLISIS DE REQUISITOS GLOBAL
• CU-12 Empleado consulta su horario: Cualquier usuario, que esté trabajando para
un negocio, puede consultar las citas que sus clientes han reservado con él. En este
listado de citas se puede pinchar en una cita concreta para ir al detalle de esta.
• CU-13 Cliente solicita cita: Cualquier usuario registrado puede solicitar una cita des-
de el detalle de un negocio. Específica el empleado por el que quiere ser atendido o, sin
preferencia, y elige la fecha y hora disponible. Además, puede añadir observaciones so-
bre la cita para facilitar la preparación del empleado. Una vez solicitada la cita, se le
envía un correo electrónico, que confirma la reserva y contiene un enlace a los detalles
de la cita en la web. Este proceso se ve ilustrado en la figura 4.4 (página 16).
14
CAPÍTULO 4. ANÁLISIS DE REQUISITOS GLOBAL
• CU-14 Cliente consulta detalles de cita: Cualquier cliente puede consultar los deta-
lles de cualquier cita que haya reservado. En él se especifica el negocio, la fecha y hora,
el empleado, las observaciones,etc…
• CU-15 Cliente cancela cita: Cualquier cliente puede cancelar su cita desde el detalle
de esta, liberando la cita para que otro cliente pueda solicitarla.
• CU-16 Cliente consulta historial de citas: Cualquier cliente puede consultar un his-
torial de todas las citas que ha solicitado, hayan sido canceladas o no.
• CU-17 Empleado consulta detalles de una cita: Cualquier empleado puede consul-
tar los detalles de las citas solicitadas con él.
• CU-18 Empleado cancela cita: Cualquier empleado puede cancelar una cita que tenga
un cliente con él. Debe justificar la cancelación y se le enviará un correo electrónico
detallando la cancelación y el motivo.
• CU-19 Empleado solicita cita: Cualquier empleado puede solicitar una cita en su
negocio para un cliente que no puede usar la aplicación permanentemente o temporal-
mente. El cliente puede tener una cuenta creada o no. De tenerla creada solo se le pide el
DNI. De no tenerla creada se le piden nombre, apellidos, DNI y teléfono. Opcionalmen-
te, puede dar su correo electrónico, para crearle una cuenta en la aplicación. Finalmente,
indicar que un empleado puede pedir cita para sí mismo en su propio negocio.
• CU-21 Cliente añade una reseña de un negocio: Cualquier cliente, que haya tenido
una cita en un negocio, puede valorarlo. Para ello especifica una cualificación del 1 al
5, un título y una descripción.
• CU-23 Cliente añade cita a Google Calendar: La aplicación permite que cualquier
cliente pueda añadir una cita a Google Calendar, si tiene cuenta de Google. De esta
manera, el usuario, si lo desea, puede ver su cita reflejada en su calendario personal,
junto con el resto de eventos personales. La aplicación añade la cita a Google Calendar,
indicando el nombre y localización del negocio, así como un recordatorio.
15
CAPÍTULO 4. ANÁLISIS DE REQUISITOS GLOBAL
16
Capítulo 5
Planificación
5.1 Iteraciones
5.1.1 Iteración 0
En esta iteración se ha definido cual es la meta del proyecto y determinado su alcance. Se
ha llevado a cabo la fase de análisis, describiendo historias de usuario y diseñando wireframes
que han ayudado a definir adecuadamente los actores y casos de uso finales.
5.1.2 Iteración 1
En esta iteración da comienzo a la fase de implementación. Se crea un proyecto Spring
Boot Maven para el desarrollo backend y un proyecto Npm React para el frontend. Se empieza
por los casos de uso relacionados con la gestión de la cuenta del usuario. Además se aborda
la formación en la librería Material-UI, aunque esta no se ve implementada hasta la iteración
2. Los casos de uso desarrollados son:
17
CAPÍTULO 5. PLANIFICACIÓN
5.1.3 Iteración 2
En esta iteración se implementan los casos de uso relacionados a la gestión de negocios
por parte de los dueños y la búsqueda de información por parte de los clientes. Además, se
implanta Material-UI en todos los componentes anteriores.
5.1.4 Iteración 3
En esta iteración se implementan los casos de uso relacionados a la gestión de los horarios
por parte del dueño y los empleados.
5.1.5 Iteración 4
En esta iteración se implementan los casos de uso relacionados a la gestión de citas por
parte de los clientes.
18
CAPÍTULO 5. PLANIFICACIÓN
5.1.6 Iteración 5
En esta iteración se implementan los casos de uso relacionados a la gestión de citas por
parte de los empleados.
5.1.7 Iteración 6
En esta iteración se implementan los casos de uso relacionados con las reseñas y el calen-
dario de Google.
5.1.8 Iteración 7
En esta iteración se redacta la memoria y se aprovecha para subsanar algunos defectos de
la aplicación.
19
CAPÍTULO 5. PLANIFICACIÓN
Iteración Fecha inicio Fecha fin Estimación (h) Tiempo real (h)
Iteración 0 08/06/2022 14/06/2022 10 12
Iteración 1 15/06/2022 21/06/2022 7 10
Iteración 2 22/06/2022 10/07/2022 45 54
Iteración 3 11/07/2022 28/07/2022 50 55
Iteración 4 29/07/2022 08/09/2022 90 118
Iteración 5 09/09/2022 24/09/2022 40 48
Iteración 6 25/09/2022 05/10/2022 20 25
Iteración 7 06/10/2022 27/10/2022 50 57
TOTAL 08/06/2022 10/10/2022 312 379
Como se puede observar, la iteración 4 llevó una cantidad considerable de tiempo com-
parada al resto de iteraciones. El caso de uso cliente solicita cita, no solo llevó mucho tiempo
debido a la implementación de su lógica y la implementación de su interfaz de usuario, si no
que además también conllevó modificaciones en casos de uso anteriores.
Además de las horas trabajadas hay costes asociados a servicios y recursos. Para calcular
los costes de los servicios y recursos se consideró cuanto tiempo habría llevado realizar el
proyecto trabajando a tiempo completo, es decir, 160 horas/mes.
20
CAPÍTULO 5. PLANIFICACIÓN
Para simplificar las cifras se ha usado una aproximación de dos meses y medio. Se ha
asumido un trabajo telemático desde casa. Los recursos que han sido necesarios para llevar a
cabo este proyecto y sus costes asociados son los siguientes:
Concepto Coste(euros)
Horas trabajadas 11.370
Equipamiento informático 110
Electricidad 125
Internet 50
Coste total del proyecto 11.655
21
Capítulo 6
Fundamentos tecnológicos
E n este capítulo se hará una descripción de cada una de las tecnologías utilizadas para
llevar a cabo este proyecto.
6.1.1 Java
Java es un lenguaje de programación orientado a objetos, imperativo y con tipado fuerte
y estático. Fue diseñado con el objetivo de obtener un lenguaje orienta a objetos, fácil de usar
y que se pudiese ejecutar en diferentes sistemas operativos. Esto último es posible gracias a
que, cuando se compila una aplicación, se generan archivos .class de código binario a partir
de los archivos de código fuente .java. Los archivos .class más tarde pueden ser interpretados
y ejecutados por una Java Virtual Machine (JVM) específica para el sistema operativo.
22
CAPÍTULO 6. FUNDAMENTOS TECNOLÓGICOS
6.1.2 Maven
Maven [8] es una herramienta software utilizada para la gestión y construcción de proyec-
tos Java. Maven utiliza su Project Object Model (POM) en un archivo de formato eXtensible
Markup Language (XML) ([Link]) para definir la lógica de construcción del proyecto. Se
definen dependencias, plugins que se descargan de repositorios en línea y el ciclo de vida del
proyecto, entre otros. El ciclo de vida son una serie de fases que a su vez tienen goals o metas.
Las fases más importantes son: compile,test,package,install y deploy, aunque existen otras
opcionales que se pueden añadir y configurar mediante plugins.
6.1.3 Spring
Spring [9] es un framework de desarrollo de aplicaciones Java. Spring nos permite simpli-
ficar el acceso a datos mediante Spring Data, configurar autenticación y seguridad mediante
Spring Security o configuración automática y despliegue gracias a Spring Boot. Si entramos
en un grano más fino algunas de sus características más importantes son: inyección de de-
pendencias,configuración de Data Access Object (DAO), despliegue de aplicaciones web, in-
ternacionalización o validación, y gracias a Spring Boot todas estas utilidades no se necesitan
configurar.
6.1.4 MySql
MySql [10] es un sistema de gestión de base de datos relacional desarrollado por Oracle.
Tiene funcionalidades como indexación, transaccionalidad, claves foráneas, replicación,etc…
En este proyecto se ha utilizado MySql Workbench [11], herramienta gráfica que agiliza la
manipulación de base de datos.
6.1.5 Postman
Postman [12] es una herramienta que permite enviar peticiones HTTP a API REST pu-
diendo establecer cabeceras, cuerpo, parámetros, etc… Es de gran utilidad para testear la co-
municación con el backend.
6.1.6 Jacoco
Jacoco [13] es una herramienta que permite analizar la cobertura de código de los tests
realizados en Java. En determinados casos de uso se ha querido alcanzar una mayor cobertura
debido a la complejidad de la lógica de negocio.
23
CAPÍTULO 6. FUNDAMENTOS TECNOLÓGICOS
6.1.7 Eclipse
Eclipse [14] es un Integrated Development Environment (IDE). Un IDE a parte de permi-
tirnos editar código nos provee de funcionalidades a mayores para facilitar la programación,
como funciones de auto-completado, debugger, refactorización, compiladores, etc…
6.2.1 JavaScript
JavaScript es un lenguaje de programación multi-paradigma, imperativo y con tipado débil
y dinámico. Su principal uso es el de escribir funciones embebidas en páginas HyperText
Markup Language (HTML) que interactúen con el DOM de estas. Como ya comentamos en
capítulos anteriores cuando los usuarios acceden a nuestra página web se traen archivos JS al
navegador. Estos archivos JavaScript son los que responden a las interacciones del usuario con
la página web, por ejemplo pulsando un botón, y son los archivos JavaScript los encargados
de realizar las llamadas al backend y modificar la interfaz de usuario acordemente.
6.2.2 React
React [15] es una librería de JavaScript que permite diseñar interfaces de usuario para
Single Page Application (SPA) utilizando componentes. Los componentes son piezas reusables
de la interfaz, que a su vez pueden tener otras piezas dentro, como se ilustra en la figura 6.2.
24
CAPÍTULO 6. FUNDAMENTOS TECNOLÓGICOS
Sus dos mayores características son el uso de un DOM virtual y JavaScript XML (JSX). Rea-
lizar modificaciones en el DOM real del navegador es una operación costosa, porque cuando
se rerenderiza uno de los elementos se rerenderizan en cascada todos sus hijos, hayan cambia-
do o no. Por esa razón, se utiliza un DOM virtual, una representación del DOM real guardado
en memoria, sobre el cual se realizan los cambios primero. Una vez actualizado el DOM vir-
tual se calcula la diferencia con el DOM real para calcular la forma más óptima de realizar los
cambios, produciendo una menor cantidad de renderizaciones.
JSX es una extensión del sintaxis de JavaScript, similar a HTML, que permite estructurar
la renderización de un componente. JSX nos permite, entre otras cosas, añadir expresiones
JavaScript mediante el uso de corchetes o hacer renderización condicional, mostrada en el
ejemplo siguiente.
1 const App = () => {
2 const i = 1;
3
4 return (
5 <div>
6 <h1>{ i === 1 ? 'true' : 'false' }</h1>
7 </div>
8 );
9 }
6.2.4 Material-UI
Material-UI [17] o MUI es una librería de JavaScript con herramientas utilizadas para di-
señar la interfaz de usuario. MUI fue diseñado implementando Material Design, un sistema
de diseño que busca mejorar la experiencia de usuario en todos los sentidos. MUI nos provee
de componentes React, con CSS y animaciones ya implementadas, que nos permite obtener
una interfaz más amigable y estéticamente agradable.
25
CAPÍTULO 6. FUNDAMENTOS TECNOLÓGICOS
6.2.5 Npm
Npm [18] es un sistema de gestión de paquetes para Javascript. Para ello se hace uso
del archivo [Link]. Este archivo especifica los paquetes que se quieren utilizar y sus
versiones. En nuestro caso se han utilizado paquetes de librerías anteriormente mencionadas:
React, React-Redux, Material-UI, etc…
6.3.1 Git
Git [21] es un sistema de control de versiones. Su función principal es tener trazabilidad de
las versiones de un producto software, es decir, tener un historial de los cambios introducidos.
Aunque muchas de sus características no han sido explotadas en este proyecto, debido a que
solo hay una persona desarrollando, el hecho de tener una copia remota, y tener controlados
los cambios efectuados sobre el producto, brinda seguridad y facilita tareas de programación
como detección de fallos.
6.3.2 Docker
Docker [22] es una herramienta utilizada para automatizar el despliegue haciendo uso
de contenedores. Un contenedor es una virtualización de un sistema operativo aislado del
resto de procesos de una máquina. Esto nos permite desplegar nuestra aplicación de manera
eficiente, rápida y portable.
26
Capítulo 7
Desarrollo
– model: Paquete que contiene todos los archivos necesarios para gestionar la ló-
gica de negocio, incluyendo entidades, DAOs, excepciones, todos dando soporte a
los servicios locales, que son los que definen la lógica, dando vida a la capa modelo.
∗ entities: En esta carpeta están definidas todas las entidades que son utiliza-
das por el mapeador objeto-relacional mediante el uso de anotaciones como
@Entity, dando vida a la capa de acceso a datos. Existen anotaciones @Many-
ToOne y @OneToMany para declarar las relaciones N:1 y 1:N existentes en
el modelo de datos. Por otra parte los archivos terminados en *[Link] son
los archivos Data Access Object, implementados con JPA e hibernate, que nos
permiten comunicarnos con la base de datos con operaciones como save, de-
lete, count, findAll, etc… También nos permite especificar nuestras propias
consultas sobre la base de datos.
∗ exceptions: Clases que especifican qué excepciones se pueden dar al imple-
mentar la lógica de negocio, por ejemplo, cuando se intenta reservar cita en
27
CAPÍTULO 7. DESARROLLO
• /src/sql: Ficheros .sql que definen el modelo de datos para su ejecución en MySql.
• /src/test: Ficheros que definen los tests automatizados con el uso de junit.
• /target: Contiene los artefactos generados por Maven (e.g. ficheros .class, ficheros .jar,
etc.).
28
CAPÍTULO 7. DESARROLLO
29
CAPÍTULO 7. DESARROLLO
30
CAPÍTULO 7. DESARROLLO
7.3 Iteración 1
7.3.1 Análisis
Empezamos creando los proyectos Maven para el backend y React para el frontend, aña-
diendo sus respectivas dependencias y configuraciones necesarias. Implementamos, primero,
todo el backend de los casos de uso, los testamos para asegurarnos de que no hay ningún fallo
y procedemos a implementar el frontend. Este modus operandi produce el menor cambios de
contexto entre Java y JavaScript reduciendo la cantidad de fallos posibles.
Los casos de uso desarrollados son los de gestión de la cuenta de usuario:
31
CAPÍTULO 7. DESARROLLO
32
CAPÍTULO 7. DESARROLLO
6 type="text"
7 id="firstName"
8 label={useFormatMessage('[Link]')}
9 autoFocus
10 value={firstName}
11 onChange={e => setFirstName([Link])}
12 error={firstName === "" && validation}
13 helperText={firstName === "" && validation ?
14 requiredMessage() : ' '}
15 />
Las propiedades definidas nos ayudan a establecer una mejor comunicación con el usuario
y una estética más agradable. La propiedad sx de MUI, de gran utilidad, nos permite modi-
ficar el CSS sin escribir un .css. La propiedad label nos ayuda a etiquetar el campo para que
lo identifique el usuario. Las propiedades value y onChange nos permiten identificar y cam-
biar su valor. Las propiedades error y helperText, dependientes de un estado del componente,
validation, nos permite cambiar su forma en caso de que no haya sido introducido un valor.
En el caso de que el formulario no responda true al metodo checkValidity ponemos a true
validation, de manera que si algún TextField está vacío y validation es true se enseñará el
helperText, que indica que es necesario rellenar ese campo y se pondrá a true la propiedad
error, que cambia el estilo del campo para ponerlo rojo, adquiriendo una interfaz más estética
y con mejor feedback.
Debido a que la contraseña es un dato sensible y que queremos estar seguros de que el
usuario la ha escrito correctamente, añadimos un campo extra, para asegurar que la contra-
seña introducida no tenga errores de escritura.
Por último, haciendo uso de la librería react-intl [25] y su hook useIntl y el componente
FormattedMessage, internacionalizamos la interfaz de usuario.
33
CAPÍTULO 7. DESARROLLO
usuario. Si alguna de estas dos operaciones falla devolvemos la excepción, si no, devolvemos el
usuario encontrado en base de datos. El controlador REST recibirá una petición POST, llamará
a este caso de uso y devolverá, además de la información del usuario, el token JWT.
En el frontend implementamos la llamada al backend, las actions login y loginCompleted
que llaman al backend y confirman la respuesta del backend respectivamente. Implementa-
mos el componente Login, ilustrado en la figura 7.3 (página 35), un simple formulario con
TextField correo electrónico y contraseña. Se ha desarrollado un componente Errors para
que cualquier otro componente que haga llamadas al backend pueda mostrar errores en caso
de que se produzcan.
También se hace uso del componente Link, provisto por el paquete npm react-router-
dom, que nos permite navegar la página y cambiar los componentes mostrados en función de
la ruta del navegador. En este caso, el Link cambiaría la ruta a /users/signup, que renderiza
el componente SignUp en caso de que el usuario aún no tenga una cuenta creada. Para poder
identificar al usuario a partir del token guardado en sessionStorage implementamos una action
que se dispara cada vez que se renderice la app.
34
CAPÍTULO 7. DESARROLLO
35
CAPÍTULO 7. DESARROLLO
Figura 7.4: Parte del componente Header con el desplegable con operaciones para el usuario
36
CAPÍTULO 7. DESARROLLO
37
CAPÍTULO 7. DESARROLLO
7.4 Iteración 2
7.4.1 Análisis
En esta iteración se desarrollarán los casos de uso relacionados a la gestión del negocio
por parte del dueño y la búsqueda de información de negocios por parte del cliente. Los casos
de uso a desarrollar son:
38
CAPÍTULO 7. DESARROLLO
los usuarios de la lista esté trabajando ya para otro negocio de la aplicación se lanza la excep-
ción EmployeeAlreadyWorkingException. Lo testeamos a fondo debido a que es un caso de
uso importante, creamos los DTO pertinente y una llamada POST en un nuevo controlador de
negocios. Terminamos implementando un caso de uso muy sencillo que no se ha mencionado,
consistente en buscar a un usuario por su DNI, que necesitaremos más adelante.
Para la implementación del frontend del caso de uso, se ha hecho uso de un formulario,
modales y listas para lograr una buena comunicación con el usuario. Para los modales se ha
usado el componente Modal de MUI, y para las listas el componente Table y sus componentes
asociado TableContainer, TableHead, TableRow y TableCell. En el diseño del formulario
se han usado TextField para nombre, descripción, teléfono, correo electrónico, dirección y
duración de citas. Para establecer la categoría y provincia se hace uso de componentes Cate-
gorySelector y ProvinceSelector, que serán reutilizados más tarde en el caso de uso buscar
negocios.
Después se usa un Switch para preguntar si el negocio utiliza recursos, de ser así, mos-
tramos un botón y una lista de recursos, o en el caso contrario, el cual es por defecto, se
muestra un Checkbox para saber si el dueño es empleado también, además del botón y lista
de empleados. Esta sección del formulario se ve ilustrada en la figura 7.6 (página 40).
Para añadir un empleado/recurso se hace uso de un modal, AddEmployeeDialog/Ad-
dResourceDialog, ilustrado en la figura 7.10 (página 48), con un formulario, AddEmplo-
yeeForm/AddResourceForm. En caso de que sean recursos, se pide un nombre y cantidad
y se comprueba que en el estado del componente no exista un duplicado. De ser empleados
hay que atender a dos casuísticas, empleado con cuenta o sin cuenta. De tener cuenta solo le
pedimos el DNI, hacemos una pequeña llamada al backend, para recuperar su nombre, ape-
llidos, DNI y correo electrónico para mostrarlos en el componente EmployeeList. En caso
contrario se le piden estos datos para que, cuando se finalice la creación del negocio, se le
envíe un correo, que le redireccionará a un formulario en el que establezca su contraseña y
quede así creada su cuenta.
Por último otra dupla de botón, AddScheduleDialog, y lista, ScheduleList, para añadir
y visualizas los horarios. Aunque la comprobación de que no se superpongan ya se hace en el
backend, también la hacemos en el momento de insertar los datos para no realizar llamadas
innecesarias.
CU-07 Dueño actualiza negocio
El dueño si lo desea puede cambiar la información de sus negocios y sus empleados/recur-
sos… No podrá cambiar la duración de las citas ni si su negocio utiliza empleados o recursos
en sus citas.
Empezamos implementando las operaciones de los DAO de recursos y empleados que nos
permita buscarlos por su negocio asociado. Diseñamos la lógica de negocio empezando por
39
CAPÍTULO 7. DESARROLLO
40
CAPÍTULO 7. DESARROLLO
la comprobación de que el usuario que quiera hacer la actualización sea el dueño del nego-
cio. Eliminamos los horarios antiguos e introducimos los nuevos, asegurándonos de que no se
superpongan mediante un método doSchedulesOverlap. Recuperamos los recursos antiguos,
en caso de que use recursos, y eliminamos los que no se encuentran en la lista nueva. Aña-
dimos todos los recursos de la lista que sean nuevos. De tener empleados, recuperamos los
empleados antiguos, si no se encuentran en la lista nueva, los eliminamos. En caso de que
haya empleados nuevos se comprueba si hay duplicidad de correo electrónico o DNI, si no
la hay le añadimos como empleado de este negocio. También comprobamos si el usuario no
tiene una cuenta existente, de darse el caso le enviamos un correo para que registre su con-
traseña. Actualizamos los datos básicos (nombre, descripción, etc…) y termina la lógica de
negocio. Se elaboran tests de unidad, una operación PUT en el controlador y se comprueba su
correcto funcionamiento con Postman. Además de este caso de uso es necesario implementar
ya el caso de uso CU-09 debido a que lo necesitaremos en el frontend, aunque su desarrollo
se comentará más adelante.
La interfaz de usuario es similar a la del caso anterior, pero es necesario que cuando se
renderice el componente esté poblado con la información del negocio. Además, el dueño puede
tener varios negocios, por lo tanto hay que darle una opción de seleccionar el que desee.
Para ello se hace uso de un componente BusinessSelector, presente en un desplegable en el
componente Header. La figura 7.7 (página 41) ilustra este componente.
En el estado del usuario en Redux guardaremos una lista de los negocios de los que es
dueño nuestro usuario. Esta lista solo contiene el id y su nombre, por tanto cuando queremos
acceder al componente UpdateBusiness tenemos que llamar al backend para obtener la infor-
mación al completo del negocio seleccionado. Además también tenemos que tener guardado
en el estado de Redux cual es el negocio actualmente seleccionado en BusinessSelector.
41
CAPÍTULO 7. DESARROLLO
Para poder poblar el formulario con esta información, una vez se haya renderizado el
componente, hacemos uso del hook useEffect provisto por React. Este hook nos permite añadir
efectos cada vez que el componente se monte.
42
CAPÍTULO 7. DESARROLLO
1 useEffect(() => {
2
3 dispatch([Link]([Link],
updateBusiness));
4
5 return () => clearBusiness();
6
7 }, [selectedBusiness, dispatch]);
43
CAPÍTULO 7. DESARROLLO
componente Rating para la valoración media. Cada uno de los nombres de los negocios será
un componente Link que nos llevará a los detalles del negocio. Finalmente, la paginación se
implementa en un componente Pager, habilitando botones en función de un valor booleano,
que indica si hay más negocios acorde a los parámetros especificados.
44
CAPÍTULO 7. DESARROLLO
45
CAPÍTULO 7. DESARROLLO
7.5 Iteración 3
7.5.1 Análisis
En esta iteración se desarrollarán los casos de uso relacionados con la gestión de horarios.
Al terminar esta iteración los cimientos para poder solicitar una cita ya estarán terminados.
Los casos de uso a desarrollar son:
46
CAPÍTULO 7. DESARROLLO
47
CAPÍTULO 7. DESARROLLO
Figura 7.10: Componentes diseñados para el CU-11 Dueño gestiona bloqueos de empleados
48
CAPÍTULO 7. DESARROLLO
49
CAPÍTULO 7. DESARROLLO
7.6 Iteración 4
7.6.1 Análisis
En esta iteración se desarrollarán los casos de uso relacionados con la gestión de citas por
parte del cliente. Los casos de uso desarrollados son:
50
CAPÍTULO 7. DESARROLLO
Figura 7.12: Diagrama de clases e interfaces involucradas en el CU-13 Cliente solicita cita
Para diseñar la interfaz de usuario, haremos uso de dos pantallas, una en la que se elija el
empleado/recurso, la fecha y la hora, y otra en la que se presenten estos datos, además de dar
la opción de añadir observaciones antes de confirmar la reserva de la cita. Cuando se efectúe
la reserva se mostrará un mensaje, confirmando que se ha completado la reserva y también el
envío del correo.
Para la primera pantalla implementamos el componente ChooseAppointmentDate 7.13
(página 52). Este componente tiene un Select, que es alimentado con la lista de recursos/em-
pleados, y un TextField de tipo date. Cuando el cliente seleccione un recurso/empleado y
51
CAPÍTULO 7. DESARROLLO
una fecha se realizará una petición al backend, consultando el horario pertinente. Con este
horario se pinta la lista de huecos. Si están disponibles serán azules, en caso contrario, grises.
En caso de que no elija un empleado de preferencia, se le muestran huecos disponibles en
función de todos los horarios de los empleados. Una vez elegida la hora, el cliente pulsa un
botón continuar y se le muestra la segunda pantalla, con el componente ConfirmAppoint-
ment 7.14 (página 54). Este componente muestra el nombre del empleado/recurso elegido así
como la fecha y hora. Además también tiene un campo en el que puede añadir observaciones
sobre la cita. Estos dos componentes son navegables, es decir, se puede mover entre pantallas.
La coordinación de estas pantallas y la gestión de datos se hace por parte de un componente
matriz, BookAppointment. Una vez efectuada la reserva, se muestra un componente Ap-
pointmentBooked, con un mensaje confirmando la reserva y el envío del correo.
Una vez finalizado este caso de uso se deben realizar modificaciones en los siguientes
casos de uso: CU-07 Dueño actualiza negocio, CU-10 Dueño modifica horario de atención,
CU-11 Dueño gestiona bloqueos de empleados y CU-12 Empleado consulta su horario. En
el CU-07 y CU-10 se consultará, previamente a efectuar la modificación, si hay citas en ho-
rarios eliminados o con clientes/recursos eliminados, mediante una consulta al backend. De
darse el caso se mostrará un componente modal CancelledAppointmentListModal 7.15
(página 54), informando de que se cancelarán ciertas citas. Contiene un componente Cance-
lledAppointmentList, con la lista de citas que serán canceladas, y un campo de texto que
solicita una justificación. En el caso de que el usuario quiera cancelarlas, se le enviará un
correo informando de la cancelación a los clientes afectados. En el CU-11 el procedimiento
es el mismo, pero consultando las citas canceladas al añadir los bloqueos. Por último, en el
CU-12, ahora el horario del empleado puede tener huecos disponibles, bloqueados, con citas
52
CAPÍTULO 7. DESARROLLO
53
CAPÍTULO 7. DESARROLLO
Figura 7.15: Componente CancelledAppointmentListModal, que avisa de las citas que van a
ser canceladas si la operación se confirma
54
CAPÍTULO 7. DESARROLLO
Figura 7.16: Componente AppointmentList que muestra el historial de citas del usuario
55
CAPÍTULO 7. DESARROLLO
7.7 Iteración 5
7.7.1 Análisis
En esta iteración se desarrollarán los casos de uso relacionados con la gestión de citas por
parte del empleado.
56
CAPÍTULO 7. DESARROLLO
muestra ninguno. Si la cita es para un cliente con cuenta se le pide su DNI. Si la cita es para
un cliente sin cuenta se le pide nombre, apellidos, teléfono y DNI.
Figura 7.17: Formulario para la reserva de cita por parte del empleado
Una vez finalizado este caso de uso, tendremos que implementar una nueva consulta al
backend, que se realizará siempre que un empleado/dueño cancele citas. Esto ocurre en los
siguientes casos: CU-07 Dueño actualiza negocio, CU-10 Dueño modifica horario de atención,
CU-11 Dueño gestiona bloqueos de empleados y CU-18 Empleado cancela cita. Cuando se
cancelen citas, es posible que los clientes afectados no tengan cuenta, y no se les pueda avi-
sar por correo electrónico. Por tanto han de ser avisados telefónicamente. Para ello hacemos
uso de un modal, WarnedAppointmentListModal 7.18 (página 58), que contiene una lis-
ta de citas, reutilizando el componente CancelledAppointmentList, con citas de clientes
sin cuenta. Este componente avisa de que, los clientes que figuran en esas citas, deben ser
avisados telefónicamente.
CU-20 Empleado constata que un cliente no se presentó
Como parámetros necesitamos el id del usuario que solicita la llamada y el id de la cita.
Comprobamos que quien realiza la llamada es el empleado. De no serlo lanzamos la excepción
PermissionException. Ponemos a falso el boolean clientPresent que indica que el cliente no
acudió a la cita.
En la interfaz de usuario simplemente añadimos un botón que se muestre en el detalle de
la cita, solo si el usuario que consulta el detalle es el empleado.
57
CAPÍTULO 7. DESARROLLO
Figura 7.18: Componente WarnedAppointmentListModal, que muestra los clientes que deben
ser atendidos telefónicamente
58
CAPÍTULO 7. DESARROLLO
7.8 Iteración 6
7.8.1 Análisis
En esta iteración se implementarán los casos de uso relacionados con las reseñas y el uso
de Google Calendar. Los casos de so a desarrollar son:
59
CAPÍTULO 7. DESARROLLO
60
CAPÍTULO 7. DESARROLLO
61
CAPÍTULO 7. DESARROLLO
7.9 Iteración 7
En esta iteración redactamos la memoria y realizamos retoques y mejoras sobre algunos
casos de uso. Algunos de los cambios introducidos son:
• Modificamos el CU-21 Cliente añade una reseña de un negocio, para que el cliente solo
pueda realizar reseñas si ha solicitado cita en el negocio.
• Modificamos los CU-06 Usuario crea negocio y CU-07 Dueño actualiza negocio para
poder añadir empleados con cuenta a un negocio.
• Modificamos el CU-19 para que, cuando el empleado solicite cita a un cliente sin cuenta,
pueda especificar un coreo electrónico y se le envíe un correo para crearse una cuenta.
• Modificamos el CU-13 para añadir un enlace al detalle de la cita. Hacemos uso de ses-
sionStorage para guardar el id de la cita y le redirigimos a la pantalla de inicio de sesión.
Una vez autenticado le mostramos el detalle de la cita.
62
Capítulo 8
8.1 Conclusiones
El objetivo de este trabajo era automatizar al máximo el proceso de solicitar cita previa.
Para ello se quería reducir al mínimo las interacciones de las personas involucradas en el
proceso. Por ejemplo, al reservar cita, el cliente llama al negocio y, en el caso de que pueda
contestar, dejará su trabajo para atenderle. Haciendo uso de nuestra aplicación solo se ve
involucrado el cliente en el proceso, por tanto se consiguen mejoras de productividad por
ambos lados. El empleado no necesita atender al teléfono y el cliente no depende de que le
cojan, ni siquiera depende de que el negocio esté abierto. E incluso, si posteriormente quiere
cancelarla, se da la misma situación, ya no necesita hacer una llamada, solo pulsar un botón
en nuestra aplicación. Conseguimos así un proceso más sencillo, eficiente y productivo.
Todo el trabajo planificado para conseguir este objetivo ha sido finalizado y por tanto se
considera que el objetivo ha sido conseguido.
Por otra parte se han adquirido y mejorado conocimientos sobre varias tecnologías. Se
ha utilizado React y React-Redux, consolidando conocimientos adquiridos en el grado sobre
estas populares librerías. Se ha aprendido a utilizar la librería MUI, que provee de compo-
nentes React para una interfaz de usuario más atractiva. Se ha aprendido a usar la API de
Google mediante OAuth. También se han afianzado conocimientos sobre JavaScript, Java y su
ecosistema Spring.
En el grado y, especialmente, en la mención de Ingeniería Software, los dos lenguajes de
programación más utilizados son Java y JavaScript. Esto viene sin sorpresa porque son dos de
los lenguajes más demandados en el mercado laboral. Por estas razones se quiso utilizar estas
tecnologías para el desarrollo de esta aplicación, mejorando aptitudes obtenidas en el grado
y adquiriendo nuevas. Por último se han enriquecido competencias propias de la ingeniería,
como son el análisis de requisitos, metodologías de desarrollo, arquitectura software, etc…
63
CAPÍTULO 8. CONCLUSIONES Y TRABAJO FUTURO
64
Apéndices
65
Lista de acrónimos
DAO Data Access Object. 23, 27, 31, 33, 39, 50, 51
DTO Data Transfer Object. 28, 32, 36, 39, 43, 46, 51, 53, 59
66
Glosario
backend Parte del servidor de una aplicación, que gestiona la lógica de negocio y el acceso
a datos.. 3, 17, 23, 24, 27–29, 31–34, 36, 39, 41, 43, 44, 47, 50, 52, 53, 57, 59
framework Entorno de trabajo con artefactos software utilizado para el desarrollo software..
23, 64
frontend Parte del cliente de una aplicación que gestiona la interfaz gráfica con la que se
comunica el usuario.. 3, 17, 28, 31, 32, 34, 36, 37, 39, 41, 43, 46, 47, 53, 56, 59
hook Función utilizada para crear o acceder al estado y los ciclos de vida de React.. 25, 32,
36, 42–44, 47
67
Bibliografía
[11] “Página web de mysql workbench.” [En línea]. Disponible en: [Link]
products/workbench/
68
BIBLIOGRAFÍA
[23] “Página web de json web token.” [En línea]. Disponible en: [Link]
[26] “Página web de la librería react-router-dom.” [En línea]. Disponible en: https:
//[Link]/web/guides/quick-start
[27] “Tutorial de uso de la api de google en javascript.” [En línea]. Disponible en:
[Link]
[29] “Página web de react native.” [En línea]. Disponible en: [Link]
69