Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Índice
Introducción 3
Pruebas. 16
Conclusiones. 17
Bibliografía 23
https://github.com/ProyectoIngenieriaUEM/grupos-pi-19-20-grupo-1-1
https://trello.com/b/bIPNiTCI/grupo-proyecto-ingenieria
Introducción
Para esta entrega, que supone la última entrega de la asignatura y, por tanto,
prácticamente el final de nuestro proyecto, hemos realizado un trabajo bastante
exhaustivo, tanto del feedback que nos dio el profesor como de nuestro propio
proyecto.
Evidentemente, somos plenamente conscientes de la importancia que tiene el
feedback que nos dio el profesor para la entrega anterior, puesto que nos va a dar una
serie de carencias o potenciales mejoras existentes en nuestro proyecto. Por otra parte,
entendemos que igualmente, necesitamos estudiar nosotros, por nuestra cuenta, el
proyecto que estamos haciendo, y más a estas alturas de curso, puesto que debemos y,
afortunadamente, somos perfeccionistas, y estamos, en cierto modo, comprometidos
con el proyecto desarrollado, por lo que queremos que salga lo mejor posible,
intentando sacar los errores más pequeños para conseguir el mejor resultado. Se
podría decir, por tanto, que, básicamente, lo que hemos hecho para esta entrega ha
sido mejorar la funcionalidad y usabilidad de nuestro proyecto.
Es por esto que, para esta entrega no había que añadir ninguna parte en sí,
como pudo ser para la entrega anterior la incorporación de la base de datos, sino que,
en este caso, el objetivo era dejar el proyecto prácticamente acabado, algo que creemos
que hemos hecho como se ha explicado en el párrafo anterior: mediante el estudio del
feedback que el profesor nos dio para la entrega anterior, y el estudio propio del
proyecto.
Además, en esta parte nos hemos organizado para la preparación de los
diferentes videos que darían por finalizado el trabajo de este Proyecto y ofreciéndonos
la posibilidad de participar en el concurso PBS de la Escuela AID.
Objetivos del proyecto.
El principal objetivo de este trabajo es la creación de un sistema de control y
gestión de empleados, en el que se registren los propios datos del empleado, así como,
a lo largo de su vida como trabajador en esa empresa, la hora a la que entra y sale del
trabajo, guardándose en una base de datos, de forma que se refleje si está realizando
infracciones en ese ámbito de trabajo (por horarios).
Esto se conseguirá gracias a la comunicación entre el Hardware (Arduino) y el
Software (JAVA, base de datos).
Otros objetivos secundarios que se han ido originando con el paso de proyecto,
son la creación de informes de los empleados, dar de baja a usuarios, actualizar los
datos de un usuario y implementar una pantalla LCD para que interactúe con el
usuario al entrar y salir.
Tal y como ocurrió en las anteriores entregas, se ha vuelto a utilizar la librería
Mig Layout, debido a la importancia que tiene a la hora de realizar las ventanas de
nuestro programa, al igual que se utilizó la librería PanamaHiteck, para la comunicación
con Arduino. Sin embargo, para esta nueva entrega, hemos necesitado la librería
MySQL Conector Java, que permite la comunicación entre Java y MySQL.
Para explicar mejor el funcionamiento, se va a hacer una especie de “recorrido”
por el software, por lo que, lo que más sentido tiene es empezar por el principio,
evidentemente. No obstante, para esta entrega, creemos que va a ser más fácil, tanto
de explicar, como de entender, si se explica primero la novedad más importante de la
primera entrega: la base de datos. Como se ha podido ir viendo en anteriores entregas,
hasta ahora un vector de usuarios actuaba como base de datos, sin embargo, tras
utilizar MySQL, ya tenemos una base de datos propiamente dicha, que consta de tres
tablas:
● Usuarios: en esta tabla se guardan los usuarios, que poseen las siguientes
columnas o atributos:
○ Tarjeta.
○ Nombre.
○ Apellidos.
○ Cargo.
○ HorasExtra: columna en la que se van guardando (sumándose) las horas
extras que hay en total.
○ Dentro: booleano (1 ó 0) que indica si el usuario está dentro del trabajo
(1) o si, por el contrario, no está (0).
○ TimeStamp: fecha en la que se introduce
● Horario: horario de cada usuario (identificado con su tarjeta), que contiene las
siguientes columnas Tarjeta, DíaSemana, horaEntrada y HoraSalida. De esta
forma, para cada tarjeta habrá un total de 7 filas (una por cada día de la semana.
● Infracciones: tabla en la que se guardarán las infracciones de todos los usuarios
(se identificará, de nuevo, con la tarjeta), y tendrá las siguientes columnas:
○ Tarjeta.
○ FechaInfraccion.
○ TipoInfraccion: si es por salir antes de tiempo o por retraso.
○ TiempoInfracción: tiempo total de infracción, en minutos.
● Dar de alta: esta ventana está destinada, tal y como su nombre indica, a dar de
alta a los nuevos usuarios. En esta, debemos introducir nuestros datos
personales (nombre, apellidos y cargo), al igual que el horario y la tarjeta, todo
ello se hizo con ayuda de un controlador. En esta ventana, tras introducir todos
los datos y campos requeridos, se introduce en la base de datos. Tal y como se
enseñó en entregas anteriores, creímos interesante que el usuario no tuviera
que introducir manualmente la tarjeta, sino que procediera a leerla por el lector.
Aquí, queremos destacar el hecho de que, en el caso de que se intente dar de
alta un usuario con una tarjeta que ya existe en la base de datos, aparecerá una
ventana de error.
● Generar Informe: Esta opción nos genera una DefaultListView, en la cual se
muestran los distintos nombres de usuario, con sus tarjetas, decidimos poner
también las tarjetas, ya que aunque sea poco probable, podría darse el caso de
que dos personas con el mismo nombre y apellidos trabajen en una misma
empresa. Al clicar en uno de los usuarios, se nos generará un informe con los
datos del usuario, y sus infracciones, el cual podemos imprimir y guardar en el
formato que queramos.
● Otras gestiones: esta opción nos llevará a otra ventana, en la que nos pedirá el
código de la tarjeta y se nos darán dos opciones más: Dar de baja y Actualizar.
Esto lo hicimos así ya que, para la realización de ambas necesitamos el número
de tarjeta, por lo que, de esta forma, consideramos que sería más cómodo y
compacto a la hora de usarse. De igual forma que ha ocurrido en la pestaña para
darse de alta, lo que hicimos fue codificarlo de tal forma que no fuera necesario
escribir el código de la tarjeta (por la misma razón), sino que únicamente
pasándola por el lector fuera suficiente.
○ Dar de baja: al dar a este botón se da de baja al usuario y propietario de
la tarjeta previamente introducida. Una vez realizado esto, volveremos a
la pantalla principal, de tal forma que se permita seguir trabajando en la
tarea que nos atañe ese momento.
○ Actualizar: para actualizar los datos de un usuario. Aquí encontramos otra
evidente novedad con respecto a entregas anteriores, puesto que esto
estaba aún sin codificar. Como hemos dicho, esta clase nos permite
cambiar todos los datos que se deseen de un usuario, a excepción de la
tarjeta. Para conseguir una mayor comodidad a la hora de realizar esta
tarea, lo que se hizo fue que, una vez elegida la tarjeta del usuario que se
quería modificar, se autocompleta con los datos guardados hasta ahora,
de tal forma que sólo sea necesario cambiar los campos deseados.
Realmente, lo que hace esta clase es dar de baja al usuario para,
seguidamente, darle nuevamente de alta con los datos ya cambiados.
Todas estas ventanas reciben de la ventana de Gestión el Modelo, de tal forma
que no se vuelve a iniciar de nuevo conduciendo a errores.
Una vez explicada la ventana de Gestión, pasamos con la de Aplicación, que, al
igual que se ha ido diciendo anteriormente, recibe de la ventana principal el Modelo ya
inicializado. Esta ventana permite que, al pasar nuestra tarjeta por el lector, se
muestren nuestro nombre, y la base de datos junto con el programa detecte si el
usuario está entrando o saliendo (poniéndolo en la propia ventana de la aplicación), y
sabe si ha entrado tarde o salido antes, procediendo en esos casos, a la creación de una
infracción. Además, en la pantalla conectada en la placa Arduino, nos aparecerá un
mensaje diciendo “Bienvenido, nombreUsuario” o “Adiós, nombreUsuario”, (siendo
nombreUsuario, el nombre del propietario de la tarjeta) en función de si está entrando
al trabajo, o saliendo de él.
Lo mismo ocurre con la eliminación automática de los JFrame’s que ya hemos
utilizado, es decir, si, por ejemplo, estamos en la pantalla principal y damos al botón
“Aplicación”, nos dirigirá a la pantalla deseada, a la vez que se cierra la pantalla
principal, puesto que ya la hemos utilizado y no nos sirve para nada tenerla. Esto se ha
mantenido, debido a que lo seguimos considerando bueno tenerlo en nuestro proyecto.
● BBDD: clase destinada a la comunicación entre la base de datos de MySQL y Java,
mediante la que se van enviando las distintas consultas a MySQL. Es importante
añadir que, tal y como se ha comentado al principio de este apartado, se ha
utilizado la librería MySQL Conector Java, que es quien permite la comunciación
entre ambos. Por tanto, en función de lo que se desee hacer, cada una de las
siguientes clases llamará a esta para realizar cada una de las acciones que se
deseen.
● JavaRX: clase que establece la comunicación entre Arduino y Java
● Main: clase principal que nos dirige a la VentanaPrincipal, iniciando el programa.
● Usuario: objeto que contiene la información de un usuario, que se gestionan
desde el GestorUsuarios (se va a explicar a continuación) y se guardan en la base
de datos. Cada usuario tiene:
○ String nombre: nombre del usuario.
○ String apellidos: apellidos del usuario.
○ String cargo: cargo que ocupa en la empresa.
○ Tarjeta tarjeta: objeto del tipo tarjeta que contiene la información de la
tarjeta (más adelante se explica esta clase).
○ int horasExtra: horas extras que se calcularán con un método que tiene el
usuario, cada vez que este salga de la empresa.
○ Horario[] horario: Array del objeto horario que contiene el horario de
cada dia de la semana (entrada y salida).
○ ArrayList<Infracciones> infracciones: Lista de las infracciones que ha
cometido el usuario a lo largo de su vida laboral dentro de la empresa.
○ boolean dentro: booleano que indica si el usuario está dentro o fuera de
la empresa.
Es importante destacar que, en esta clase, existen los métodos necesarios para
gestionar las infracciones a nivel usuario, es decir, nos permite gestionar las
infracciones del usuario X.
● GestorUsuarios: clase que gestiona las acciones que van a ir dirigidas a los
distintos trabajadores (anteriormente, también se usaba como “base de datos”
mediante un vector, pero tras haber implementado la base BBDD, explicada
anteriormente, con mySQL, la clase GestorUsuario ya no tiene que desempeñar
esa tarea). Esta clase es la que se inicializa en la clase principal (Main, explicado
anteriormente) y que se va cediendo entre cada ventana, de tal forma que no se
pierdan datos y el proyecto tenga una continuidad, evitando posibles errores.
Como ya hemos dicho, esta clase va a gestionar las distintas acciones que se
pueden realizar sobre los usuarios mediante los siguientes métodos:
○ darAlta.
○ darBaja.
○ actualizar.
○ listarUsuarios. (Este método ahora genera un informe).
● Horario: esta es un objeto que nos crea los horarios en función de cada día de la
semana. Esto se crea en un array dentro del objeto usuario.
● Tarjeta: esta clase únicamente tiene el atributo código, que nos permite acceder
al código de cada tarjeta, que tanto se usa en los distintos métodos, puesto que
es una forma segura de identificar a los distintos usuarios.
● Infracciones: Objeto que maneja la información de las infracciones, estas se
guardarán en un ArrayList, de tal forma que cada usuario tenga su propio
ArrayList de infracciones. Las infracciones de cada usuario se podrán listar,
gracias a un toString, que nos mostrará qué infracciones se han cometido,
quedando, por ejemplo:
● Controlador: Clase que controla la vistaGestorUsuarios, para dar de alta a un
usuario con los datos y campos dados.
● ControladorActualizar: clase que controla la ventanaActualizar, que va a realizar
la tarea de actualizar los datos de un usuario ya creado (lo que va a hacer va a
ser dar de baja, y, seguidamente, dar de alta al usuario con los datos nuevos).
Además, pese a que parezca un detalle pequeño, es muy importante cambiar
ciertas partes del código en función del ordenador:
● Puerto de arduino que se utilice, en las siguientes clases: VistaGestorUsuarios,
JavaRX, VentanaAplicacion.
● Conexión en función del sistema operativo que se use, en la clase BBDD.
Por último, en cuanto a lo que a este apartado se refiere, vamos a comentar un
poco el diagrama de clases, y es que, el diagrama sigue siendo básicamente el mismo
que el anterior, a excepción de la clase BBDD, por lo que se decidió consensuadamente
no volver a adjuntar de nuevo este diagrama.
Para mostrar la arquitectura del hardware, nos habría gustado hacer un
diagrama, pero la página web tinkercad, no tiene la opción de añadir un sensor RFID, y
la aplicación fritzing, se ha convertido en una aplicación de pago, por otro lado, la
aplicación circuit.io, no nos dejaba cambiar de posición las conexiones. Por lo que
hemos optado por escribir las conexiones utilizadas:
RST 9 9
VSS GND
VDD 5V
VO Potenciómetro
RS 8
RW GND
E 2
D4 4
D5 5
D6 6
D7 7
A 5V
K GND
Desarrollo del proyecto.
Lo primero que debemos decir en este aspecto que nuestro proyecto se ha ido
desarrollando en varias entregas, lo que nos ofrecía la posibilidad de que el profesor
nos fuera corrigiendo errores y mostrándonos oportunidades de mejora, reflejándose
en los feedbacks, lo que nos ofrecía una continua ayuda para realizar un proyecto de la
forma más profesional posible.
Una vez explicado esto, pasamos a analizar un poco más en profundidad el
proyecto, que se ha desarrollado en varios lenguajes: Java (nodo central), Arduino (para
el uso del hardware) y mySQL (base de datos).
En cuanto a entornos, debemos diferenciar los distintos entornos en función de
los lenguajes.
En lo que a Java respecta, el proyecto se ha desarrollado prácticamente en su
totalidad (veremos una pequeña excepción un poco más adelante) en Eclipse, debido a
la facilidad que tiene a la hora de utilizar los elementos, complementos y librerías
necesarios. Sin embargo, no encontrábamos información sobre ciertos complementos
que requeríamos para realizar determinadas partes de nuestro proyecto, como lo es la
parte de generación de informes. Este hecho nos obligó a utilizar para ese momento el
entorno de NetBeans (esta es la excepción de la que hemos hablado anteriormente),
puesto que nos fue más fácil utilizar el plug-in que necesitábamos para esta tarea, y,
como, al final, tanto NetBeans como Eclipse son IDE’s (es decir, entornos de
programación), simplemente guardamos la parte de código que se realizó en NetBeans
y lo abrimos desde Eclipse. Por otra parte, la parte programa en Arduino se desarrolló
en el propio software de Arduino.
Cabe destacar que también se utilizó MySQL para la creación y administración de
la base de datos, usada para almacenar registros de entrada/salida junto con horarios e
infracciones de cada empleado, así como la posibilidad de añadir y retirar empleados.
Mediante XAMPP y gracias a phpMyAdmin, se creó la base de datos, para el flujo de
información se utilizó una librería determinada que conectaba el núcleo java con la
base de datos. Las querys usadas están escritas en MySQL, introducido en java
mediante strings.
A continuación, pasamos a hablar acerca de las librerías. Aquí se van a mostrar
las más importantes o las que más se han usado, sin embargo, se han implementado
algunas más que no se van a mostrar aquí con el fin de no extender innecesariamente
la memoria, ya que no son especialmente relevantes, sino que se han utilizado para
hacer tareas más pequeñas.
En primer lugar, hemos utilizado PanamaHitek, que nos ha permitido la
comunicación, de una manera relativamente sencilla, entre JAVA y Arduino. Ésta, de
hecho, fue la primera librería que utilizamos, puesto que la tarea que esta librería
realiza es fundamental para el desarrollo del proyecto, porque pese a que hay otras
formas, esta librería es la más utilizada, y en parte es por la facilidad y lo práctico que es
a la hora de utilizarlo.
Por otra parte, es importante que, al igual que se han “enlzado” JAVA y Arduino,
se puedan “enlazar” JAVA y phpMyAdmin, y, para ello, se ha utilizado la librería MySQL
Connector Java, que nos permite realizar esa tarea de una forma bastante sencilla,
ayudándonos a mejorar la funcionalidad del proyecto.
La última librería más importante que se va a comentar es la de Jasper Reports,
que nos permite conectarnos a una base de datos, desde la que poder generar
informes. Además, nos da la opción de diseñarlo nosotros fácilmente, de forma que lo
hagamos de la manera que más se ajuste a nuestras necesidades.
En primer lugar, debemos hablar de la propia dificultad que conlleva el trabajo
en grupo entre los integrantes del grupo, puesto que, en parte porque esta asignatura
se cursa en modalidad online y en parte debido a la situación que se está afrontando a
nivel mundial. Queremos hablar un poco de esta dificultad ya que, la forma que
teníamos de comunicarnos los unos con los otros era mediante mensajes de WhatsApp,
y las reuniones las hacíamos por Hangouts y Zoom, sin embargo, por mucho que nos
viéramos por videollamada o pudiésemos escribirnos mensajes no puede suplir
completamente al hecho de estar en persona con la otra persona. Ahora bien, a nuestro
parecer esto sí que suponía un problema, pero en la misma medida que nos
proporcionaba una oportunidad, ya que esto nos puede ayudar cuando estemos
trabajando, el día de mañana; pero esto es algo que ya se comentará más en
profundidad (ver C
onclusiones).
Hablando ahora de problemas que hemos tenido con el código, los hemos
tenido constantemente, sin embargo, no los consideramos de por sí dificultades, puesto
que es algo relativamente sencillo de que ocurra (son muchas cosas a tener en cuenta, y
no es difícil equivocarnos en una letra, nombre, o comando), a no ser que haya afectado
más fuertemente al desarrollo del proyecto. Y es que, aunque no haya habido muchos
problemas así, es cierto que sí que ha habido algunos, siendo los más importantes dos:
un error de JAVA, y XAMPP para MacOS.
En primer lugar, vamos a hablar del siguiente error que obteníamos en JAVA:
Tras mucho investigar, vimos que el error era por la versión (aunque, en
realidad, es algo que pone en el propio error, pero no entendíamos bien qué pasaba,
puesto que teníamos una versión bastante nueva, sino la más). Por lo que lo que
hicimos fue utilizar unas versiones que teníamos antiguas, y esta fue la solución pero
sólo para una de las integrantes del grupo. Sabemos que este error no está causado
porque hayamos realizado una sintaxis errónea a la hora de programar, sino que es un
error debido a la versión de java, pese a que ni siquiera esta solución fue suficiente para
todos los integrantes del equipo.
Por otra parte, una gran dificultad que tuvimos fue con el XAMPP en los
ordenadores MacOS, debido a que este paquete no funcionaba correctamente en este
sistema operativo. Esto impedía su contribución en las tareas de MySQL. Tras recabar
mucha información, encontramos MAMP, que es el equivalente para dicho sistema
operativo.
Otra dificultad que tuvimos, fue a la hora de utilizar SQL, puesto que, aunque
para algunos de nosotros esto no era del todo nuevo, es cierto que no estamos tan
acostumbrados a usarlo como podemos estarlo con Java. Esto puede parecer un detalle
sin importancia, pero lo cierto es que nos supuso una carga de trabajo superior debido,
precisamente, a esto.
Pruebas.
Para demostrar el correcto funcionamiento de tanto el hardware como el
software, hemos ido mandando en cada checkpoint un video del estado del mismo,
además esta subido todo el código a github para demostrar la veracidad de estos
vídeos.
Nota: No estamos seguros de haber entendido correctamente este apartado, por lo que
esperamos el feedback del profesor para corregirlo en el caso de que fuera necesario para la
entrega final.
Conclusiones.
Sin embargo, pese a que en esta entrega no hemos realizado una tarea muy
grande de código, como se ha mencionado anteriormente, en su momento sí que se
realizaron, añadiendo al proyecto todas las funciones necesarias para que el proyecto
tuviera sentido y calidad (dar de alta, modificar, generar informes, dar de baja, etc.),
conectar con la base de datos y la creación de las ventanas necesarias, entre otros. Es
por esto que seguimos contentos con el resultado obtenido, pese a que como ya hemos
dicho en los apartado de Trabajo en proceso o Trabajo futuro, queda trabajo por hacer,
que en algunos casos sí que vamos a realizar para la entrega final del proyecto, o que,
por el contrario, no pensamos realizar para la misma por determinadas razones.
Control de revisiones
10 02/04/2020 Sergio G. G. Explicación de los cambios del diagrama de
clases (parte 2).
Tercera entrega
28 24/04/2020 Marina A. C. Comentar código que se llevaba hasta entonces.
38 25/04/2020 Marcos S.C Comprobar relaciones CASCADE entre keys : ¿Si
Sergio G.G. borro un usuario, se borran sus respectivos
horarios e infracciones?
55 26/04/2020 Marcos S.C Pruebas finales del código comprobando que
Sergio G.G. todo funciona a la perfección.
Marina A. C.
57 26/04/2020 Sergio G. G. Exportar y subir a GitHub el archivo sql de php
my admin.
Cuarta entrega
58 14/05/2020 Sergio G. G. Creación de informes.
73 17/05/2020 Sergio G. G. Vídeo realizado para esta entrega del proyecto.
Bibliografía
Antony García González (agosto 17, 2014),”Comunicar java con bases de datos mysql”.
Documento de
internet:http://panamahitek.com/comunicar-java-con-base-de-datos-mysql/
Ayam (noviembre 12, 2018), “Cómo conectar java (eclipse) con base de datos mysql”.
Documento de internet:
https://algoritmosyalgomas.com/como-conectar-java-eclipse-con-base-de-datos-mysql-
parte-1/
Nos (Julio 1, 2010), “Are enums supported by JDBC?”. Foro de internet:
https://stackoverflow.com/questions/3155967/are-enums-supported-by-jdbc
Oracle Corporation (2020), “Chapter 5 Connector/J (JDBC) Reference”. Documentación de
internet:
https://dev.mysql.com/doc/connector-j/5.1/en/connector-j-reference-type-conversions.h
tml