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í.