Académique Documents
Professionnel Documents
Culture Documents
Curso 2011-2012
Aplicacin de gestin para el TPV de una cafetera, trabajo fin de estudios
de Adela Chandro Velasco, dirigido por Eloy Javier Mata Sots (publicado por la
Universidad de La Rioja), se difunde bajo una Licencia
Creative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0 Unported.
Permisos que vayan ms all de lo cubierto por esta licencia pueden solicitarse a los
titulares del copyright.
El autor
Universidad de La Rioja, Servicio de Publicaciones, 2012
publicaciones.unirioja.es
E-mail: publicaciones@unirioja.es
UNIVERSIDAD DE LA RIOJA
Facultad de Ciencias, Estudios Agroalimentarios e Informtica
1
INDICE 2
1. D. O. P. 4
1.1 Antecedentes 4
1.2 Objetivos 4
1.3 Descripcin 5
1.4 Entregables 6
1.5 Estructura de descomposicin de tareas 6
1.6 Plan de trabajo 9
1.7 Riesgos 11
2. ANLISIS 12
2.1 Anlisis de requisitos 12
2.1.1 Identificacin de actores 12
2.1.2 Identificacin de los casos de uso 12
2.2 Anlisis de clases 29
2.3 Anlisis de la interfaz 30
2.4 Anlisis de pruebas 31
3. DISEO 33
3.1 Arquitectura del sistema 33
3.2 Diseo de la interfaz 33
3.3 Diseo de las clases 53
3.4 Diseo de la base de datos 61
4. IMPLEMENTACIN 65
4.1 Tecnologas elegidas y herramientas utilizadas 65
4.2 Construccin del sistema de informacin 66
4.2.1 implantacin de la base de datos 66
4.2.2 Preparacin del entorno de construccin 66
4.2.2.1 Libreras externas necesarias 66
4.2.3 Problemas con MySQL 67
4.2.3.1 Borrado y modificacin de productos y familias 67
4.2.3.2 Guardar valores decimales en MySQL 68
4.2.3.3 Modificaciones en la identificacin y creacin de camareros 69
4.2.3.4 Guardar imgenes en la base de datos 69
4.2.4 Problemas encontrados en la aplicacin de gestin 70
2
4.2.4.1 Cierre de caja terico o real 70
4.2.4.2 Reporte de informes 70
4.2.5 Problemas encontrados en la pantalla de ventas 71
4.2.5.1 Tamao de la pantalla de ventas 71
4.2.5.2 Introduccin de precios directos 71
4.2.5.3 Ventas aplazadas 72
4.2.5.4 Imprimir tickets de venta 72
5. GESTIN Y CONCLUSIONES 76
5.1 Planificacin 76
5.2 Aplazamiento 77
5.3 Conclusiones 80
6. APENDICE I: ACTAS DE REUNIONES 82
6.1 Actas de reuniones con los clientes 82
6.2 Actas de reuniones con el director del proyecto 86
3
7. D. O. P.
1.1 Antecedentes
El proyecto consiste en el desarrollo de una aplicacin software para el punto
de venta de un pub juvenil.
1.2 Objetivos
La aplicacin debe:
4
1.3 Descripcin
El proyecto es una aplicacin genrica desarrollada para el TPV de cualquier
pub o similar, intuitiva y fcil de manejar, de forma que cualquier usuario sin
conocimientos informticos pueda utilizarlo.
El punto de venta:
Consistente en una pantalla donde visualizar grficamente todos los productos
a la venta, agrupados por categoras (familias), donde todas las funciones deben ser
diseadas para una pantalla tctil.
Permitir:
El mdulo de gestin:
Permitir:
5
1.4 Entregables
Conocimientos previos:
Establecer horario del proyecto: 1 hora.
Conocimiento del funcionamiento de la empresa: 1hora.
TOTAL: 2 horas.
Memoria:
Redaccin de la memoria: 30 horas.
6
Generacin de grficos y diagramas: 30 horas.
Digitalizacin de la memoria: 10 horas.
TOTAL: 70 horas.
Seguimiento:
Reuniones con el cliente: 3 horas.
Reuniones con el tutor: 10 horas.
Levantar actas: 3horas.
TOTAL: 16 horas.
Anlisis de requisitos:
Creacin de casos de uso: 10 horas.
Anlisis de clases: 2 horas.
Anlisis de la interfaz: 2 horas.
Anlisis de pruebas: 1 hora.
Digitalizar diagramas creados: 5 horas.
TOTAL: 20 horas.
Diseo:
Crear diagramas de clases: 10 horas.
Digitalizar los diagramas creados: 5 horas.
TOTAL: 15 horas.
7
Mdulo de familias: 2 horas.
Mdulo de productos: 2 horas.
Mdulo de camareros: 2 horas.
Mdulo de ventas: 2 horas.
Mdulo de cierre de caja: 2 horas.
Mdulo de informes: 2 horas.
Mdulo de configuracin: 2 horas.
Realizacin de un prototipo: 15 horas.
TOTAL: 35 horas.
Implementacin:
Mdulo de seguridad: 20 horas.
Pantalla de ventas: 20 horas.
Pantalla de inicio del mdulo de gestin: 20 horas.
Mdulo de familias: 20 horas.
Mdulo de productos: 20 horas.
Mdulo de camareros: 20 horas.
Mdulo de ventas: 20 horas.
Mdulo de cierre de caja: 20 horas.
Mdulo de informes: 20 horas.
Mdulo de configuracin: 20 horas
Creacin de un prototipo y ajustes (si fuese necesario):40 horas.
TOTAL: 240 horas.
Pruebas:
Mdulo de seguridad: 1 hora.
Pantalla de ventas: 1 hora.
Pantalla de inicio del mdulo de gestin: 1 hora.
Mdulo de familias: 1 hora.
Mdulo de productos: 1 hora.
Mdulo de camareros: 1 hora.
Mdulo de ventas: 1 hora.
Mdulo de cierre de caja: 1 hora.
8
Mdulo de informes: 1 hora.
Mdulo de configuracin: 1 hora.
TOTAL: 10 horas.
Instalacin de la aplicacin:
Creacin de un ejecutable: 10 horas.
Instalacin en la empresa: 5 horas.
Lanzar batera de pruebas de integracin y retocar (si fuese necesario):
15 horas.
TOTAL: 30 horas.
Preparar defensa:
Crear presentacin: 20 horas.
Ensayos y revisin: 5 horas.
TOTAL: 25 horas.
9
octubre 2010 noviembre 2010 diciembre 2010 enero 2011 febrero 2011 marzo 2011 abril 2011
15 18 21 24 27 30 03 06 09 12 15 18 21 24 27 30 02 05 08 11 14 17 20 23 26 29 02 05 08 11 14 17 20 23 26 29 01 04 07 10 13 16 19 22 25 28 31 03 06 09 12 15 18 21 24 27 02 05 08 11 14 17 20 23 26 29 01 04 07
23/09 Conocimientos
24/09 previos
13/10 Anlisis
15/10 de Requisitos iniciales
16/03 Pruebas
18/03
Enfermedad o accidente:
En cualquiera de los 2 casos, si fuese necesario se hara una replanificacin del
proyecto.
Cambios en las especificaciones:
Segn los nuevos requisitos se procedera a una replanificacin del proyecto, en
caso de que lo ya planificado no sea consecuente con los nuevos requisitos, o a una
ampliacin posterior, en el caso contrario.
Estimaciones mal realizadas:
En caso de que sean por defecto, usaremos los das libres para cubrir las malas
estimaciones. Si fuesen por exceso, se aprovechara para adelantar trabajo en
previsin de una mala estimacin posterior.
Cambios en el horario de trabajo:
Se ha previsto este riesgo dejando una holgura a la hora de la entrega, para ajustes
finales. Y en caso de que el cambio en el horario fuera extremo, la fecha de entrega
se prolongara.
Errores de diseo:
Si hubiese algn error de diseo se documentarn los fallos y se reajustar la
planificacin de acuerdo al nuevo diseo.
Daos software:
Para solucionar posibles daos en el software se crearan varias copias de seguridad
del proyecto durante su realizacin.
Suspensin del proyecto por la empresa:
En este caso el proyecto se continuara con fines acadmicos hasta lo expuesto en
el alcance.
11
2. ANALISIS
2.1 Anlisis de requisitos
2.1.1 Identificacin de actores
Usuario: solo tiene acceso a la pantalla de ventas, por lo que solo podr desarrollar
los casos de uso que se apliquen en ella.
Encargado: tiene acceso tanto a la pantalla de ventas como al mdulo de gestin,
pero no al acceso como administrador, por lo que podr desarrollar todos los casos
de uso del usuario adems de los suyos propios.
Administrador: tiene acceso total a la aplicacin, y es el nico puede realizar todos
los casos de uso.
2.1.2 Identificacin de los casos de uso
12
ESPECIFICACIN DE LOS CASOS DE USO
Actores: Administrador(A).
Pasos:
13
2. Cambiar contrasea administrador
Actores: Administrador(A).
Pasos:
14
3. Cambiar contrasea encargado
Pasos:
15
4. Identificacin encargado
Pasos:
16
5. Gestionar familias
Pasos:
17
18
6. Gestionar productos
Pasos:
19
20
7. Gestionar camareros
Pasos:
21
8. Eliminar venta confirmada
Pasos:
22
9. Hacer cierre de caja
Pasos:
23
10. Sacar informes
Pasos:
24
11. Cambiar la configuracin
Pasos:
25
12. Crear venta
Pasos:
26
Repetir este paso las veces que sean necesarias hasta obtener el
nmero de unidades deseado.
3.1.2.S.: Vuelve al flujo principal en el paso 3.
3.2. El nmero de unidades es mayor al deseado.
3.2.1.U.: Pulsa el botn para disminuir en uno el nmero de unidades.
Repetir este paso las veces que sean necesarias hasta obtener el
nmero de unidades deseado.
3.2.2.S.: Vuelve al flujo principal en el paso 3.
5.1. Eliminar la lnea de venta.
5.1.1.U.: Selecciona la lnea de venta a eliminar y pulsa eliminar lnea.
5.1.2.S.: Eliminar el registro de lnea de venta y modifica el importe total en
pantalla.
5.1.3.S.: Vuelve al flujo principal despus del paso 5.
5.2. Aplazar venta.
5.2.1.U.: Selecciona el botn Aplazar venta.
5.2.2.S.: Registra la venta como venta aplazada.
5.2.3.S.: Finaliza el caso de uso.
5.3. Anular la venta completa, sin confirmar.
5.3.1.U.: Pulsar botn Anular venta.
5.3.2.S.: Elimina el registro de venta completo.
5.3.3.S.: Finaliza el caso de uso.
5.4. Imprimir ticket de venta.
5.4.1.U.: Pulsar Imprimir ticket.
5.4.2.S.: Imprime el ticket de venta.
5.4.3.S.: Vuelve al flujo principal en el paso 7.
Diagrama de actividad:
27
28
2.2 Anlisis de clases
Ser necesario crear las siguientes clases, con al menos los campos que se enumeran:
Venta:
Identificador: numrico y nico para cada venta.
Camarero: clase a crear.
Fecha (incluye hora): Date.
Lista de lneas de venta: clase a crear.
IVA: numrico y con 2 decimales.
Importe: numrico y con 2 decimales.
Total: numrico y con 2 decimales.
Estado: texto.
Lnea de venta:
Producto: clase a crear.
Unidades: numrico.
Venta: clase a crear.
Total: numrico y con 2 decimales.
Producto:
Identificador: numrico y nico para cada producto.
Nombre: texto.
Familia: clase a crear.
Precio: numrico y con 2 decimales.
Imagen: texto (opcional).
Familia:
Identificador: numrico y nico para cada familia.
Nombre: texto.
Imagen: texto (opcional).
Camarero:
Identificador: texto.
Nombre: texto.
29
2.3 Anlisis de la interfaz
Debemos diferenciar entre los 2 mdulos del programa:
Pantalla de ventas:
La pantalla debera estar siempre maximizada, es decir, ocupar toda la pantalla del
ordenador y dividida en varios espacios:
Un espacio para las familias, con un botn por familia.
Un espacio para los productos, con un botn por producto, donde
mostrar todos los productos de la familia seleccionada.
Un espacio donde mostrar la venta activa, siempre visible. Con un
espacio para el total.
Un espacio para los botones de identificacin de los camareros.
Un espacio para los botones que controlan la venta activa: aplazar,
recuperar, anular venta, eliminar lnea, confirmar venta e imprimir ticket.
Un espacio para los botones que controlan los productos: nmero de
unidades, aadir unidad, disminuir unidad y aadir producto de precio directo.
Mdulo de gestin:
Las pantallas del mdulo de gestin se deben poder minimizar, maximizar y
cerrar en cualquier momento.
Despus cada men debe tener su propio diseo:
30
Mdulo de gestin de familias: debe contener un formulario para
introducir los datos, adems de los botones de aceptar, mostrar lista, modificar
y eliminar.
Mdulo de gestin de productos: ser similar al mdulo de gestin de
familias, pero con diferente formulario.
Mdulo de gestin de camareros: debe contener un cuadro de texto
para introducir el nmero de camareros y 2 botones, aceptar e identificar.
Mdulo de gestin de ventas: debe contener una lista con las ventas
diarias y 2 botones, eliminar e imprimir.
Mdulo de cierre de caja: debe mostrar un formulario con los datos del
balance, no modificable y 2 botones para imprimir el balance o hacer el cierre
de caja.
Mdulo de gestin de informes: debe contener 4 botones que dan
acceso cada uno a un formulario para introducir los datos del informe
seleccionado.
Mdulo de configuracin: debe contener 4 botones que dan acceso
cada uno a un formulario diferente en el que modificar la configuracin del
programa.
Varias de las pantallas descritas darn acceso a otras pantallas an sin
determinar, pero con diseo similar.
31
Cambiar contrasea del encargado, identificado como encargado, y
despus, intentar acceder como encargado con la contrasea vieja.
En el mdulo de gestin de familias:
Crear una familia nueva, modificarla y despus eliminarla.
En el mdulo de gestin de productos:
Crear un producto nuevo, modificarlo y eliminarlo.
En el mdulo de gestin de camareros:
Cambiar el nmero de camareros y probar a identificarlos.
En el mdulo de gestin de ventas:
Seleccionar venta, imprimirla y eliminarla.
En el mdulo de gestin de informes:
Rellenar el formulario cada formulario varias veces y con diferentes
datos y guardar e imprimir los informes resultantes.
Imprimir varios balances de caja antes de cerrar la caja.
Cerrar la caja y comprobar el nuevo balance del da.
En la pantalla de ventas:
Intentar crear una venta sin seleccionar un camarero.
Crear venta con varios productos de diferentes familias y anularla.
Crear venta con productos varios de precio directo y productos con ms
de 1 unidad y confirmarla.
Crear venta y aplazarla. Despus recuperarla y aadir ms productos.
Imprimir el ticket de venta.
Crear venta, seleccionar una lnea de venta y eliminarla. Confirmar la
venta.
32
3. DISEO
3.1 Arquitectura del sistema
En un principio el desarrollo de la aplicacin se bas en una arquitectura de 3
unidades funcionales (o capas) bien diferenciadas, cuyo esquema es:
La capa de presentacin
Se encarga de la presentacin con la que se encuentra el usuario, en nuestro caso
est formada por todas las interfaces grficas tanto de la aplicacin de gestin
como de la pantalla de ventas.
La capa de lgica de negocio
Es el ncleo del sistema en el que se realizar las operaciones y clculos necesarios
para el funcionamiento de la aplicacin. Ests formada por aquellos
procedimientos que albergan las diferentes funciones a utilizar por la aplicacin.
La capa de persistencia
Se encarga del acceso a los sistemas de almacenamiento, independizando la
aplicacin del sistema de persistencia (en nuestro caso la base de datos). Estar
formada por las funciones de acceso a la base de datos y a sus respectivas tablas.
33
Capa de presentacin (UI - User Interface)
Como en la arquitectura anterior, est compuesta por las interfaces grficas con las
que se encuentra el usuario final. En la aplicacin los paquetes
APlicacionGestionTPV y PantallaVentas comprenden esta capa.
Capa de lgica de negocio (BLL - Bussines Logic Layer)
Aunque mantiene el nombre de la arquitectura anterior sus funciones se reducen a
presentar una interfaz para brindar servicios a la capa de presentacin, es decir,
el intermediario entre la capa de representacin y las capas de acceso a los datos y
entidades. Comprende los paquetes Logica de ambas soluciones en la aplicacin.
Capa de acceso a los datos (DAL - Data Access Layer)
Es una porcin del cdigo que realiza justamente el acceso a los datos. De esta
manera, cuando es necesario cambiar el motor de la base de datos, solo tendremos
que corregir esta capa. En la aplicacin comprende los paquetes Persistencia de
ambas soluciones.
Capa de entidades(Domain Entity Layer)
Corresponde al dominio de la aplicacin. En ella se encuentra la declaracin de las
entidades de la aplicacin de manera que se puedan referenciar desde otras capas
sin entrar en ciclos recursivos de compilacin. Comprende el paquete
ClasesBasicas en la aplicacin.
Capa de datos (Data Tier)
Es donde estn los datos y se corresponde directamente con la definicin de
esquemas, tablas, vistas, procedimientos almacenados y todo lo que se pueda o
34
deba poner en un motor de base de datos. Equivalente a la base de datos
pubchandro en la aplicacin.
Fcil de utilizar.
Intuitiva.
Segura.
Permitir deshacer una accin siempre que sea posible.
Permitir cancelar la realizacin de la accin.
Tiene que ser totalmente tctil.
La pantalla de ventas.
La aplicacin de gestin.
Para poder introducir los datos debemos utilizar el teclado en pantalla que nos
facilita Windows.
35
Diagrama de interconexin de pantallas de la aplicacin de gestin
Pantalla de ventas
36
Al pulsar en una familia, si hay un camarero seleccionado, la zona de productos
mostrar los productos asociados a la familia seleccionada.
Contiene una pantallita con el nmero de unidades y 8 botones, cada uno con
una funcin propia:
37
Eliminar lnea: si hay una lnea de producto seleccionada, la elimina y reduce su
precio del total.
Ventana total
Tiene 2 botones:
38
Salir: que cierra la aplicacin.
Dispone de 9 botones:
39
Configuracin: da acceso al mdulo de configuracin de la aplicacin.
Adems tambin dispone del botn para volver a la pantalla del men
principal.
40
Contiene 2 cuadros de texto, para introducir la nueva contrasea, y 2 botones:
uno para guardarla y otro para volver a la pantalla principal del mdulo de seguridad.
Pantalla de listado
41
Dispone de un listado cuyos elementos son seleccionables, un botn para
volver al formulario sin seleccionar ninguno y si el listado supera los 8 elementos una
barra de scroll para ver el listado completo.
42
Pantalla principal del mdulo de gestin de camareros
Aceptar: que guarda los cambios y despus vuelve a la pantalla principal del
mdulo de gestin de camareros.
43
Pantalla principal del mdulo de gestin de ventas
44
Eliminar: muestra un mensaje de seguridad que pregunta si est seguro de
eliminarla.
Cerrar caja: realiza el cierre de caja, pasa las ventas diarias al histrico dejando
el balance a 0 y muestra el cierre de caja en un pdf listo para imprimirlo o guardarlo en
un archivo.
Contiene 6 botones, los cuatro primeros dan acceso al formulario del informe
seleccionado, el quinto, a la pantalla del men de listados y el sexto permite volver al
men principal.
45
Pantalla del formulario de informe de ventas
La pantalla contiene unos cuadros de texto para introducir las fechas inicial y
final del informe, 2 casillas seleccionables para tomar las fechas iniciales y finales del
46
programa, un listado donde se muestran los camareros candidatos seleccionables, y
otro donde se muestren los ya seleccionados, y 5 botones:
47
Pantalla del formulario de informe de productos
48
Contiene unos cuadros de texto donde introducir las fechas inicial y final y 2
botones:
49
Pantalla del formulario de opciones para el listado de productos
50
Pantalla principal del mdulo de configuracin
51
Pantalla de configuracin de la apariencia del ticket de venta
52
Pantalla de configuracin de la apariencia de informes y listados
Familia
La clase Familia representa a las familias en las que clasifica a los productos a la
venta en el establecimiento.
Familia
- codigo: int
- descripcion: string
- imagen: string
- productos: List<Producto>
+ Familia(int cod, string nombre, String icono): Familia
+ Familia(string nombre, string icono): Familia
53
+ Familia(int cod, string nombre): Familia
+ Familia(string nombre): Familia
+ getCodigo(): int
+ getDescripcion(): string
+ setDescripcion(string nombre): void
+ getImagen(): string
+ setImagen(string icono): void
+ getProductos(): List<Producto>
+ aadirProducto(Producto prod): void
+ eliminarProducto(Producto prod): void
+ eliminar(int codigo): void
+ numProductos(int codigo): int
+ getFamilia(int codigo): Familia
+ getFamilia(string nombre): Familia
+ estaFamilia(int codigo): Boolean
+ modificarFamilia(int codigo, string nombre, string icono): void
+ Equals(Familia f): Boolean
+ listFamilias(): List<Familia>
Producto
Producto
- codigo: int
- descripcion: string
- familia: Familia
- imagen: string
- precio: decimal
+ Producto(int cod, string nombre, string icono, Familia fam, decimal pvp):
Producto
+ Producto(string nombre, string icono, Familia fam, decimal pvp): Producto
+ Producto(int cod, string nombre, string icono, Familia fam): Producto
+ Producto(string nombre, string icono, Familia fam): Producto
+ Producto(int cod, string nombre, Familia fam, decimal pvp): Producto
+ Producto(string nombre, Familia fam, decimal pvp): Producto
+ Producto(int cod, string nombre, Familia fam): Producto
+ Producto(string nombre, Familia fam): Producto
+ getCodigo(): int
+ getDescripcion(): string
+ setDescripcion(string nombre): void
54
+ getPrecio(): decimal
+ setPrecio(decimal pvp): void
+ getImagen(): string
+ setImagen(string icono): void
+ getFamilia(): Familia
+ setFamilia(Familia fam): void
+ eliminar(int codigo): void
+ getProducto(string nombre): Producto
+ getProducto(int codigo): Producto
+ estaProducto(int codigo): Boolean
+ Equals(Producto p): Boolean
+ aadirProducto( Producto p): Boolean
+ modificarProducto(int cod, string nom, string icono, Familia fam, decimal pvp):
void
+ productos(): List<string>
+ listProductos(): List<Producto>
Camarero
Camarero
- codigo: string
- nombre: string
+ Camarero(int num): Camarero
+ getCodigo(): string
+ getNombre(): string
+ setNombre(string nombre): void
+ eliminar(string codigo): void
+ Equals(Camarero c): Boolean
+ numCamareros(): int
+ maxCamareros(): int
+ getCamarero(string cod): Camarero
+ aadirCamarero(Camarero c): void
+ guardarCamareros(List<string> lista): void
+ camareros(): List<string>
55
LineaVenta
Sus mtodos deben permitir crearla, eliminarla y obtener sus atributos, pero no
modificarlos.
LineaVenta
- codigo: int
- unidades: int
- articulo: Producto
- total: decimal
- venta: Venta
+ LineaVenta(int uni, Producto prod, Venta venta): LineaVenta
+ LineaVenta(int codigo, int uni, Producto prod, decimal tot, Venta venta):
LineaVenta
+ getCodigo(): int
+ getUnidades(): int
+ getArticulo(): Producto
+ getTotal(): decimal
+ getVenta(): Venta
+ eliminar(int codigo): void
+ Equals(LineaVenta lv): Boolean
+ getLineasVenta(int venta): List<LineaVenta>
Venta
La clase Venta representa cada una de las ventas realizadas por un camarero.
Sus mtodos deben permitir crear una venta, aadirle o eliminarle lneas de
venta, eliminarla entera, obtener sus atributos, aplazarla y recuperarla.
Venta
- codigo: int
- camarero: Camarero
- iva: decimal
- importe: decimal
- total: decimal
- fecha: DateTime
56
- detalle: List<LineaVenta>
+ estado: char
+ Venta(int cod, Camarero cam, decimal iva, decimal base, decimal tot,
DateTime fecha) : Venta
+ Venta(Camarero cam): Venta
+ getCodigo(): int
+ getCamarero(): Camarero
+ setCamarero( Camarero cam): void
+ getIva(): decimal
+ setIva(decimal iva): void
+ getImporte(): decimal
+ setImporte(decimal base): void
+ getTotal(): decimal
+ setTotal(decimal tot): void
+ getFecha(): DateTime
+ setFecha(DateTime fecha): void
+ getDetalle(): List<LineaVenta>
+ setDetalle(List<LineaVenta> lista): void
+ aadirLinea(LineaVenta lv): void
+ eliminarLinea(LineaVenta lv):void
+ anular(int codigo): void
+ aplazar(int codigo): void
+ recuperar(Camarero cam, int codigo): Venta
+ confirmar(int codigo): void
+ ventas(): List<Ventas>
+ getVenta(int codigo): Venta
Una vez diseadas las clases nos queda explicar la relacin existente entre ellas:
Una familia puede tener 0 o varios productos, pero un producto pertenece a una
sola familia.
Un producto puede pertenecer a 0 o varias lneas de venta, pero una lnea de
venta tiene un nico producto.
Una lnea de venta pertenece a una nica venta, pero una venta puede tener una o
varias lneas de venta.
La existencia de una lnea de venta no tiene sentido si no existe su venta.
Una venta tiene un nico camarero, pero un camarero puede tener 0 o varias
ventas.
Las relaciones entre las clases sustituyen algunos de los atributos, como se
puede observar en el siguiente diagrama.
57
Diagrama de clases
58
Adems de las clases anteriores, obtenidas del anlisis, tambin estn las
necesarias para la implementacin, que son: Informes, Ticket y Usuario, junto con sus
atributos y mtodos.
Cierre
Cierre
- cabecera: Boolean
- textoCab: string
- usuario: Boolean
- tipoFecha: string
+ Cierre(Boolean cab, string text, Boolean user, string tf): Cierre
+ getCabecera(): Boolean
+ setCabecera(Boolean cab): void
+ getTextoCab(): string
+ setTextoCab(string texto): void
+ getUsuario(): Boolean
+ setUsuario(Boolean user): void
+ getTipoFecha(): string
+ setTipoFecha(string tf): void
+ getCierre(): Cierre
+ guardarCierre(Cierre c): void
Informes
Informes
- cabecera: Boolean
- textoCab: string
+ Informes(int cab, string texto): Informes
+ getCabecera():Boolean
+ setCabecera(Boolean cab): void
+ getTextoCab(): string
+ setTextoCab(string tc): void
59
+ getInformes(): Informes
+ guardarInformes(Informes i): void
Usuario
Usuario
- tipo: string
- password: string
+ getPassword(): string
+ setPassword(string p): void
+ getmodificarContrasea(string us, string p): void
Ticket
Ticket
- cabecera: Boolean
- textoCab: string
- pie: Boolean
- textoPie: string
- camarero: Boolean
- datos: string
- tipoTotal: string
- iva: decimal
- impresora: string
+ getCabecera(): Boolean
+ setCabecera(Boolean c): void
+ getTextoCab(): string
+ setTextoCab(string texto): void
+ getPie(): Boolean
+ setPie(Boolean p): void
+ getTextoPie(): string
60
+ setTextoPie(string texto): void
+ getCamarero(): Boolean
+ setCamarero(Boolean c): void
+ getDatos(): string
+ setDatos(string d): void
+ getTipototal(): string
+ setTipoTotal(string tt): void
+ getIva():decimal
+ setIva(decimal iva): void
+ getTicket(): Ticket
+ guardarTicket(Ticket t): void
Estas nuevas clases no tienen interconexin entre ellas, ni con las anteriores.
61
En base al diagrama anterior se han identificado las tablas de la base de datos
que derivan de sus clases:
FAMILIA
En la tabla Familia se usa como clave principal codigo, ya que es nico para
cada familia.
PRODUCTO
En la tabla Producto se usa como clave principal codigo, que es nico para
cada producto. Y tenemos tambin una clave fornea codFam con el cdigo de la
familia a la que pertenece.
LINEAVENTA
VENTA
CAMARERO
codigo nombre
C.P.
62
Adems de las tablas derivadas de las clases tambin se debe de tener en
cuenta las derivadas del histrico:
HISTORICOVENTAS
HISTORICOLINEAVENTA
USUARIO
tipo Contrasea
C.P.
La tabla usuario tiene como clave principal tipo, ya que es nico para cada
fila.
TICKET
La tabla ticket no tiene una clave principal, ya que consta de una sola fila, por lo
que no necesita ser indexada.
CIERRE
La tabla cierre consta de una nica fila por lo que no necesita ser indexada, por
eso no tiene clave principal.
63
INFORMES
cabecera textCab
Al igual que las 2 tablas anteriores, la tabla informes no necesita ser indexada
porque solo contiene una sola fila, y por ello no tiene clave principal.
La base de datos no tiene atributos multivaluados, con lo cual est en 1FN, hay
una sola clave nica en cada tabla, ya est en 2FN, no hay dependencias transitivas
respecto a claves candidatas, pasando a 3FN y se han corregido todas sus anomalas
dejndola en FNB.
64
4. IMPLEMENTACIN
4.1 Tecnologas elegidas y herramientas utilizadas
Las tecnologas elegidas para el desarrollo del proyecto son:
65
Aplicacin de escritorio para la planificacin y creacin de diferentes
diagramas, utilizado para la creacin de diagramas de Gantt.
Microsoft Word 2007
Procesador de textos, utilizado para la creacin de la memoria.
MySQL Server 5.4
Para la creacin y gestin de la base de datos.
MySQL Connector Net 5.0.9 y Conector ODBC 5.1
Para conectar la aplicacin a la base de datos
MySQL Administrador 1.1
Para hacer backups (copias de seguridad) y volcados de la base de datos
durante las pruebas.
MySQL Query Browser
Para probar las consultas y controlar la introduccin de datos en la base de
datos.
PDFCreator
Software que se utiliza como una impresora virtual que simplemente utiliza
imprimir un documento para generar el pdf.
En nuestra aplicacin lo utilizamos como impresora, ya que es la forma ms
genrica de utilizar cualquier impresora.
En esta tarea se crean todas las tablas del sistema gestor de base de datos, para
la construccin de la misma se ha usado MySQL Server 5.4 y MySQL Query Browser.
66
MySQL.Data.dll: la conexin de C# con una base de datos MySQL no tiene
libreras desarrolladas por defecto para C#, por lo tanto, he optado por incluir
en las referencias del proyecto esta librera de funciones.
ItextShap.dll: despus de documentarse sobre la creacin de reportes y
distintos documentos en el lenguaje de programacin C#, se opt por la
inclusin de esta librera, debido a que es una adaptacin de iText para C# que
sirve para crear muchos tipos de documentos de texto, incluyendo el formato
pdf.
Ticket.dll: buscando documentacin se encontraron diferentes formas de hacer
un ticket, como usar la librera anterior, Crystal Report y programas de ese tipo
para hacer reportes, que son muy lentos, entonces surgi la idea de que se
tena que imprimir directamente en la impresora para hacerlo ms rpido y
buscando informacin sobre cmo hacerlo se encontr esta librera que se
ajusta a las necesidades del proyecto y acelera el proceso de impresin de
tickets.
67
`imagen` char(150) CHARACTER SET latin1 DEFAULT NULL,
`familia` int(5) DEFAULT NULL,
`precio` decimal(10,2) unsigned NOT NULL DEFAULT '0.00',
PRIMARY KEY (`codigo`),
KEY `fk_familia` (`familia`),
CONSTRAINT `producto_ibfk_1` FOREIGN KEY (`familia`) REFERENCES `familia` (`codigo`) ON
DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=latin1 COLLATE=latin1_spanish_ci;
Lo que se hace es crear una clave fornea a familia de forma que si se modifica
familia, la modificacin vaya en cascada, es decir, que se modifique tambin en
producto, pero si se borra, dejamos la clave fornea con valor null, deshaciendo la
asociacin de ese producto con la familia, para que pueda ser borrada, pero no borre
el producto.
Se ha optado por la 2 opcin debido a que con ella es ms fcil asegurarse que
la insercin de datos en la base de datos va a ser correcta siempre.
68
string insert = "insert into lineaventa (unidades, articulo,
total, venta) values (" + uni + ", " + p.Codigo + "," +
tot.ToString().Replace(',','.') + ", " + vent + ");";
MySqlDataAdapter adaptador = new MySqlDataAdapter(insert,
conexion);
adaptador.Fill(data);
actualizarVenta(tot,vent);
this.desconectar();
}
Pero en la creacin de ventas ese problema volvi, ya que la tabla ventas hace
referencia a la tabla camarero mediante una clave fornea, que al modificar o eliminar
un camarero se ve afectada. Se resolvi utilizando de nuevo la configuracin de
modificacin y borrado de claves forneas, pero esta vez dejando el valor null en
ambos casos.
El siguiente cdigo muestra una parte del script de la base de datos que incluye
la creacin de la tabla venta:
69
4.2.4 Problemas encontrados en la aplicacin de gestin
Cierre de caja terico o real.
Reporte de informes
El cierre de caja terico, es decir, recoge todas las ventas confirmadas durante
el da actual, guardado en el campo fecha.
El cierre de caja real, es decir, todas las ventas confirmadas desde el anterior
cierre de caja hasta el momento en que se hace el cierre.
Para ello se han creado 2 tablas para las venta (venta e historicoventas) y otras
2 para las lneas de venta (lineaventa e historicolineaventa), al cierre de caja todas las
ventas confirmadas guardadas en venta pasarn a historicoventas, dejando la tabla
venta lista para el nuevo cierre de caja, solo con las ventas aplazadas, lo que incluye
pasar todas las lneas de venta de esas ventas a historicolineaventa. Hay que tener
cuidado el orden en el que se realiza el paso de ventas y lneas de venta al histrico
para no perder la consistencia de la base de datos e incluso duplicar algunos datos
durante el proceso.
70
documento.Add(new Paragraph(inf.TextoCab));
}
// Fecha de la consulta
PdfPTable tabla = new PdfPTable(3);
tabla.DefaultCell.Border = 0;
tabla.DefaultCell.HorizontalAlignment = 2;
PdfPCell ce = new PdfPCell(new Phrase(""));
ce.Colspan = 3;
ce.Border = 0;
tabla.AddCell(ce);
tabla.AddCell(ce);
PdfPCell cell = new PdfPCell(new Phrase("Informe de Ventas"));
cell.Colspan = 3;
cell.HorizontalAlignment = 1; //0=Left, 1=Centre, 2=Right
cell.Border = 0;
tabla.AddCell(cell);
tabla.AddCell(ce);
cell.Phrase=new Phrase("Datos obtenidos entre el " +
tbDiaInicio.Text + "-" + tbMesInicial.Text + "-" + tbAoInicial.Text +
" y el " + tbDiaFinal.Text + "-" + tbMesFinal.Text + "-" +
tbAoFinal.Text);
tabla.AddCell(cell);
tabla.AddCell(ce);
tabla.AddCell(ce);
tabla.AddCell("Camarero");
tabla.AddCell("Ventas");
tabla.AddCell("Porcentaje");
//ventas totales
tabla.AddCell("Todos");
tabla.AddCell(tot.ToString("0.00") + " ");
tabla.AddCell("100,00 %");
//ventas por camarero
for (int n = 0; n < lbSeleccion.Items.Count; n++)
{
int j =
int.Parse(lbSeleccion.Items[n].ToString().Substring(1));
tabla.AddCell(j.ToString());
tabla.AddCell(totCam[j].ToString("0.00")+ " ");
tabla.AddCell(porcentaje[j].ToString("0.00") + " %");
}
documento.Add(tabla);
documento.Close();
//Abrir el informe de ventas
System.Diagnostics.Process.Start("informeVentas.pdf");....
71
4.2.4 Problemas encontrados en la pantalla de ventas
Tambin se han tenido que crear funciones especiales para la creacin de lneas
de venta con el producto varios, como muestra el siguiente fragmento de cdigo:
72
adaptador.Fill(data);
actualizarVenta(precio, vent);
this.desconectar();
}
Una peticin del cliente era poder aplazar las ventas sin confirmarlas, para
poder recuperarlas en otro momento y continuarlas.
El problema era que al cerrar la aplicacin o hacer el cierre de caja todo lo que
no estuviese almacenado en la base de datos se perda. Por eso se decidi aadir un
campo estado a la tabla venta que identificase el estado de la venta y pueda tomar
los valores ap si est aplazada, ac para la venta activa en ese momento y "null" para
las ventas confirmadas.
Al iniciar la pantalla de ventas los cdigos de todas las ventas aplazadas son
recogidos en una lista, a la que se van aadiendo los de las ventas que se vayan
aplazando, para mostrarlos junto con su total en una pequea ventana al pulsar el
botn recuperar.
73
public void imprimirTicket(Venta v)
{
List<LineaVenta> lisArt = getLineasVenta(v.Codigo);
ConfigTicket ct = getTicket();
Ticket ticket = new Ticket();
// Aade la cabecera si lo indica la configuracin
if (ct.Cabecera == true)
{
ticket.AddHeaderLine(ct.TextoCab);
}
// aade los datos de la empresa
ticket.AddHeaderLine(ct.Datos1);
ticket.AddHeaderLine(ct.Datos2);
ticket.AddHeaderLine(ct.Datos3);
ticket.AddHeaderLine(ct.Datos4);
ticket.AddHeaderLine(ct.Datos5);
ticket.AddHeaderLine(ct.Datos6);
// aade el camarero que le atiende si esta asi configurado
if (ct.Camarero == true)
{
if (v.Camarero.Nombre != "")
{
ticket.AddHeaderLine("Camarero: " + v.Camarero.Nombre);
}
else
{
ticket.AddHeaderLine("Camarero: " +
v.Camarero.Codigo.Substring(1));
}
}
// aade la fecha del ticket
ticket.AddHeaderLine(v.Fecha.ToString());
//lineas de venta
for (int i = 0; i < lisArt.Count; i++)
{
ticket.AddItem(lisArt[i].Unidades.ToString(),lisArt[i].Articulo.
Descripcion, lisArt[i].Total.ToString("0.00"));
}
// importe, iva y total
if (ct.TipoTotal == "bit")
{
ticket.AddTotal("IMPORTE", v.Importe.ToString("0.00"));
}
if (ct.TipoTotal == "bit" || ct.TipoTotal == "it")
{
ticket.AddTotal(ct.Iva.ToString() + "% IVA",
v.Iva.ToString("0.00"));
}
ticket.AddTotal("TOTAL", v.Total.ToString("0.00"));
// pie de ticket
if (ct.Pie == true)
{
ticket.AddFooterLine(ct.TextoPie);
ticket.AddFooterLine("");
}
ticket.PrintTicket(ct.Impresora);
El problema de la funcin era decirle la impresora, y se solucion aadiendo un
campo impresora a la tabla ticket de la base de datos, que se rellena desde la
74
pantalla de configuracin de la apariencia de tickets, como muestra la imagen
siguiente:
Con esto basta con poner en el cuadro de texto impresora el nombre con el que
la impresora se muestra en la carpeta impresoras del ordenador.
75
del D.O.P. el cual finalizaba en mayo del 2010.
5.1 PLANIFICACIN
5. GESTIN Y CONCLUSIONES
Al inicio del proyecto se realiz la planificacin recogida en el plan de trabajo
octubre 2010 noviembre 2010 diciembre 2010 enero 2011 febrero 2011 marzo 2011 abril 2011
18 21 24 27 30 03 06 09 12 15 18 21 24 27 30 02 05 08 11 14 17 20 23 26 29 02 05 08 11 14 17 20 23 26 29 01 04 07 10 13 16 19 22 25 28 31 03 06 09 12 15 18 21 24 27 02 05 08 11 14 17 20 23 26 29 01 04 07 10
23/09 Conocimientos
24/09 previos
13/10 Anlisis
15/10 de Requisitos iniciales
16/03 Pruebas
18/03
5.2 Aplazamientos
En este caso se ha sufrido un cambio extremo del horario de trabajo ya que
cuando se comenz el proyecto el proyectante trabajaba unas 4horas diarias de lunes
a viernes y un mnimo 10 horas al da los fines de semana, pudiendo dedicar al
proyecto 29 horas semanales, segn el siguiente cuadro de trabajo:
Por desgracia este cuadro de trabajo slo pudo ser seguido durante los 2
primeros meses de mitad de septiembre a mitad de noviembre del 2009, ya que
entonces se sufri un aumento en el horario de trabajo de 4 a 8 horas diarias,
reduciendo a 19 las horas de proyecto. En total se le dedicaron unas 232 horas de
trabajo al proyecto antes de modificar el horario.
77
Se mantuvo hasta finales de diciembre del 2010, sumando 32 horas ms al
proyecto, y despus el proyectante vuelve a tener una subida masiva de las horas de
trabajo debiendo casi aplazar el proyecto de nuevo, ya que apenas poda dedicarle 2
horas semanales hasta junio del 2011, 48 horas ms que hacen un total de 540 horas.
78
Frente a las 548 horas estimadas, las 1044 horas reales suponen un 190% del
tiempo estimado. El error de estimacin supone un aumento aproximado del 50% en
el total de las horas empleadas, adems de un aplazamiento de 2 aos en la fecha de
entrega.
D.O.P
P. Anlisis Diseo Memoria Implementacin Pruebas Instalacin Total
Tiempo
Estimado 34 38 85 70 240 10 30 507
(h)
Tiempo
105 68 180 150 450 50 30 1033
Real (h)
Variacin
67,62 44,12 52,78 53,33 46,67 80 0 50,92
(%)
En el siguiente grfico podemos observar de una forma ms clara como fue esta
variacin, aunque es un valor aproximado puesto que no se contabilizaron las horas de
forma exhaustiva, si que nos puede dar una idea del tiempo que se tuvo que dedicar a
cada apartado.
500
400
300
200
100
0
Tiempo Real(h)
Tiempo Estimado (h)
79
El grfico que
que se encuentra a continuacin muestra el tiempo real
dedicado a cada parte del proyecto con respecto al tiempo total.
Tiempo Real
Pruebas
5% Instalacin
3% D.O.P.
10%
Implementacin
44% Anlisis
7%
Diseo
17%
Memoria
14%
5.3 Conclusiones
En las especificaciones se peda una aplicacin genrica para el TPV de un pub,
cafetera o similar que mantenga separadas
separadas el punto de venta y la aplicacin de
gestin para lo que hemos creado 2 aplicaciones independientes: una pantalla de
ventas y una aplicacin de gestin, ambas conectadas a la misma base de datos.
La pantalla de ventas cumple con las exigencias del cliente de crear ventas,
modificarlas, anularlas, aplazarlas y recuperarlas, mostrar la lista de ventas aplazadas,
registrar el camarero
camarero que crear la venta y mostrar en todo momento el total y las
lneas de venta. Adems permite aadir a las ventas productos de venta directa, es
decir, productos registrados como varios de los cuales introducimos el importe
manualmente, y abrir el cajn monedero.
80
La aplicacin de gestin cumple con sus cometidos de controlar el acceso por
contrasea, pero adems diferencia entre 2 tipos de usuario, el administrador y el
encargado, y puede modificar las contraseas para ambos.
81
6. APENDICE 1: ACTAS DE REUNIONES
6.1 Actas de reuniones con los clientes
Primera reunin con el cliente
ACTA DE REUNIN
Asistentes:
Se acord crear una aplicacin de gestin para el TPV del pub de su propiedad.
Se recogieron los requisitos que deba cumplir la aplicacin.
82
Se acord mostrar el prototipo para dar aceptacin.
Se acord facilitar todos los datos necesarios por parte de los propietarios para la
creacin de la aplicacin.
Se acordaron plazos de entrega y previsin de posibles atrasos.
Se acord permitir probar la aplicacin en un TPV propiedad de los propietarios.
ACTA DE REUNIN
Asistentes:
83
Se acord una nueva cita en 15 das para la cual ya deberan estar elaborados los 3
primeros puntos del D.O.P.
ACTA DE REUNIN
Asistentes:
84
PROYECTO: Aplicacin de Gestin para el TPV de una Cafetera.
ACTA DE REUNIN
Asistentes:
Mostrar el prototipo.
ACTA DE REUNIN
85
QUINTA REUNIN CON EL CLIENTE: PRUEBAS DE LA APLICACION
Asistentes:
ACTA DE REUNIN
86
Fecha: Lunes 10 de Mayo del 2012.
Asistentes:
ACTA DE REUNIN
87
Lugar: Despacho Eloy Mata Sotes, Edificio Vives.
Asistentes:
ACTA DE REUNIN
88
Hora de inicio: 17:00
Asistentes:
ACTA DE REUNIN
89
Hora de inicio: 17:00
Asistentes:
ACTA DE REUNIN
90
Hora de inicio: 17:00
Asistentes:
Se deben reducir los casos de uso agrupndolos, y por ello modificar el diagrama de
casos de uso.
Se deben crear explicaciones y diagramas de actividad para los casos de uso.
Se debe cambiar el anlisis de la interfaz diferenciando entre los 2 mdulos o
aplicaciones del proyecto.
Se debe modificar el anlisis de pruebas.
Se debe continuar con el anlisis de las clases.
Se debe crear el prototipo de la aplicacin.
ACTA DE REUNIN
91
Fecha: Jueves 17 de Marzo del 2011
Asistentes:
Mostrar el prototipo
Decidir tecnologas a utilizar
Mostrar el diseo de la base de datos
ACTA DE REUNIN
92
Lugar: Despacho Eloy Mata Sotes, Edificio Vives.
Asistentes:
ACTA DE REUNIN
93
Lugar: Despacho Eloy Mata Sotes, Edificio Vives.
Asistentes:
94