MainCashier
Mauricio Luduena, Erwin Onate.
Resumen
Con el objetivo de tener un mejor manejo de las cuentas y
del servicio en un restaurant, se implementó en este proyecto un programa que
lleva el estado de las mesas del restaurant: tiempo empleado, pedidos de cada
mesa, y el total que lleva la mesa. Se implementó también una base de datos
para mantener la lista de los productos ofrecidos en la tienda con sus
respectivos precios, a modo de llevar una mantención más simple de estos. También
se simuló la interacción de un botón en las mesas que indique cuando la mesa
está lista, para que se le pueda enviar la cuenta y liberar la mesa respectiva
en el panel. Finalmente, se implementó
un sistema de correo electrónico, tanto para enviar un mensaje personalizado,
como un mensaje al final del día, que indique todo lo vendido en el día (total
en dinero + cantidad de cada producto vendidas).
Introducción
Problema: El
padre de Mauricio está pensando en abrir una cadena de restaurantes en la
ciudad de Curicó cerca del Hospital de la ciudad, pero el desea que destaque
con respecto al resto de los restaurantes existentes en la zona. Es por ello
que nos ha encomendado la tarea de crear un programa que le permita gestionar los
pedidos de los clientes, para que él pueda conocer información de sus locales
sin la necesidad de llamarlos o ir personalmente y ver como va el negocio.
Solución:
Aceptando la petición del padre de Mauricio, optamos por realizar un programa
en java para poder satisfacer sus necesidad. Debido a que el programa será
utilizado por personas que probablemente no se manejen con los computadores,
era fundamental generar interfaces graficas que fueran amistosas, sencillas y fácil
manipulación. Teniendo esto en cuenta y sabiendo que teníamos conocimientos
previos en la creación de GUIs gracias al ramo de
Programación orientada a objetos, se eligió como lenguaje principal java.
Nuestra meta
era poder generar un primer acercamiento al programa que nos pedía el padre de Mauricio
y queríamos que cumpliera con las siguientes especificaciones:
·
contar
el tiempo en que tarda cada mesa en terminar de comer.
·
Manejar
los pedidos de cada mesa y mostrara el total de la cuenta en todo momento.
·
Avisar
a los encargados del local cuando una mesa pidiera la cuenta.
·
Permitir
enviar correos al padre de Mauricio, sin la necesidad de usar el navegador.
·
Que
envié el estado final de los movimientos de dinero al correo del Sr. Luduena cuando acabe el día.
Lograr todo
esto fue posible gracias a muchos de los tópicos que se estudiaron en este
ramo, como el manejo de hebras, sockets y clientes de correo.
Implementación
La
aplicación creada tiene el nombre de MainCashier y su
diagrama de clases se muestra en la figura 1.
Figura 1: Diagrama de clases de MainCashier
MainCashier: Clase principal del
programa. En esta clase se instancia la ventana principal y el servidor para
las mesas.
MainCashierGui: Frame principal, donde se encuentran los paneles de las
mesas, y el menú de correos. Contiene también el código que crea y envía el
mensaje (usando la clase Correo) del total de la venta al finalizar el día.
UniversalPane:
Clase Panel que corresponde a cada una de las mesas, cada una con un timer (creado en la
clase TimerTable), los botones para activación,
pedido y término.
Menu: Clase que
implementa el JFrame donde se pueden agregar pedidos
a la mesa, realiza la conexión a la base de datos para recuperar los precios de
cada producto.
Correo: Clase que implementa el envío de
correo. Se debe especificar el asunto y
el mensaje.
Mesas: Clase que implementa la
simulación de los botones de las mesas (mediante jButton),
los cuales envían una señal al frame principal de que
la mesa ha pedido la cuenta.
Servidor: Clase que crea el Servidor
que escuchará a los botones en las mesas.
TableTimer:
Clase que implementa el timer de las mesas, el cual
indica cuanto lleva esta activada.
Email: Clase que implementa el jFrame donde se puede enviar el correo electrónico. Se
puede especificar el asunto y el mensaje, pero el correo electrónico destino
está predeterminado (para efectos del proyecto) .
Menú Principal
La ventana
principal se muestra en la figura 2, donde podemos apreciar 4 paneles iguales que
representan a 4 mesas del restaurant (eventualmente podrías ser más).
Botón activar: Es accionado cuando llega gente a la
mesa correspondiente y genera los siguientes eventos:
·
Comienza
a correr el contador que se encuentra en la pare superior derecha de cada panel
(4 instancias de panel en el Frame).
·
Se
activan la casilla finalizar y Agregar Menú
Figura 2: Ventana principal MainCashier.
Agregar Menú: es accionado cuando se necesita
agregar algún pedido a la mesa, para ello se despliega una nueva ventana como
en la figura 3 (se explicará más adelante en el apartado de pedido).
Finalizar: Es accionado cuando la mesa pide la
cuenta y es hora de dar por finalizada la sesión del cliente. Se almacenan los
datos de la sesión y se limpia el panel correspondiente a la mesa terminada.
Correo: Despliega 2 opciones; enviar correo y
finalizar día. Cuando es necesario mandar algún correo al padre de Mauricio se
utiliza la opción enviar correo. Al ser seleccionado despliega la ventana de la
figura 5 (se explicará con mayor detalle en el apartado de Correo).
Cuando se
termina el día se selecciona terminar día, el cual enviará un
correo al papá de Mauricio con las sumas totales recaudadas en el día.
Pedidos
Figura 3: Panel de ingreso de pedidos
En la figura
3 podemos apreciar la ventana que es la encargada de ingresar el pedido de cada
una de las mesas (independiente de la mesa se llama al mismo tipo de ventana).
Podeos apreciar que en el sector superior izquierdo tenemos distintas categorías
que se pueden agregar al pedido: Entrada, Almuerzo, Comida Rápida, Bebidas y
Postre. Inmediatamente a la derecha tenemos los distintos platos por categoría que
se seleccionan de la lista. Los recuadros blancos son utilizados para ingresar
la cantidad (si no se ingresa cantidad o esta es distinta de un número, el
pedido no se ingresa). Y tenemos también un botón por categoría para ir
ingresando los platos. Estos se verán listados en el recuadro grande situado en
la parte inferior de la ventana. Para finalizar el ingreso basta con
seleccionar el botón terminar y se ingresaran los pedidos
en la ventana principal como se muestra a continuación.
Figura 4: Menú principal con pedidos realizados.
Cabe destacar que cada uno de los precios es restado de una base de datos al momento de ingresar el menú (se explicará con más detalle en el apartado de bases de datos).
Correo
Figura 5: Ventana de Correo MainCashier.
En la figura
5 se puede apreciar la ventana que se utiliza para enviar correos personalizados
al padre de Mauricio. Basta con agregar el asunto, el contenido del correo y
seleccionar enviar.
Para el envío
de correo se utilizó una librería llamada javamail
que permitía realizar el envío de forma sencilla y más segura. Las clases más
importantes en esta librería son:
·
Clase Properties: Ésta clase es la encargada de
almacenar las propiedades de la conexión que vamos a establecer con el servidor
de correo Saliente SMTP.
·
Clase MimeMessage: Aquí formaremos el mensaje que
deseamos enviar.
·
Clase Session: Será la clase encargada de manejar la
sesión de usuario
·
Clase Transport: Define los parámetros del protocolo
de transporte.
Bases de Datos.
IMPORTANTE: Para poder correr el
programa, se debe crear una base de datos en mysql
con el nombre “restaurant_database”, con tablas “food” (columnas “food_name” y “food_value”) y “total_day” (columnas ”name” y “value”)
En este trabajo se emplean bases de
datos, las cuales contienen el precio de los productos y lo acumulado en el
día, tanto en dinero como en productos vendidos. Para esto se ocupa el gestor
de bases de datos MySQL, mediante el mysql connector Java, usando la
API JDBC para establecer conexión y enviar peticiones o upgrades
a la database.
Para una conexión simple, se emplean
las clases Connection, Statement
y ResultSet. Connection se
encarga de la conexión a la base de datos, Statement
se usa para enviar las peticiones (mediante executeQuery)
o actualizaciones (mediante executeUpdate).
Finalmente se usa close para cerrar la conexión.
Petición de cuenta
Una de las
ideas del proyecto es que cada mesa pueda avisar cuando requiere de la cuenta,
para que su retiro del local sea expedito y agradable para el cliente. Es por
ello que la aplicación avisa cuando una mesa está pidiendo la cuenta. Para
fines de presentación se utilizo un panel que simulaba los botones. Este se
puede apreciar en la figura 6. Al pulsar los botones se envía por socket la
información a una hebra de servidor que esta constantemente corriendo. El servidor
al recibir una petición de cuenta oculta el panel principal y genera un pop-up
advirtiendo que mesa está pidiendo la cuenta, como se ve en la figura 7.
Figura 6: Simulador de botones de las mesas.
Figura 7: Pop-up para entrega de cuenta.
Uso sencillo
Recapitulando,
primero se debe iniciar la mesa para que empiece a correr el tiempo de uso y se
activen las casillas de finalizar y agregar menú luego es
necesario agregar el menú pedido por los clientes el cual se verá reflejado en
la ventana principal. Una vez que los clientes hayan pedido la cuenta se cierra
su sesión y se observa el total (esquina inferior derecha del panel). Una vez
que ha terminado el día se selecciona la opción terminar día para que se envíe un correo con el detalle de lo
consumido y la suma de dinero recaudada.
A futuro
De lo hablado en clases, se tiene una
gran cantidad de posibles mejoras para el programa:
-
Separar
las tablas de la base de datos por grupos de alimentos, ya que actualmente
están todos en la misma tabla.
-
Crear
un servidor central, que contenga la base de datos principal, y que los
clientes (programa en el restaurant) pidan a este servidor una lista de las
tablas de la base, para que estas actualicen su propia base de datos (local).
-
Controlar
la señal de los botones, así como agregar otro botón cuando la gente quiera
hacer un pedido.
-
Guardar
en la base de datos lo vendido en cada día, para poder llevar la contabilidad
del restaurant.
-
Para
impedir que el cliente termine el día antes de lo planeado, se podría
implementar un sistema en que el servidor envíe
un permiso al cliente para poder terminar el día.
Conclusiones
Si bien el proyecto no es una
solución final para el Papá de Mauricio, si se logro obtener un primer acercamiento
a lo que sería una aplicación para el uso laboral, ya que con el esqueleto que
se consiguió se puede hacer una primera presentación al Sr Luduena,
de forma tal que pueda dar sus observaciones y poder agregar características que
el estime convenientes. Por otro lado, a nivel de ramo, conseguimos implementar
hilos, TCP y envíos de correo. De esta forma se logra una ejecución en paralelo
tanto en los paneles de pedidos como en las interacciones con los botones (en
las mesas). La creación del servidor como un hilo del programa principal
funciona para lograr que este quede en estado de escucha, y la conexión TCP
simula la conexión con los botones.
Adicionalmente, gracias a las bases
de datos logramos mantener la lista de productos en una forma ordenada y fácil
de leer. Usando JDBC logramos conectarnos con la base de datos para poder
manejarla desde java y obtener la información de los productos. Claramente el
proyecto pudo haber abarcado una mayor cantidad de conceptos relacionados con
el curso, pero debido al tiempo que se le dedico a la GUI (que prácticamente consumió
cerca del 70% de la implementación) fue imposible de agregar. Francamente
quedamos conformes con el trabajo realizado, pues para fines prácticos el norte
del proyecto era poder usar los conceptos aprendidos en el ramo en una implementación
que diera solución a alguna problemática de la vida real.
Códigos fuentes
Se pueden
descargar desde aquí.