u c -l m e s i
TRANSCRIPT
UNIVERSIDAD DE CASTILLA-LA MANCHAESCUELA SUPERIOR DE INFORMÁTICA
GRADO EN INGENIERÍA EN INFORMÁTICA
TECNOLOGÍA ESPECÍFICA DE
INGENIERÍA DEL SOFTWARE
TRABAJO FIN DE GRADO
SUEGRA: Sistema Único de Emparejamiento paraGarantizar la Reorganización de los Asistentes
Carlos del Olmo Lorenzo
Febrero, 2015
UNIVERSIDAD DE CASTILLA-LA MANCHAESCUELA SUPERIOR DE INFORMÁTICA
DPTO. DE TECNOLOGÍAS
Y SISTEMAS DE INFORMACIÓN
TECNOLOGÍA ESPECÍFICA DE
INGENIERÍA DEL SOFTWARE
TRABAJO FIN DE GRADO
SUEGRA: Sistema Único de Emparejamiento paraGarantizar la Reorganización de los Asistentes
Autor: Carlos del Olmo Lorenzo
Director: José Antonio Cruz Lemus
Febrero, 2015
TRIBUNAL:
Presidente:
Vocal :
Secretario:
FECHA DE DEFENSA:
CALIFICACIÓN:
PRESIDENTE VOCAL SECRETARIO
Fdo.: Fdo.: Fdo.:
Resumen
Aún en los tiempos de crisis que corren, las personas siguen tomando la decisión dedar un paso muy importante y contraer matrimonio para afianzar la relación con su pareja.Es por esto por lo que uno de los días más importante en la vida de una persona es el díade su boda. Los novios implicados quieren que todo salga perfecto y con esta herramientase facilita la gestión de algunas de esas tareas que los novios deben tratar para celebrar su boda.
En el actual Trabajo Fin de Grado se va a desarrollar una herramienta capaz de gestionartodos los aspectos relacionados con la celebración de una boda, la principal novedad queincluirá este trabajo, será la incorporación de una funcionalidad que permita a los novios dela boda la organización automática de los invitados según la afinidad que exista entre ellos.
Debido al tipo de trabajo se ha decidido desarrollar una aplicación web para gestionartodos estos aspectos. En cuanto al método de desarrollo he decidido utilizar Proceso Unifica-do Ágil (AUP), ya que se trata de una versión simplificada del Proceso Unificado Rational(RUP) para proyectos menos pesados. También se hablará de las tecnologías utilizadas, eneste caso se ha decidido utilizar como lenguaje de programación Ruby y el framework Rails,trabajando con el patrón Modelo-Vista-Controlador.
La aportación más importante de este TFG consiste en en la organización automática delos invitados según el nivel de afinidad existente entre ellos, es decir, la aplicación sentaráen una misma mesa a aquellos invitados que tengan un nivel de afinidad alto. Haciendo unapequeña búsqueda por Internet se ha llegado a la conclusión de que ningún portal web ofreceesta funcionalidad por lo que es interesante resolver este problema que tienen las personasque han decidido casarse.
La realización de este Trabajo Fin de Grado ha supuesto para mi la puesta en práctica delos conocimientos aprendidos a lo largo de la carrera, desde la captura de requisitos aplicandolas técnicas vistas en la carrera sobre cómo elicitar los requisitos, hasta el diseño y desarrollode una aplicación web, pasando por la realización del plan de proyecto y un estudio deviabilidad.
vii
Abstract
Despite of the crisis time, people are making the decision to take a step very importantin their lifes and get married to secure the relationship with their partner. Therefore one ofthe most important day in the life of a person is the day of their wedding. The groom wanteverything to be perfect, and this web tool help the groom to manage all of those tasks whichshould be proccessed to celebrate the wedding.
In the current final project I am going to develop a tool which is able to manage allaspects about a wedding celebration, the main newness, which this project include, will be afunctionallity which allows to the groom automatically guest organization according to theaffinity level between them.
Due to the type of project, I have decided develop a web application to manage all ofthese aspects. I have decided to use Agile Unified Process (AUP) as software developmentprocess, which is a simplified version of Rational Unified Process (RUP) for lighter projects.I will also discuss about the technologies wich are used, in this case I have decided to use asprogramming language Ruby with the framework Rails, this programming language workswith the pattern Model-View-Controller.
The main contribution of this TFG is the automatic organization of the guests in a weddingby the level of affinity between them, ie, the application sit at a table those guests who have ahigh level of affinity. I have done a little research on the Internet and I hve concluded that noweb provides this functionality so I consider this interesting to solve this problem which havethe people who have decide to marry.
The realization of this TFG has meant to me the knowdeledge learned during the de-gree,the requirements capture by applying the techniques learned in the degree about howto elicit requirements, the design and develop a web application and the realization a planproject and the feasibility study.
ix
A mis padres y a mi hermano.Por haber creído siempre en mí.
A todos mis amigos, tanto de Ciudad Real como de Torrijos.Por su apoyo y amistad.
A José Antonio.Por sus ánimos y su apoyo incondicional
a lo largo de estos años de carrera.
xi
Índice general
Índice de figuras xvi
Índice de tablas xx
1 Introducción 11.1 Introducción al tema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11.2 Estructura del documento . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2 Objetivos del TFG 52.1 Objetivo principal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.2 Objetivos parciales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.3 Medios utilizados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.3.1 Medios Hardware . . . . . . . . . . . . . . . . . . . . . . . . . . . 62.3.2 Medios Software . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
3 Estado del Arte 93.1 Evolución del desarrollo web . . . . . . . . . . . . . . . . . . . . . . . . . 9
3.1.1 PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113.1.2 ASP.NET . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123.1.3 Ruby on Rails . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
3.2 Modelo-Vista-Controlador . . . . . . . . . . . . . . . . . . . . . . . . . . 163.3 Portales web similares . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.3.1 iNovios.es . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 183.3.2 WedTool.com . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 193.3.3 bodas.net . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
4 Método de Trabajo 234.1 AUP. Proceso Unificado Ágil . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.1.1 Características de AUP . . . . . . . . . . . . . . . . . . . . . . . . 244.1.2 Disciplinas de trabajo de AUP . . . . . . . . . . . . . . . . . . . . 25
4.2 Evolución . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264.2.1 Fase I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264.2.2 Fase II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264.2.3 Fase III . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274.2.4 Fase IV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284.2.5 Fase V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284.2.6 Fase VI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
4.3 Marco Tecnológico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
xiii
xiv ÍNDICE GENERAL
4.3.1 Visual Paradigm for UML . . . . . . . . . . . . . . . . . . . . . . 304.3.2 LATEX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304.3.3 Ruby on Rails . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304.3.4 Microsoft Project . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
5 Resultados 335.1 Iteración I . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
5.1.1 Primeras entrevistas con el cliente . . . . . . . . . . . . . . . . . . 335.1.2 Estudio de viabilidad . . . . . . . . . . . . . . . . . . . . . . . . . 395.1.3 Plan de proyecto . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.2 Iteración II . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455.2.1 Crear Boda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455.2.2 Alta de Novios . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505.2.3 Administración de Salones . . . . . . . . . . . . . . . . . . . . . . 525.2.4 Administración de Mesas . . . . . . . . . . . . . . . . . . . . . . . 56
5.3 Iteración III . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 615.3.1 Elegir Mesas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 625.3.2 Alta de Invitados . . . . . . . . . . . . . . . . . . . . . . . . . . . 655.3.3 Definir Relaciones . . . . . . . . . . . . . . . . . . . . . . . . . . 685.3.4 Organizar Invitados . . . . . . . . . . . . . . . . . . . . . . . . . . 69
5.4 Iteración IV . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 865.4.1 Confirmar asistencia . . . . . . . . . . . . . . . . . . . . . . . . . . 875.4.2 Invitados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 895.4.3 Posición . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 90
5.5 Iteración V . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 925.5.1 Login . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 925.5.2 Perfil de usuario . . . . . . . . . . . . . . . . . . . . . . . . . . . 935.5.3 Generador de invitados . . . . . . . . . . . . . . . . . . . . . . . . 945.5.4 Nombres, apellidos y passwords aleatorias . . . . . . . . . . . . . 95
6 Conclusiones y Propuestas 976.1 Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 976.2 Propuestas futuras . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Bibliografía 100
A Acrónimos 105
B Manual de Usuario 107B.1 Gerente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
B.1.1 Crear Salón . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107B.1.2 Generar y eliminar Mesas . . . . . . . . . . . . . . . . . . . . . . 108B.1.3 Crear Boda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109B.1.4 Alta de Novios . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
B.2 Novio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110B.2.1 Alta de Invitados . . . . . . . . . . . . . . . . . . . . . . . . . . . 110B.2.2 Elegir Mesas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111B.2.3 Definir Relaciones . . . . . . . . . . . . . . . . . . . . . . . . . . 112B.2.4 Organizar Invitados . . . . . . . . . . . . . . . . . . . . . . . . . . 112
ÍNDICE GENERAL xv
C Codigo fuente 115C.1 Organización de invitados . . . . . . . . . . . . . . . . . . . . . . . . . . . 115C.2 Asignar salones libres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135C.3 Generador de invitados . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136C.4 Algoritmo para elegir mesas . . . . . . . . . . . . . . . . . . . . . . . . . 142C.5 Clase para iniciar sesión . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
Índice de figuras
3.1 Niveles en una aplicación web. . . . . . . . . . . . . . . . . . . . . . . . . 103.2 Lenguajes desarrollo web en 2006. [21] . . . . . . . . . . . . . . . . . . . 153.3 Lenguajes desarrollo web en 2010. [22] . . . . . . . . . . . . . . . . . . . 153.4 Lenguajes desarrollo web en 2013. [23] . . . . . . . . . . . . . . . . . . . 163.5 Diagrama de ejecución MVC . . . . . . . . . . . . . . . . . . . . . . . . . . 173.6 Captura de iNovios.es [28] . . . . . . . . . . . . . . . . . . . . . . . . . . 193.7 Captura de WedTool.com [29] . . . . . . . . . . . . . . . . . . . . . . . . 203.8 Captura de bodas.net [30] . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
4.1 Trazabilidad a partir de los Casos de Uso. . . . . . . . . . . . . . . . . . . 254.2 Herramientas utilizadas. . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
5.1 Casos de Uso para Gerente. . . . . . . . . . . . . . . . . . . . . . . . . . . 345.2 Casos de Uso para Novios. . . . . . . . . . . . . . . . . . . . . . . . . . . 355.3 Casos de Uso para Invitados. . . . . . . . . . . . . . . . . . . . . . . . . . 355.4 Diagrama ER de la apliación. . . . . . . . . . . . . . . . . . . . . . . . . . 365.5 Planificación inicial. Diagrama de Gantt. . . . . . . . . . . . . . . . . . . . 445.6 Acciones del gerente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455.7 Casos de Uso para Gerente. . . . . . . . . . . . . . . . . . . . . . . . . . . 465.8 Boda ejemplo1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465.9 Boda ejemplo2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 475.10 Error salones no disponibles. . . . . . . . . . . . . . . . . . . . . . . . . . . 475.11 Error numero invitados grande. . . . . . . . . . . . . . . . . . . . . . . . . . 475.12 Crear Boda. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485.13 Alta Novio. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485.14 Datos de enlace. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485.15 Enlace con Novios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495.16 Enlace sin Novios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495.17 Diagrama de secuencia Creación de boda. . . . . . . . . . . . . . . . . . . 495.18 Diagrama de clases Creación de boda. . . . . . . . . . . . . . . . . . . . . 505.19 Alta Novio 1. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515.20 Alta Novio 2. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515.21 Error 1 en Alta de novios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515.22 Error 2 en Alta de novios. . . . . . . . . . . . . . . . . . . . . . . . . . . . 525.23 Diagrama de secuencia Alta de novios. . . . . . . . . . . . . . . . . . . . . 525.24 Diagrama de clases Alta Novios. . . . . . . . . . . . . . . . . . . . . . . . 535.25 Lista de salones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535.26 Crear salón. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
xvii
xviii ÍNDICE DE FIGURAS
5.27 Consultar salón. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545.28 Editar salón. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 545.29 Eliminar salón. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555.30 Diagrama de secuencia Crear Salón. . . . . . . . . . . . . . . . . . . . . . 555.31 Diagrama clases Administración Salones. . . . . . . . . . . . . . . . . . . 565.32 Listado de mesas antiguo. . . . . . . . . . . . . . . . . . . . . . . . . . . . 565.33 Mostrar según el salón elegido. . . . . . . . . . . . . . . . . . . . . . . . . . 575.34 Listado de mesas agrupadas. . . . . . . . . . . . . . . . . . . . . . . . . . . 575.35 Generador de mesas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585.36 Eliminar mesas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585.37 Error mesas no encontradas. . . . . . . . . . . . . . . . . . . . . . . . . . 595.38 Diagrama de secuencia Generar Mesas. . . . . . . . . . . . . . . . . . . . 595.39 Diagrama clases Administración Mesas. . . . . . . . . . . . . . . . . . . . 605.40 Primera pantalla inicio Novios. . . . . . . . . . . . . . . . . . . . . . . . . . 615.41 Primera pantalla inicio Novios. . . . . . . . . . . . . . . . . . . . . . . . . . 615.42 Primera pantalla inicio Novios. . . . . . . . . . . . . . . . . . . . . . . . . 625.43 Casos de uso para el rol Novio. . . . . . . . . . . . . . . . . . . . . . . . . 625.44 Mesas disponibles en un salón. . . . . . . . . . . . . . . . . . . . . . . . . 635.45 Formulario elegir Mesas Novio. . . . . . . . . . . . . . . . . . . . . . . . 645.46 Diagrama de secuencia Elegir Mesas. . . . . . . . . . . . . . . . . . . . . 645.47 Diagrama clases Administración Salones. . . . . . . . . . . . . . . . . . . 655.48 Relaciones entre invitados. . . . . . . . . . . . . . . . . . . . . . . . . . . 665.49 Formulario Nuevo Invitado. . . . . . . . . . . . . . . . . . . . . . . . . . . 665.50 Diagrama de secuencia Alta de invitados. . . . . . . . . . . . . . . . . . . . 675.51 Diagrama clases Alta Invitados. . . . . . . . . . . . . . . . . . . . . . . . 685.52 Tipos de relaciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685.53 Afinidad Familiares del Novio con el resto. . . . . . . . . . . . . . . . . . 695.54 Diagrama de secuencia Definir Relaciones. . . . . . . . . . . . . . . . . . 705.55 Diagrama clases Definir Relaciones. . . . . . . . . . . . . . . . . . . . . . 705.56 Elegir grupo de invitados para empezar a organizar. . . . . . . . . . . . . . . 715.57 Elegir afinidad mínima entre invitados de una misma mesa. . . . . . . . . . . 715.58 Afinidad alta entre todos los invitados. . . . . . . . . . . . . . . . . . . . . 725.59 Datos de entrada, ejemplo 1. . . . . . . . . . . . . . . . . . . . . . . . . . 735.60 Resultado obtenido, ejemplo 1. . . . . . . . . . . . . . . . . . . . . . . . . 735.61 Resultado obtenido, ejemplo 1. . . . . . . . . . . . . . . . . . . . . . . . . 745.62 Datos de entrada, ejemplo 2. . . . . . . . . . . . . . . . . . . . . . . . . . 755.63 Datos de entrada, ejemplo 2. . . . . . . . . . . . . . . . . . . . . . . . . . 755.64 Resultado obtenido, ejemplo 2. . . . . . . . . . . . . . . . . . . . . . . . . 765.65 Datos de entrada, ejemplo 3. . . . . . . . . . . . . . . . . . . . . . . . . . . 775.66 Datos de entrada, ejemplo 3. . . . . . . . . . . . . . . . . . . . . . . . . . . 775.67 Resultado obtenido, ejemplo 3. . . . . . . . . . . . . . . . . . . . . . . . . 785.68 Resultado obtenido, ejemplo 3. . . . . . . . . . . . . . . . . . . . . . . . . 795.69 Datos de entrada, ejemplo 3. . . . . . . . . . . . . . . . . . . . . . . . . . 795.70 Resultado obtenido, ejemplo 3. . . . . . . . . . . . . . . . . . . . . . . . . 795.71 Resultado obtenido, ejemplo 3. . . . . . . . . . . . . . . . . . . . . . . . . 805.72 Datos de entrada, ejemplo 4. . . . . . . . . . . . . . . . . . . . . . . . . . . 815.73 Datos de entrada, ejemplo 4. . . . . . . . . . . . . . . . . . . . . . . . . . 825.74 Datos de entrada, ejemplo 4. . . . . . . . . . . . . . . . . . . . . . . . . . 82
ÍNDICE DE FIGURAS xix
5.75 Resultado obtenido, ejemplo 4. . . . . . . . . . . . . . . . . . . . . . . . . 825.76 Resultado obtenido, ejemplo 4. . . . . . . . . . . . . . . . . . . . . . . . . 835.77 Datos de entrada, ejemplo 4. . . . . . . . . . . . . . . . . . . . . . . . . . 835.78 Resultado obtenido, ejemplo 4. . . . . . . . . . . . . . . . . . . . . . . . . 835.79 Resultado obtenido, ejemplo 4. . . . . . . . . . . . . . . . . . . . . . . . . 845.80 Diagrama de secuencia Organizar Invitados. . . . . . . . . . . . . . . . . . 855.81 Diagrama clases Organizar Invitados. . . . . . . . . . . . . . . . . . . . . 855.82 Pantalla inicio rol Invitado. . . . . . . . . . . . . . . . . . . . . . . . . . . 865.83 Diagrama de Casos de Uso para el rol Invitado. . . . . . . . . . . . . . . . 865.84 Confirmar asistencia. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 875.85 Diagrama de secuencia Confirmar Asistencia. . . . . . . . . . . . . . . . . 885.86 Diagrama clases Confirmar Asitencia. . . . . . . . . . . . . . . . . . . . . 885.87 Lista completa de invitados. . . . . . . . . . . . . . . . . . . . . . . . . . 895.88 Diagrama de secuencia Lista Invitados. . . . . . . . . . . . . . . . . . . . 895.89 Diagrama clases Lista Invitados. . . . . . . . . . . . . . . . . . . . . . . . 905.90 Posición del invitado. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 915.91 Diagrama de secuencia Posición Invitado. . . . . . . . . . . . . . . . . . . . 915.92 Diagrama clases Posicion Invitados. . . . . . . . . . . . . . . . . . . . . . . 915.93 Acceso al sistema. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 925.94 Error al acceder al sistema. . . . . . . . . . . . . . . . . . . . . . . . . . . 935.95 Enlace al perfil. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 935.96 Enlace al perfil. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 935.97 Enlace al perfil. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 945.98 Vector de nombres y apellidos. . . . . . . . . . . . . . . . . . . . . . . . . 955.99 Función Random en Ruby. . . . . . . . . . . . . . . . . . . . . . . . . . . 955.100Función SecureRandom en Ruby. . . . . . . . . . . . . . . . . . . . . . . . 955.101Ejemplo de contraseñas generadas. . . . . . . . . . . . . . . . . . . . . . . 96
B.1 Login del Gerente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107B.2 Crear Salon. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107B.3 Crear Salon. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108B.4 Crear Salon. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108B.5 Generar Mesas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108B.6 Generar Mesas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109B.7 Generar Mesas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109B.8 Generar Mesas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 109B.9 Crear Boda. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110B.10 Crear Boda. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110B.11 Alta de Novios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110B.12 Alta de Novios. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111B.13 Alta de Invitados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111B.14 Alta de Invitados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112B.15 Elegir Mesas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 112B.16 Elegir Mesas. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113B.17 Definir Relaciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113B.18 Definir Relaciones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114B.19 Organizar Invitados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114B.20 Organizar Invitados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
xx ÍNDICE DE FIGURAS
B.21 Organizar Invitados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Índice de tablas
2.1 Tabla de objetivos parciales. . . . . . . . . . . . . . . . . . . . . . . . . . 6
4.1 Fase I. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264.2 Fase II. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274.3 Fase III. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274.4 Fase IV. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284.5 Fase VI. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
5.1 Costes directos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 405.2 Costes indirectos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
6.1 Tabla resumen de los objetivos. . . . . . . . . . . . . . . . . . . . . . . . . 98
xxi
Capítulo 1
Introducción
1.1 Introducción al tema
El día de la boda es uno de los días más importantes de la vida de muchas personas, ya que es
un día muy especial donde se jura amor eterno a la pareja. Aún en los tiempos de crisis que
corren, los enlaces matrimoniales son una de las pocas cosas que no han reducido su número
de celebraciones, es por ello que surge la necesidad de crear una aplicación que facilite el
trabajo a los novios reduciendo así notablemente el esfuerzo y dedicación que tienen que
hacer para la celebración de su boda y reduciendo su nivel estrés y nerviosismo antes de la
boda, debido a que esta aplicación evitará que la pareja tenga que dedicar tiempo a organi-
zar a los invitados, una de las tareas más laboriosas, ya que el sistema lo hará automáticamente.
Sin duda, lo más importante de esta aplicación será la organización automática de los
invitados, funcionalidad que ningún otro portal web gestiona y uno de los quebraderos de
cabeza más grandes para los novios. Esta funcionalidad sentará a los invitados de una misma
mesa en función del nivel de afinidad que tengan entre ellos. Como resultado el sistema dará
una lista provisional de invitados ordenados cada uno en su mesa, la cual podrán utilizar para
configurar la lista definitiva de invitados
En el presente documento se va a abordar la solución al Trabajo Fin de Grado, el cual
trata de dar solución a la gente que tiene problemas a la hora de organizar la celebración de su
enlace matrimonial. El sistema será capaz de gestionar algunos aspectos relacionados con la
celebración de una boda, ésos que tanto cuesta organizar y que siempre se dejan algunos sin
contratar.
2 1.1. INTRODUCCIÓN AL TEMA
Sise introduce en cualquier buscador de Internet gestión de bodas al instante nos aparecen
decenas de portales web, éste es un ejemplo [1], y aplicaciones de escritorio ofreciendo
tareas de gestión de bodas igual que ofrecerá este TFG, pero ninguno de estos portales y
aplicaciones ofrece la funcionalidad que incluirá este TFG para sentar a los invitados de
manera automática, una de las cosas que más quebraderos de cabeza lleva a los novios, ya
que siempre intentan hacerlo lo mejor posible, pero en rara ocasión aciertan y siempre queda
algún invitado descontento con la mesa en la que le sientan.
Con estas ideas claras y con intención de realizar un Trabajo Fin de Grado (TFG) que
permita al alumno ampliar los conocimientos y competencias adquiridas durante los años de
carrera, se toma la decisión de realizar este proyecto.
Una vez decidido el tema del proyecto se evalúan diferentes alternativas para su realiza-
ción. Puesto que se trata de un sistema web, se valoraron diferentes posibilidades a la hora
de elegir el lenguaje de programación, una de ellas fue PHP, sin duda uno de los lenguajes
más utilizados en el desarrollo web, pero finalmente se decidió desarrollarlo con Ruby on
Rails debido a la importancia que está tomando este lenguaje en los últimos años, aunque
el principal motivo fue la motivación personal de aprender un nuevo lenguaje y un nuevo
patrón de diseño. En cuanto a la metodología de desarrollo se sopesó la idea de realizarlo
bajo un modelo pesado, pero rápidamente se desestimó esta idea por la necesidad de ir modi-
ficando requisitos a lo largo del desarrollo del sistema. Por esta razón se decidió utilizar una
metodología ágil, en este caso fue Proceso Unificado Ágil (AUP), una versión simplificada de
Proceso Unificado Rational (RUP). Todos estos aspectos se abordarán con más detalles en los
capítulos 3 y 4.
Este trabajo forma parte del desarrollo del proyecto IMPACTUM: Aplicación del ISBV
en el estudio del impacto de UML en el desarrollo de software en un contexto DSDM-
LPS (Consejería de Educación, Ciencia y Cultura de la Junta de Comunidades de Castilla La
Mancha, y Fondo Europeo de Desarrollo Regional FEDER, PEII-2014-017-A).
CAPÍTULO 1. INTRODUCCIÓN 3
1.2 Estructura del documento
En este apartado se describe resumidamente la estructura de loa apartados de este TFG.
• Capítulo 1. Introducción: En este primer capítulo se realizar una breve introducción
al tema, se menciona el entorno y justificación de la importancia del trabajo abordado.
• Capítulo 2. Objetivos: En este apartado se detallan los objetivos que se pretenden
alcanzar en este Trabajo Fin de Grado.
• Capitulo 3. Estado del arte: En esta sección se detallan los resultados de la búsqueda
bibliográfica realizada para establecer el marco teórico sobre el cual desarrollar el
presente Trabajo Fin de Grado.
• Capítulo 4. Método de trabajo: En este capítulo se explica tanto la metodología de
desarrollo seleccionada (AUP), como las fases de trabajo realizadas para la consecución
de los objetivos del TFG.
• Capitulo 5. Resultados: En esta sección se muestran los resultados obtenidos después
de haber desarrollado la aplicación aplicando al metodología seleccionada.
• Capítulo 6. Conclusiones y propuestas: En este apartado se detallan las conclusiones
obtenidas revisando la consecución de objetivos y se presentan líneas de trabajo y
mejoras que quedan pendientes para el futuro.
• Capítulo 7. Bibliografía: Referencias bibliográfica consultadas.
• Anexos: Lista de Acrónimos utilizados, Manual de Usuario y Código fuente relevante.
Capítulo 2
Objetivos del TFG
En este capítulo se describe el objetivo principal de este Trabajo Fin de Grado, y los objetivos
parciales derivados del objetivo principal.
2.1 Objetivo principal
El objetivo principal de este Trabajo Fin de Grado es el desarrollo de una herramienta que
ayude a los novios a gestionar algunos aspectos de la celebración de su boda. Tanto el Ge-
rente de los salones como los Novios podrán apoyarse en esta aplicación para organizar la
celebración de un enlace.
De este objetivo se derivan otros objetivos parciales que se detallan a continuación.
2.2 Objetivos parciales
Para cumplir con el objetivo principal, es necesario haber satisfecho los siguientes objetivos
parciales.
• Op1. Realización de un plan de proyecto con el que se estimarán costes y tiempo de
realización.
• Op2. Elicitación de requisitos de la aplicación. Dará como resultado el documento
IEEE 830, este documento fue aprobado por el cliente y a partir de estos requisitos se
pudo empezar a realizar el análisis y el diseño de la aplicación.
• Op3. Realización de un diseño consistente de la aplicación como base para empezar a
desarrollar el sistema.
6 2.3. MEDIOS UTILIZADOS
• Op4. Diseño de la Base de Datos para almacenar todos los datos pertenecientes a la
aplicación.
• Op5. Aprendizaje del lenguaje de programación Ruby y el framework Rails, así como
HTML5 y CSS3.
• Op6. Desarrollo de la aplicación en diferentes iteraciones, utilizando las tecnologías
previamente comentadas.
Objetivo Descripción de objetivos
Op1 Plan de proyecto
Op2 Elicitación de requisitos
Op3 Diseño de la aplicación
Op4 Diseño de la Base de Datos
Op5 Aprendizaje de Ruby on Rails, HTML5 y CSS3
Op6 Desarrollo de la aplicación
Tabla 2.1: Tabla de objetivos parciales.
2.3 Medios utilizados
A continuación se detallarán todos los medios que se han tenido al alcance para poder realizar
este Trabajo Fin de Grado.
2.3.1 Medios Hardware
• Ordenador portátil Toshiba SATELLITE L850-138. 4 GB de memoria RAM, 620 GB
de Disco duro y procesador Intel Core i5.
• Monitor Samsung LS22B1150NS de 22 pulgadas para facilitar el trabajo.
2.3.2 Medios Software
• Visual Paradigm for UML 11.0 con licencia de la Escuela Superior de Informática de
Ciudad Real, como herramienta CASE para el diseño de la aplicación, tanto diseño
CAPÍTULO 2. OBJETIVOS DEL TFG 7
funcional como diseño de la Base de Datos.
• Ruby 1.9.3 como lenguaje de programación para la implementación de la aplicación.
• Rails 4.1 como framework de Ruby.
• Bootstrap 3.2, framwork para crear interfaces y diseños web responsive, es decir, que
se adaptan a diferentes tamaños de pantalla, basados en HTML5 y CSS3.
• Sublime Text 2 como editor de texto para desarrollar los diferentes archivos compilables.
• Microsoft Project 2013 para elaborar el plan de proyecto.
• LATEX como procesador de textos junto con el framwork Texmaker para la realización
de la documentación del TFG.
• Dropbox como medio de almacenamiento en la nube y para realizar backups a diario.
Capítulo 3
Estado del Arte
En este apartado se detalla el estado actual de las tecnologías que han servido como base
teórica para la realización de este TFG. Primero se abordará la evolución en el desarrollo web
y las distintas posibilidades para la realización de este proyecto. A continuación se va ver
el patrón Modelo-Vista-Controlador utilizado para el desarrollo del sistema. Por último se
comparan diferentes portales web existentes para gestionar celebraciones de boda.
3.1 Evolución del desarrollo web
El desarrollo web en la última década ha experimentado un gran desarrollo [2]. En la década
de los noventa la web era una sencilla colección de páginas estáticas, documentos et... donde
los usuarios únicamente podían consultarlas. Sin embargo esta evolución ha dado lugar a
páginas complejas con contenidos dinámicos que provienen de bases de datos, lo que permite
la creación de aplicaciones web. Estos sistemas web permiten realizar acciones sencillas
como redactar un email, publicar un catálogo de productos, manejar inventarios, publicar
información restringiendo el acceso a ciertos usuarios, etc.
Una aplicación web típica está organizada en tres capas o niveles (lo cual se adapta
perfectamente al patrón de diseño Modelo-Vista-Controlador), donde el sistema recogerá
datos del usuario, primer nivel (Vista), los enviará al servidor, que ejecutará la lógica del
programa donde se cargarán los datos de la base de datos, segundo y tercer nivel (Controlador
y Modelo respectivamente). El resultado será mostrado al usuario en el navegador de nuevo,
primer nivel.
Desarrollar aplicaciones web tiene grandes ventajas frente a desarrollar aplicaciones de
escritorio. A continuación se enumeran algunas de las más importantes [4]
10 3.1. EVOLUCIÓN DEL DESARROLLO WEB
Figura 3.1: Niveles en una aplicación web.
• Compatibilidad multiplataforma. Una misma versión de la aplicación puede correr sin
problemas en múltiples plataformas como Windows, Linux, Mac, Android etc.
• Actualización. Las aplicaciones web siempre se mantienen actualizadas y no requieren
que el usuario deba descargar actualizaciones y realizar tareas de instalación.
• Inmediatez de acceso. Las aplicaciones web no necesitan ser descargadas, instaladas y
configuradas. Además se puede acceder a estas aplicaciones desde cualquier ordenador
que esté conectado a la red.
• Menos Bugs. Con este tipo de aplicaciones todos los usuarios utilizan la misma versión,
por lo que todos los errores pueden ser corregidos tan pronto como son descubier-
tos. También serán menos propensas a errores ya que no se producen conflictos con
aplicaciones internas del ordenador o con software personal instalado por el usuario.
• Múltiples usuarios concurrentes. Las aplicaciones web pueden realmente ser utilizada
por múltiples usuarios al mismo tiempo.
• Seguridad de los datos. Los datos se alojan en servidores que aseguran la protección de
datos y el funcionamiento constante de las aplicaciones.
Una vez que se ha visto la evolución del desarrollo web y las principales ventajas que
tiene frente a las aplicaciones de escritorio, a continuación se va a presentar los principales
frameworks para desarrollar aplicaciones web, en los que destacan PHP, ASP.Net y Ruby on
Rails.
CAPÍTULO 3. ESTADO DEL ARTE 11
3.1.1 PHP
PHP [7] es un lenguaje de script interpretado en el lado del servidor utilizado para la genera-
ción de páginas Web dinámicas. Fue uno de los primeros lenguajes del lado del servidor que
se podían incorporar directamente en el documento HTML en lugar de llamar a un archivo
externos que procese los datos. Es considerado como uno de los lenguajes más flexibles,
potentes y de alto rendimiento, por lo que gran número de páginas y portales web están
creadas con PHP, uno de los más importantes y conocidos es Facebook.
Como ya se ha dicho PHP es un lenguaje flexible permitiendo la conexión a diferentes
tipos de servidores de bases de datos tanto SQL como NoSQL. MySQL constituye el mejor
sistema para la administración de bases de datos relacionales de modo rápido y sólido, pero
también puede conectarse con PostgreSQL, Oracle, ODBC, DB2, Microsoft SQL Server,
Firebird, SQLite, MongoDB.9, etc.
A continuación se detallan algunas características importantes de PHP, lo que le hacen
que sea tan popular:
• Es un lenguaje multiplataforma.
• Es el servidor el encargado de ejecutar el código y enviar el resultado HTML al
navegador.
• Sintaxis similar a C, fácil de entender y rápido de aprender.
• Rápido. PHP es utilizado como modulo de Apache lo que lo hace extremadamente
veloz.
• Open Source, es decir, código abierto, software distribuido y desarrollado libremente.
• Posee una amplia documentación en su página oficial, entre la cual se destaca que todas
las funciones del sistema están explicadas.
• Permite aplicar técnicas de programación orientada a objetos. Además desde la versión
5 de PHP (PHP5) se permite el manejo de excepciones.
12 3.1. EVOLUCIÓN DEL DESARROLLO WEB
3.1.2 ASP.NET
ASP.NET [9] es un framework creado por Microsoft para desarrollar páginas web dinámicas,
aplicaciones web y sitios web XML. Forma parte del framework .NET por lo que tiene acceso
a las clases del entorno de trabajo .NET. Por ello es compatible con múltiples lenguajes como
Visual Basic, JScript.NET o C#.
En la actualidad ASP.NET soporta tres modelos de programación [13] que son: ASP.NET
Web Pages, ASP.NET Web Forms y ASP.NET MVC. Cada uno de ellos promueve diferentes
metodologías de desarrollo, se adaptan a perfiles de desarrolladores distintos y organizan la
aplicación de forma totalmente diferente. Aunque existan estos tres modelos, no necesaria-
mente son excluyentes entre ellos, sino que se podrá desarrollar aplicaciones combinando
estos modelos, unas partes de la aplicación se desarrollarán con un modelo porque se adapte
mejor a sus características, y otra parte de la aplicación podrá ser desarrollada con otro modelo
de programación.
ASP.NET ofrece varias ventajas [12] importantes referentes a los modelos de programa-
ción web:
• Gran rendimiento gracias a su compilación just-in-time, es una técnica para mejorar
el rendimiento de la compilación de código binario de los sistemas de programación
por medio de la traducción del código binario en código máquina nativo en tiempo de
ejecución.
• Ofrece flexibilidad, es independiente del lenguaje, se puede elegir el lenguaje que mejor
se adapte a la aplicación o implementar varios lenguajes.
• Simplicidad para el programador, permite generar interfaces de usuario, que separan la
lógica de la aplicación del código de presentación.
• Otra característica importante es su escalabilidad. Diseñado para tener en cuenta ca-
racterísticas a medida con el fin de mejorar el rendimiento de entornos agrupados y de
múltiples procesadores.
• Controla y administra los procesos de tal manera que si uno falla, se puede crear uno
nuevo para ayudar a mantener la aplicación disponible.
CAPÍTULO 3. ESTADO DEL ARTE 13
• Es posible obtener una seguridad completa de las aplicaciones gracias a la autentifica-
ción de Windows.
• Encargado de detectar el tipo de navegador que utiliza el cliente a la hora de realizar
una petición, lo que determina que versión HTML soporta.
Gracias a estas ventajas tuvo una gran aceptación entre los programadores. Sin embargo a
continuación se verán algunas de sus desventajas:
• Se requiere el envío de la página web al completo siempre que se produzca comunica-
ción de un evento con el servidor.
• Siempre que el usuario haga un envío de datos al servidor, debe esperar a que le proceso
se haya completado y el servidor devuelva la respuesta, por lo que se realiza un envío
de información síncrona.
• Transferencia de datos en la red relativamente grande debido a la existencia de un
elemento en los formularios llamado VIEWSTATE.
3.1.3 Ruby on Rails
Ruby on Rails [14] fue creado en 2003 por David Heinemeier Hansson, pese a su juventud se
ha convertido en uno de los framworks más potentes en la actualidad dentro del desarrollo de
aplicaciones web. Esto se refleja en la cantidad de grandes compañías que lo utiliza, las más
importantes: GitHub o Twitter.
Este framework hace uso de Ruby, un lenguaje de programación interpretado y orientado
a objetos. Fue creado en 1993 por Yukihiro Matsumoto y presentado públicamente en 1995.
Tiene características de lenguajes como Perl, Smalltalk, Eiffiel, Ada y Lisp. Su sintaxis está
inspirada en Python y Perl.
Una de las características más importantes de Ruby on Rails es la utilización del patrón
Modelo-Vista-Controlador [15], este patrón de diseño permite separar el código en tres partes:
• Modelo. Son las clases que representan las tablas de la base de datos.
• Vista. Es la lógica de la visualización, o cómo se muestran los datos de las clases del
Controlador
14 3.1. EVOLUCIÓN DEL DESARROLLO WEB
• Controlador. Las clases responden a la interacción del usuario e invocan a la lógica de
la aplicación.
A continuación se muestran características [16] que hacen que Ruby on Rails haya crecido
tanto en tan poco tiempo.
• Don´t repeat yourself filosofía DRY, es un principio de desarrollo software. Su objetivo
es la reducción de fragmentos de código duplicados.
• Siguiendo las convenciones de Rails sobre la configuración se puede escribir una
aplicación con menos código que el necesario para la misma aplicación desarrollada
con cualquier otro lenguaje.
• Clase Active Record para la administración y funcionamiento de los modelos proporcio-
nando una capa objeto-relacional que sigue el estándar ORM. Permite guardar objetos
en la base de datos, además facilita el entendimiento del código asociado a base de
datos.
• Añade la característica Scaffolding, que permite generar la estructura básica necesaria de
manera automática, apoyándose en los componentes del modelo MVC para desarrollar
la aplicación.
• Utilización de Gemas, son plugins y/o código añadido a nuestro proyecto de Ruby on
Rails, que permiten nuevas funcionalidades, nuevas funciones predefinidas o nuevas
herramientas para el desarrollo.
• Permite la integración con otros servicios web como el envío y recepción de emails.
También tiene la posibilidad de incorporar AJAX on Rails.
3.1.3.1 Evolución a lo largo de los años
A continuación se verá la evolución que ha tenido Ruby on Rails frente a los demás lenguajes
presentados.
En esta figura se ve que cuando fue creado en 2003 aún no tiene gran repercusión en el mundo
del desarrollo web, pero a medida que se va avanzando en el tiempo, finales de 2005, el
framework va cogiendo importancia en la comunidad de desarrolladores web.
CAPÍTULO 3. ESTADO DEL ARTE 15
Figura 3.2: Lenguajes desarrollo web en 2006. [21]
Figura 3.3: Lenguajes desarrollo web en 2010. [22]
En 2010 ya es un lenguaje consolidado y se ve como sus números se van acercando a los
de PHP en muy poco tiempo.
En el año 2013, Ruby on Rails ya es más popular que PHP, lo que supone un gran avance
para este framework en tan solo diez años. Por su sencillez y rápido aprendizaje parece que
cada vez más programadores web confían en este framework dejando atrás PHP que ha
sufrido una bajada grandísima en sus números en los últimos años.
16 3.2. MODELO-VISTA-CONTROLADOR
Figura 3.4: Lenguajes desarrollo web en 2013. [23]
3.2 Modelo-Vista-Controlador
El patrón Modelo-Vista-Controlador [24] fue de los primeros en separar funciones a la hora
de desarrollar software, fue descrito para el lenguaje Smalltalk por primera vez en 1979. En
la actualidad es utilizado por multitud de frameworks como ASP.NET, Apache Struts, o Ruby
on Rails entre otros. Gracias a estos numerosos frameworks de desarrollo web que utilizan
este patrón, ha ganado muchos seguidores en los últimos años. Surge de la necesidad de crear
software más robusto y con un ciclo de vida más adecuado. Gracias a este patrón se facilitan
las tareas de mantenimiento y reutilización de código.
El patrón Modelo-Vista-COntrolador trata de separar los datos y la lógica de negocio de
una aplicación de la interfaz de usuario, con esto se consigue crear aplicaciones con bajo
acoplamiento y alta cohesión. A continuación se explica lo que hace cada una de las partes
del patrón:
• Modelo: Es la capa que trabaja con el acceso a la base de datos. Aquí se mantendrá
encapsulada la complejidad de la base de datos, por lo que se tendrá sólo las funciones
que accederán a las tablas y harán los correspondientes select, insert, update, etc.
Gracias a esto se podrán invocar a estas funciones desde otras partes del programa y el
modelo sólo se encargará de procesarlas.
CAPÍTULO 3. ESTADO DEL ARTE 17
• Vista: Es la capa que contiene el código que va a codificar la visualización de las
interfaces de usuario. Esta capa contendrá todo el código HTML, CSS etc. que nos
permite mostrar la salida. En la vista se trabaja con los datos pero no se acceden a ellos,
si no que los requerirán a los modelos para generar la salida requerida.
• Controlador: Es la capa que contiene el código para responder a las acciones que se
solicitan en la aplicación. Hace de enlace entre el modelo y la vista. Es aquí donde se
codifica toda la lógica de nuestra aplicación.
Flujo de ejecución en MVC
A continuación se procede a explicar el orden de ejecución [27] que tendría una petición con
el patrón Modelo-Vista-Controlador.
Figura 3.5: Diagrama de ejecución MVC
Según se puede ver en el diagrama, éste sería el resultado de la ejecución del patrón MVC:
• El usuario realiza alguna acción en la aplicación que provoca que se envíe una petición.
• El controlador recibe el aviso de la acción solicitada por el usuario. El controlador es
el encargado de gestionar el evento que llega. El controlador accede al modelo para
realizar la acción solicitada por el usuario (por ejemplo, el usuario quiere dar de alta un
nuevo producto en una tienda online, esto provoca que se produzca un insert dentro de
la base de datos).
• Gracias a los datos que devuelve el modelo, es el controlador el encargado de elegir
que vista mostrar al usuario.
18 3.3. PORTALES WEB SIMILARES
• El controlador deja a a los objetos de la vista la tarea de desplegar la interfaz de usuario,
es decir, es la vista quien obtiene los datos del modelo para generar la interfaz donde se
reflejan los cambios en el modelo para resolver la petición del usuario.
• Se actualiza la interfaz de usuario esperando nuevas interacciones con el usuario, dando
lugar a un nuevo ciclo.
3.3 Portales web similares
A continuación se realiza una comparación con varios portales de Internet, todos ellos realizan
funciones para gestionar y planificar los preparativos de una boda. Como en este TFG se
puesto especial hincapié en la organización de los invitados, a continuación se hará una crítica
de estos portales web y en especial de la parte de organización de invitados.
3.3.1 iNovios.es
iNovios [28] es una página web para resolver los problemas que surgen con los preparativos
de una boda. En el inicio de la página esta es la descripción que dan sobre ellos mismos:
contratación del salón de bodas, adornos y decoración floral, fotografía de boda, elección
de las tarjetas de invitación, envío de las tarjetas a los invitados, llamadas de teléfono para
las confirmaciones de asistencia, regalos o listas de bodas, etc. Con iNovios podéis ahorraros
algunas de esas tareas.
Al entrar en la web a modo Demo se puede ver como esta web deja añadir invitados, o
como dejaría elegir invitaciones de boda para posteriormente enviarlas a los invitados, además
de otras funcionalidades. Pero la parte que interesa es la sección de Mesas de invitados. En
esta sección, esta aplicación deja añadir mesas, y en cada mesa que se añade, se pueden sentar
a los invitados que aún no están sentados. El problema está en que los novios deben saber
dónde quieren sentar a cada invitado, en ningún caso se hará de forma automática como lo
hace la aplicación desarrollada en este Trabajo Fin de Grado, por lo que los novios seguirán
teniendo los mismos problemas a la hora de sentar a los invitados.
CAPÍTULO 3. ESTADO DEL ARTE 19
Figura 3.6: Captura de iNovios.es [28]
3.3.2 WedTool.com
WedTool [29] es otra aplicación online que ofrece una guía completa para organizar una boda.
Destaca por su organizador de mesas, su función para elaborar el presupuesto o por gestionar
la lista de invitados desde la aplicación, además de otras funciones típicas de este tipo de
aplicaciones web. A continuación se verá la captura del organizador de mesas.
Como se puede apreciar en la imagen, se trata de crear una salón añadiendo las mesas que
se quiera, a diferencia de iNovios, éste portal lo hace de forma gráfica. Aquí también se tienen
que organizar a los invitados de forma manual, por lo que no disminuyen los problemas. Este
portal da la opción de mover las mesas a nuestro gusto y añadir y quitar tanto invitados como
mesas tosas las veces que se quiera.
3.3.3 bodas.net
bodas.net [30] es otro ejemplo de aplicaciones web para gestionar web. Muy parecida a
las anteriores, con las mismas funcionalidades, como buscar proveedores para el catering,
20 3.3. PORTALES WEB SIMILARES
Figura 3.7: Captura de WedTool.com [29]
buscar fotógrafos para la realización del vídeo y de las fotografías de la bodas, a parte de las
mencionadas en las anteriores webs como la gestión de invitados, el organizador de mesas, o
la sección para elaborar el presupuesto entre otras. Como se ha hecho en las anteriores se va a
presentar el organizador de mesas.
Figura 3.8: Captura de bodas.net [30]
Este organizador de bodas es muy parecido al organizador de WedTool, como se puede
observar también es gráfico, y la única forma de sentar a los invitados es de forma manual, es
CAPÍTULO 3. ESTADO DEL ARTE 21
decir, hay que tener antes claro donde se quiere sentar a cada invitado, ésto lleva al mismo
problema que si no se tuviera esta página web, los novios van a seguir sin saber donde colocar
a los invitados.
Capítulo 4
Método de Trabajo
A lo largo de este capítulo se va a detallar el método de trabajo que se ha aplicado para llevar
a cabo el desarrollo de este Trabajo Fin de Grado.
4.1 AUP. Proceso Unificado Ágil
Como metodología de desarrollo se utiliza Proceso Unificado Ágil (AUP). Esta metodología
se trata de una versión simplificada del Proceso Unificado Rational (RUP). AUP Describe de
una manera simple y fácil de entender la forma de desarrollar aplicaciones de software de
negocio usando técnicas ágiles y conceptos que aún se mantienen válidos en RUP.
Se propone esta metodología debido al carácter de este Trabajo Fin de Grado, ya que
es necesario poder modificar los requisitos según se va evaluando y probando las distintas
posibilidades con las que se cuenta para desarrollarlo. Debido a esto, un modelo pesado no se
ajustaría como solución a la metodología de desarrollo.
Sin embargo, si se habla de un modelo ágil se necesitará un equipo de desarrollo con
experiencia para ser llevado a cabo de manera satisfactoria, por lo que una metodología ágil
completa tampoco sirve como solución. Debido a esto, es por lo que se decide elegir una
simplificación de una metodología ágil que se adapte al desarrollo de este TFG.
24 4.1. AUP. PROCESO UNIFICADO ÁGIL
4.1.1 Características de AUP
Iterativo e Incremental
AUP [31] trata de descomponer un proyecto grande en mini-proyectos, cada uno de estos
mini-proyectos es una iteración que ofrece un incremento en el desarrollo del producto inclu-
yendo mejoras o nuevas funcionalidades. AUP se divide en cuatro fases:
• Inicio: Se define el alcance del proyecto, se desarrolla una descripción del producto y
las principales funciones del sistema. Además se estiman costes y plazos y se determina
la factibilidad del proyecto.
• Elaboración: Se identifica y se tratan los riesgos del sistema. También se define y valida
la arquitectura del sistema en profundidad.
• Construcción: Construcción del software de forma incremental. Se implementa el
sistema tomando como base la arquitectura obtenida en la fase de Elaboración. Se
incluirán las distintas funcionalidades del producto en diferentes iteraciones, al final de
cada iteración se obtiene una nueva versión ejecutable del TFG.
• Transición: Implantación del producto en el entorno de los usuarios. En esta fase se
producen las pruebas con el usuario para comprobar que todo está implementado como
lo descrito en la fase de Inicio.
Cada una de estas fases son divididas en iteraciones, las cuales son las que producen los
incrementos en el desarrollo del sistema.
Dirigido por Casos de Uso.
Se centra en las funcionalidades que debe tener el sistema para satisfacer las necesidades del
usuario que interactúa con él. Estas funcionalidades son conocidas como requisitos funciona-
les y gracias a estos requisitos se pueden extraer los casos de uso.
El modelo de casos de uso se utilizan para capturar los requisitos funcionales y para definir
los contenidos de las iteraciones. Cada iteración tomará un conjunto de casos de uso y guiará
CAPÍTULO 4. MÉTODO DE TRABAJO 25
el proceso de desarrollo desde etapas tempranas como el análisis de requisitos hasta las etapas
finales de prueba.
Figura 4.1: Trazabilidad a partir de los Casos de Uso.
Como se ve en la anterior imagen, para llevar a cabo los modelos de análisis y diseño se
puede basar en los casos de uso, para posteriormente realizar la implementación, verificando
que el producto implemente adecuadamente cada Caso de Uso.
4.1.2 Disciplinas de trabajo de AUP
Las disciplinas de trabajo en AUP son ejecutadas en una forma iterativa, definiendo las
actividades que el equipo de desarrollo ejecuta para que el sistema cumpla con las necesidades
del usuario. A continuación se introducen estas siete disciplinas:
• Modelado: Tiene como objetivo entender el negocio, entender cuál es el problema que
se va a abordar e identificar las posibles soluciones viables para dicho problema.
• Implementación: El objetivo es transformar los modelos en código ejecutable y realizar
pruebas básicas (unitarias).
• Pruebas: Su objetivo es realizar una evaluación de los objetivos para asegurar la calidad.
Esto incluye encontrar defectos, validar que el sistema funciona como fue diseñado y
verificar que los requisitos se cumplen.
• Despliegue: La meta de esta disciplina es ejecutar un plan para que el sistema esté a
disposición de los usuarios.
• Gestión de la configuración: Administra el acceso a los artefactos del proyecto. Lleva
un control de versiones y un control de cambios y la gestión de ambos.
26 4.2. EVOLUCIÓN
• Gestión del proyecto: Dirige las actividades que tienen lugar dentro del proyecto. Éstas
incluyen gestión de riesgos, dirección del personal y coordinación.
• Entorno: Apoya los esfuerzos para garantizar la disponibilidad de los procesos, normas
y herramientas cuando sea necesario.
4.2 Evolución
En esta sección se va a tratar de detallar las fases que se ha seguido para la realización de
este Trabajo Fin de Grado. Se va a tratar de explicar las distintas fases que se ha seguido para
llevar a cabo el desarrollo de la aplicación propuesta, se tratará de detallar la finalidad de cada
fase y el resultado obtenido al final de la misma.
4.2.1 Fase I
En esta primera fase se tienen las primeras entrevistas con el cliente con el fin de obtener una
primera lista de requisitos funcionales para empezar a tener conocimiento acerca del dominio
del problema. De estas primeras entrevistas se podrán extraer una lista lo suficientemente
grande como para poder realizar un documento donde establecer estos requisitos y obtener la
aprobación del cliente.
Finalidad Resultado
Primeras entrevistas con el clienteLista previa de requisitos funciona-
les
Realización de documento de requi-
sitos
Realización y aprobación del docu-
mento IEEE 830-1998 para la reco-
pilación de requisitos
Tabla 4.1: Fase I.
4.2.2 Fase II
En esta fase se ha tratado la elaboración de los distintos diagramas UML para modelar el
sistema y así poder ver y explicar los procesos que contendrá la aplicación al cliente y, que
éste de su aprobación. También se realiza el diagrama E/R para modelar la base de datos
CAPÍTULO 4. MÉTODO DE TRABAJO 27
viendo así fácilmente las tablas y sus campos además de la relación que existente entre estas
tablas dentro de la base de datos.
Finalidad Resultado
Elaboración del diagrama de Casos
de Uso
Diagramas de Casos de Uso que des-
criben las relaciones y las dependen-
cias entre un grupo de casos de uso
y los actores participantes en el pro-
ceso
Realización del diagrama de ClasesDiagrama de Clases para describir
la estructura de nuestra aplicación
Realización del diagrama de Secuen-
cia
Diagramas de Secuencia que descri-
ben la interacción entre los objetos
de nuestro sistema
Elaboración del diagrama E/RDiagrama E/R para definir las enti-
dades del sistema y sus relaciones
Tabla 4.2: Fase II.
4.2.3 Fase III
Una vez modelado el sistema es hora de empezar a desarrollarlo. Como Ruby on Rails es un
lenguaje nuevo para el alumno, se decido hacer algunos cursillos por Internet que no llevarán
más de dos semanas realizarlos y que suponen un gran beneficio en cuanto ahorro de tiempo
a la hora de desarrollar el sistema. El haber cursado la asignatura de desarrollo web por parte
del alumno, ha resultado más sencillo es aprendizaje de este lenguaje por la similitud con
otros lenguajes y por no partir de cero en cuanto al aprendizaje del desarrollo web.
Finalidad Resultado
Aprendizaje y primeros pasos con
Ruby on Rails
Realización de primeras aplicacio-
nes web que me permiten adqui-
rir conocimientos necesarios para la
realización de este Trabajo Fin de
Grado
Tabla 4.3: Fase III.
28 4.2. EVOLUCIÓN
4.2.4 Fase IV
Una vez realizado el análisis y diseño de la aplicación, se decide dividir todo el trabajo en
varias iteraciones. A continuación se enumeran las distintas iteraciones que se han planificado
para el desarrollo y realización de este Trabajo Fin de Grado. Estas iteraciones se explicarán
con más detalles en el siguiente capítulo.
Finalidad Resultado
Iteración 0Realización del anteproyecto y el
plan de proyecto
Iteración 1 Desarrollo del módulo del Gerente
Iteración 2 Desarrollo del módulo de los Novios
Iteración 3Desarrollo del módulo de los invita-
dos
Iteración 4Mejora de la interfaz de la aplica-
ción e inclusión de otros requisitos
Tabla 4.4: Fase IV.
4.2.5 Fase V
En esta fase del trabajo se realiza el desarrollo de cada iteración donde se llevan a cabo una
serie de actividades para cumplir los objetivos de cada iteración:
• Modelado: El objetivo es entender el problema de dominio que se aborda en el proyecto
e identificar las soluciones para la satisfacción del problema.
• Implementación: El objetivo de esta disciplina es transformar su modelo (s) en código
ejecutable y llevar a cabo un nivel básico de las pruebas.
• Pruebas: El objetivo de esta disciplina es ejecutar una evaluación objetiva para asegurar
la calidad.
• Despliegue: Se planifica la entrega del proyecto.
• Administración de la configuración: Control y administración de los cambios del
proyecto.
CAPÍTULO 4. MÉTODO DE TRABAJO 29
• Administración del proyecto: El objetivos es la dirección de las actividades a lo largo
del proyecto.
• Entorno: Asegurar que el proceso es apropiado, y que las guías y herramientas estén
disponibles cuando se necesiten.
4.2.6 Fase VI
En esta última fase se tienen las últimas reuniones con el cliente para enseñar el producto
final y poner en común los últimos detalles de la aplicación. De estas últimas reuniones se
debe sacar el visto bueno del cliente acerca de la aplicación desarrollada.
Finalidad Resultado
Tener las últimas reuniones con el
cliente
producto final con el aprobado del
cliente
Tabla 4.5: Fase VI.
4.3 Marco Tecnológico
A continuación se explican las herramientas utilizadas para desarrollar este Trabajo Fin de
Grado
Figura 4.2: Herramientas utilizadas.
30 4.3. MARCO TECNOLÓGICO
4.3.1 Visual Paradigm for UML
Visual Paradigm [36] es una herramienta CASE utilizada para el desarrollo de aplicaciones
software utilizando el modelado UML. Herramienta para apoyarse en ella durante todo el
ciclo de vida del software, desde la elicitación de requisitos con su modelado de requisitos
hasta la generación de código y documentación pasando por el modelado de la base de datos
y por las etapas de diseño gracias a sus diagramas de Casos de Uso, diagramas de clase
etc. Todos los diagramas UML de este Trabajo Fin de Grado han sido generados con Visual
Paradigm fot UML 11.0.
4.3.2 LATEX
LATEX [37] es un sistema de composición de documentos de texto orientados la creación
de documentos técnicos y científicos que presenten una alta calidad tipográfica. Latex Está
formado por órdenes construidas a partir de comandos de TeX, esto nos permite escribir texto
sin fijarnos en el formato, ya que el formato se obtiene gracias a las instrucciones que obtiene.
La elaboración de un documento con LATEX se realiza en dos etapas. La primera elaborar
el fichero fuente mediante un editor, en este caso se ha utilizado Texmaker, en este fichero
fuente es donde tendrá que contener el texto que imprimirá y las ordenes para dar formato al
texto. Y la segunda etapa que se trata de procesar el archivo fuente donde un compilador, en
este caso MikTex, compila el fichero dejándolo listo para mostrar por pantalla.
4.3.3 Ruby on Rails
Para el desarrollo de este Trabajo Fin de Grado se decidió utilizar Ruby on Rails, ya explicado
en la sección 3.1.3.
4.3.3.1 Bootstrap
Bootstrap [38] es un framework que combina HTML5 con CSS3 y JavaScript para diseño de
aplicaciones web. Permite la adaptación de la interfaz dependiendo del tamaño del dispositivo
en el que se visualice, esto es lo conocido como diseño adaptativo.
CAPÍTULO 4. MÉTODO DE TRABAJO 31
Gracias a Bootstrap se pueden crear diseños simples e intuitivos lo que da agilidad a la
hora de cargar y adaptar la aplicación a los dispositivos.
4.3.3.2 MySQL
MySQL [39] es uun sistema gestor de bases de datos para bases de datos relacionales. Destaca
por su gran adaptación a diferentes entornos de desarrollo y por su integración en distintos
sistemas operativos. Para realizar este Trabajo Fin de Grado se decidió MySQL debido a
que es una de las mejores bases de datos para el desarrollo de aplicaciones web gracias a su
rapidez en la lectura de datos.
4.3.3.3 Sublime Text 2
Sublime Text 2 [40] es un editor de texto y editor de código fuente. Se eligió este editor de
texto para la elaboración de código fuente de este trabajo por su características, desde el
soporte nativo de Ruby como el autocompletado, marcado de llaves, coloreado de sintaxis o
el minimapa que posee para la previsualización del archivo en desarrollo.
4.3.4 Microsoft Project
Microsoft Project [41] es una herramienta para la administración de proyectos desarrollado
por Microsoft. Entre sus características están el desarrollo de planes, asignación de recursos a
tareas, dar seguimiento al progreso, administrar presupuesto o analizar cargas de trabajo. Se
ha utilizado esta herramienta para realizar el seguimiento y gestión de este Trabajo Fin de
Grado.
Capítulo 5
Resultados
A continuación se detallan las distintas iteraciones que se presentaron en el capítulo anterior
y que se han realizado para el desarrollo de la aplicación que tendrá como resultado este
Trabajo Fin de Grado.
5.1 Iteración I
En esta iteración se lleva a cabo la búsqueda de información acerca de las tecnologías a utilizar
para la elaboración del anteproyecto. También se llevan a cabo las primeras entrevistas con el
cliente para conocer el dominio del problema y poder llevar a cabo la primera captación de
requisitos.
Una vez realizado estas primeras tareas, se procede a realizar un estudio de viabilidad del
proyecto para saber si el trabajo a realizar resultará exitoso o se tienen que plantear soluciones
alternativas. Además se realizará la primera planificación del proyecto donde se estimarán
costes en cuanto a tiempo y presupuesto.
5.1.1 Primeras entrevistas con el cliente
En febrero de 2014 se tiene una primera toma de contacto con la idea de la aplicación. Se
ponen en común las ideas acerca del alcance que se debe tener la aplicación. De esta primera
entrevista el alumno saca sus primeras conclusiones sobre lo que debe contener la aplicación
por lo que se realiza la primera versión del documento IEEE 830.
34 5.1. ITERACIÓN I
En marzo de 2014 en la segunda entrevista que se realiza por ambas partes se discute
acerca del contenido del Estándar anteriormente citado. Tras algunas modificaciones menores,
el cliente da el visto bueno a la primera captación de requisitos por lo que se procede a
elaborar el documento del Anteproyecto.
En mayo de 2014 tras la presentación del Anteproyecto se produce la aceptación del
mismo y por tanto luz verde para empezar a desarrollar la aplicación.
Tras la aprobación del Anteproyecto y para comenzar a desarrollar el Trabajo Fin de
Grado se realiza un primera versión de un Diagrama de Casos de Uso y un Diagrama Entida-
d/Relación que fue aceptado por el cliente.
A continuación se adjuntan dichos diagramas presentados:
Figura 5.1: Casos de Uso para Gerente.
CAPÍTULO 5. RESULTADOS 35
Figura 5.2: Casos de Uso para Novios.
Figura 5.3: Casos de Uso para Invitados.
Según se iba avanzando en el desarrollo del sistema se han ido modificando requisitos por
lo que se han producido modificaciones en los diagramas que se mostrarán cuando se detalle
la iteración correspondiente.
36 5.1. ITERACIÓN I
Figura 5.4: Diagrama ER de la apliación.
5.1.1.1 IEEE 830
A continuación se expone el documento IEEE 830 que se elaboró para la elicitación de
requisitos.
Introducción
En este documento se trata de estandarizar la captación de requisitos del sistema a desarrollar.
CAPÍTULO 5. RESULTADOS 37
Propósito
Para la captación de requisitos he decidido utilizar el estándar IEEE 830, de esta forma todos
los requisitos se especifican de forma clara y concisa.
Ámbito del Sistema
El sistema a desarrollar ser llama XXX y realizará las siguientes tareas:
• La principal tarea será la organización automática de los invitados en las distintas mesas
del salón según la afinidad que tenga un invitado con el resto de la mesa. Para ello
los invitados primero tendrán que confirmar su asistencia, y una vez que los Novios
soliciten la organización automática, el sistema debe ser capaz de organizar a todos los
invitados en las mesas del salón según la afinidad que tengan entre ellos.
• El sistema debe permitir al Gerente la gestión de salones y las mesas que contendrán
esos salones. Una vez dentro del sistema, el Gerente podrá añadir, modificar o eliminar
salones del sistema. También podrá generar o eliminar mesas dentro de un salón
seleccionado.
• Una vez que se dé de alta un nuevo enlace, donde se indicará el número de invitados que
tendrá, la aplicación debe asignar el salón más pequeño posible que esté disponible y
que tenga un aforo lo suficientemente grande como para que quepan todos los invitados.
• El sistema debe guardar en la base de datos la confirmación de los invitados a la
boda. Una vez que cada invitado guarde su confirmación de asistencia, el sistema debe
almacenarlo para después poder realizar la organización automática sin problemas.
• La aplicación dará la posibilidad de elegir las mesas que los Novios quieran, siempre y
cuando existan en el salón adjudicado para la celebración del enlace.
El sistema tiene los siguientes objetivos:
• Ayudar a los novios a la organización de los Invitados, ya que el sistema los organizará
de forma automática según la afinidad que tengan entre ellos.
• Gestionar algunos aspectos relacionados con la celebración de una boda, desde la
distribución de las mesas o la creación de salones hasta dar de alta nuevos invitados, los
38 5.1. ITERACIÓN I
cuales podrán confirmar su asistencia o consultar su posición, es decir, la mesa que se
le ha asignado.
• Mantener informado al gerente de las bodas que se van a celebrar en sus salones, además
de informar las bodas que se celebrarán dentro de un salón.
Visión general del documento
Este sistema aporta una nueva idea respecto a otros sistemas ya desarrollados, es la posibilidad
de organizar a los invitados de forma automática de forma que en una misma mesa estén
sentados invitados con una afinidad alta. Además de gestionar todos los elementos típicos de
una boda. Este documento especifica un conjunto de normas, actividades y requisitos que debe
cumplir el sistema para adaptarse a las necesidades del cliente, ayudando a la elaboración del
sistema.
Descripción general
Perspectiva del producto
El sistema que se va a diseñar no necesitará de otros sistemas para su funcionamiento,
simplemente la interacción entre la persona que lo utilice y el sistema. Para realizar la
interacción entre la persona y el sistema se va a diferenciar distintas interfaces según el rol
que tenga el usuario en el sistema.
• Interface de los Novios.
• Interface del Gerente.
• Interface de los Invitados.
Todas estas interfaces deben ser claras e intuitivas de forma que todos los usuarios puedan
utilizarlas sin una formación previa.
Características de los usuarios
• Novios: Tienen la función de añadir a todos los Invitados en el sistema. Además, como
se mencionó anteriormente, son los encargados de elegir las mesas del salón, además
son los únicos que podrán definir las relaciones existentes entre los grupos de invitados.
CAPÍTULO 5. RESULTADOS 39
• Gerente: Encargados de dar de alta nuevos enlaces y a los novios que se casarán en
esos enlaces, además tiene la función de añadir, modificar o borrar salones y generar o
eliminar las mesas de esos salones.
• Invitados: Encargados de confirmar su asistencia a la boda. Podrán consultar su locali-
zación dentro del salón o la lista de invitados completa.
Restricciones
El sistema debe cumplir con la ley de protección de datos. Nunca podrán ser revelados los
datos proporcionado de los Novios y de los Invitados.
Para desarrollar el sistema se va utilizar Ruby como lenguaje de programación bajo el
framework Rails. Para la base de datos se utilizará MySQL y para realizar las vistas se utilizará
HTML5 y CSS3.
Para lograr un sistema seguro se debe proporcionar datos de acceso, tanto usuario como
contraseña, a Invitados, Novios y Gerente. Además las distintas interfaces con las que contará
el sistema deberán ser intuitivas para una mayor comodidad del usuario.
5.1.2 Estudio de viabilidad
Con el presente análisis se pretende determinar el éxito o fracaso del proyecto presentado, con
el fin de decidir la viabilidad de la idea presentada y con la pretensión de ponerlo en marcha.
Para desarrollar este estudio de viabilidad se tendrán en cuenta las siguientes áreas:
• Viabilidad económica: Evaluación de los costos del desarrollo.
• Viabilidad técnica: Estudio de los conocimientos y aptitudes adquiridas en los años
de carrera.
• Viabilidad legal: Determinar cualquier posibilidad de infracción o responsabilidad
legal.
40 5.1. ITERACIÓN I
5.1.2.1 Viabilidad económica
El análisis económico es una de las tares más complejas a la hora de realizar el estudio de
viabilidad debido a que los costos a la hora de desarrollar software muchas veces resultan
intangibles, pero a la vez resulta una tarea muy importante debido a que gracias a ésta depende
la posibilidad de éxito del proyecto.
Para realizar el estudio económico se decide separar los gastos en diretos e indirectos
para evaluar la posibilidad de realización de este Trabajo Fin de Grado.
Costes directos
Son aquellos gastos fijos que habrá que desembolsar como inversión inicial o los costes fijos
que se tendrán todos los meses. En este caso el único desembolso inicial fue la compra de
Monitor Samsung LS22B1150NS de 22 pulgadas y el coste fijo mes tras mes será el sueldo
de los trabajadores que realizarán este Trabajo Fin de Grado. A continuación se especifican
todos los gastos en la tabla:
Gasto Coste
Sueldo Desarrollador Software 500 ¤
Monitor Samsung 120 ¤
Tabla 5.1: Costes directos.
Como únicamente hay un desarrollador, no habrá que multiplicar ese sueldo, por lo que
cada mes se estima el gasto de un único desarrollador 500 ¤.
Costes indirectos
Son los gastos que no están relacionados directamente con las actividades o resultados, sino
con el conjunto de ellos. En la siguiente tabla se especifican todos los gastos de este tipo:
CAPÍTULO 5. RESULTADOS 41
Gasto Coste
Luz 45 ¤
Calefacción 40 ¤
Alquiler piso 180 ¤
Internet 40 ¤
Diferente material de oficina 10 ¤
Tabla 5.2: Costes indirectos.
Coste total
A continuación se detalla el coste total sumando ambos costes durante la duración del proyecto.
El proyecto tiene una duración de 8 meses por lo que el coste por sueldo del desarrollador
será: 500 ¤* 8 meses = 4.000 ¤totales. A esto habría que sumar los 120 ¤de la inversión
inicial para la compra del Monitor. En total se tienen 4.120 ¤de gastos directos.
El total de gastos indirectos será aproximadamente de 315 ¤al mes, si la duración del
proyecto es de 8 meses se tiene: 315 ¤* 8 meses = 2520 ¤.
Asumir estos gastos no sería viable, pero se tiene en cuenta que el desarrollador no perci-
birá ningún sueldo ya que se hace por cuenta propia, y los gastos indirectos se asumen por
cuenta propia gracias a la beca MEC. Por lo que el proyecto solo tendrá gasto de la compra
del monitor, responsabilidad por parte del alumno por lo que no afectará al coste del proyecto.
Concluión, el proyecto se hará a coste cero.
5.1.2.2 Viabilidad técnica
El análisis técnico consiste en realizar una evaluación del software y personas disponibles y si
tienen las capacidades técnicas requeridas.
Para la realización de este Trabajo Fin de Grado se cuentan con las siguientes herramientas
de trabajo:
42 5.1. ITERACIÓN I
• Ordenador portátil Toshiba Satellite L850-138.
• Monitor Samsung LS22B1150NS de 22 pulgadas.
• Microsoft Windows 8.1.
• Micorsoft Office 2010.
• Visual Paradigm 11.0.
• Texmaker
• Editor Sublime text 2.
• Editor Notepad ++.
• WAMPServer
• Framework Ruby on Rails.
• Framework Bootstrap.
• Navegador Google Chrome.
Como se puede observar la mayoría del software es Opensource, aunque el software pri-
vativo cuenta con la licencia en su mayoría de la Universidad de Castilla-la Mancha. Gracias
a que se cuenta con todo este software se puede decir que no hay problema para desarrollar
este trabajo.
En cuanto a las capacidades técnicas de la persona encargada de realizar este proyecto, el
alumno ha adquirido el conocimiento necesario a lo largo de sus años de estudios universita-
rios y con las diferentes asignaturas cursadas, para desarrollar el Trabajo Fin de Grado.
Viendo que ambos análisis son favorables y se tiene, tanto los conocimientos, como el
software necesarios, se puede decir que el estudio de la viabilidad técnica es favorable para
emprender este proyecto.
CAPÍTULO 5. RESULTADOS 43
5.1.2.3 Viabilidad legal
En este estudio se asegura que el proyecto no infringe ninguna norma o ley establecida.
Además se debe garantizar el respeto a los acuerdos relacionados con el ámbito del proyec-
to. También se deben tener en cuenta que las licencias para el software empleado debe ser
auténticas para evitar inconvenientes legales futuros. Y es por estas razones por las que se
ha decidido poner atención en la Ley Orgánica 15/1999 de Protección de Datos de Carácter
Personal.
Puesto que se almacenarán datos personales tanto del gerente como del novio y de
los invitados, se aplica un nivel de seguridad básico de la LOPD, ya que la aplicación de
la LOPD con carácter general es de aplicación a todo tratamiento de datos de carácter personal.
A la hora de dar de alta un nuevo usuario, ya sea novio o invitado, se recogen los datos a
un mayor de edad por lo que cumple todos los requisitos del artículo 5 de la LOPD. En todo
momento se respetará el derecho de acceso, rectificación, cancelación u oposición (ARCO)
garantizado que el usuario dado de alta es exclusivamente el interesado.
Existe la posibilidad también de dar de alta a menores de catorce año en este caso, y según
el artículo 13 del RDLOPD, sólo se podrán dar de alta previo consentimiento de los padres o
tutores.
5.1.3 Plan de proyecto
Una vez realizado el Estudio de viabilidad y ver que es factible realizar el proyecto, se debe
realizar una planificación del proyecto inicial.
A continuación se muestra el diagrama de Gantt elaborado para la planificación inicial del
proyecto. teniendo en cuneta que el desarrollo del proyecto se ha divido en cuatro iteraciones,
que se empieza a desarrollar el día 1 de septiembre de 2014, y teniendo en cuenta la dificultad
de cada iteración, quedaría así la planificación inicial:
a
CAPÍTULO 5. RESULTADOS 45
5.2 Iteración II
En esta iteración se desarrolla el módulo del rol que se ha llamado Gerente. Este usuario será
el dueño de los salones donde se celebrarán los enlaces. En esta iteración se han desarrollado
todas las funcionalidades que desempeña este usuario.
A continuación se adjunta imagen con todas las acciones que podrá realizar el Gerente:
Figura 5.6: Acciones del gerente.
Todas estas acciones se definieron anteriormente en la captura de requisitos y fueron
validadas por el cliente mediante el diagrama de casos de uso del actor Gerente:
5.2.1 Crear Boda
Uno de los primeros pasos que debe realizar el gerente del salón para utilizar la aplicación
será la creación de enlaces matrimoniales. En este módulo se dará de alta una nueva boda
indicando la fecha de la misma y el número máximo de invitados que asistirán para que
se le asignen una salón que esté disponible automáticamente. Se pide que se introduzca el
número de invitados para la asignación automática del salón donde se celebrará la boda, dicha
asignación automática se explica a continuación.
Uno de los requisitos del cliente era la asignación del salón más pequeño posible cuyo
aforo sea lo suficientemente grande para que entren todos los invitados. Se tiene en cuenta
que un mismo salón no puede acoger dos bodas un mismo día. Considerando estos aspectos
se llega a la conclusión que para la asignación automática del salón se tienen en cuenta dos
aspectos, la fecha del enlace y el número de invitados. Si se crean dos bodas para un mismo
día y con un número similar de invitados, en principio a las dos se les podría asignar un
46 5.2. ITERACIÓN II
Figura 5.7: Casos de Uso para Gerente.
mismo salón, esto no sería posible ya que a la primera boda de darse de alta se le asignaría el
salón más pequeño posible cuyo aforo sea lo suficientemente grande para que entren todos
los invitados y la siguiente boda se le asignaría el siguiente salón más pequeño donde entren
todos los invitados.
A continuación se pone un ejemplo y se ve como con el mismo número de invitados y la
misma fecha, a cada boda se le asigna un salón diferente:
Figura 5.8: Boda ejemplo1.
Sin embargo surgen varios problemas a la hora de dar de alta los enlaces y asignar
CAPÍTULO 5. RESULTADOS 47
Figura 5.9: Boda ejemplo2.
automáticamente los salones:
• El primer problema surge cuando todos los salones están cogidos para una misma fecha.
En este caso nos aparece un mensaje de alerta avisando que en esa fecha no hay salones
disponibles. Si aparece este error no dejará dar de alta ese enlace en esa fecha, por lo
que se debe modificar la fecha hasta encontrar una donde esté algún salón libre.
Figura 5.10: Error salones no disponibles.
• El segundo problema surge a la hora de dar de alta una boda con un número de invitados
superior al aforo de todos nuestros salones. En este caso se muestra un mensaje avisando
de que no se dispone de un salón tan grande por lo que no nos dejará dar de alta a este
enlace con este número de invitados.
Figura 5.11: Error numero invitados grande.
Otro de los requisitos a la hora de crear un nuevo enlace era la posibilidad de dar de alta a
los novios desde la misma página de alta del enlace. Para ello se da la posibilidad de crearlos
en el mismo momento de dar de alta el enlace o de darles de alta en otro momento.
Si se decide dar de alta a los novios cuando se crea el enlace, aparecerá una ventana modal
para cada novio. En la ventana aparecerá un formulario sencillo que se rellena con los datos
del novio y se presiona el botón Guardar cambios para dar de alta a los novios y guardar los
datos en la base de datos.
48 5.2. ITERACIÓN II
Figura 5.12: Crear Boda.
Figura 5.13: Alta Novio.
Si no se quiere dar de alta a ninguno de los dos novios en el instante de dar de alta el
enlace, se puede hacer sin problemas, simplemente tendrá que dar de alta a los novios en otro
momento para el enlace que desee. Para esta opción simplemente se introduce la fecha y el
número de invitados para ese enlace.
Figura 5.14: Datos de enlace.
A la hora de meter la fecha del enlace, no se puede introducir cualquier fecha, si no que la
CAPÍTULO 5. RESULTADOS 49
fecha mínima para introducir será la fecha actual ya que se considera innecesario poder dar
de alta bodas con fechas pasadas.
Hasta que no se dan de alta a los Novios, los enlaces aparecen con el nombre de los novios
vacíos hasta que éstos no sean dados de alta. A continuación se muestra como aparecen en el
listado de enlaces que posee el administrador los enlaces con novios dados de alta y enlaces
sin novios dados de alta.
Figura 5.15: Enlace con Novios.
Figura 5.16: Enlace sin Novios.
5.2.1.1 Diagrama de secuencia
A continuación se muestra el diagrama de secuencia que muestra la interacción de los objetos
que influyen en la creación de una boda.
Figura 5.17: Diagrama de secuencia Creación de boda.
50 5.2. ITERACIÓN II
5.2.1.2 Diagrama de clases
A continuación se muestra el diagrama de las clases que intervienen en la creación de un boda
nueva.
Figura 5.18: Diagrama de clases Creación de boda.
5.2.2 Alta de Novios
Como se ha explicado en n la sección de Crear boda, hay dos opciones, o dos momentos, en
los que se pueden crear a los novios:
• La primera opción es dar de alta a los novios al mismo tiempo que se crea el enlace, en
este caso aparece una ventana modal para crear a cada uno de los novios.
• La segunda opción es crear primero el enlace y después dar de alta a los novios eligiendo
el enlace que se le asignará al novio dado de alta:
Como se puede observar ambos formularios son iguales, con la única diferencia que en la
segunda opción se tendrá que elegir el enlace asociado debido a que no se da de alta a los
novios desde la página de alta de enlaces.
Esta vez como requisito impuesto por el cliente y algo totalmente lógico, una boda sólo
podrá tener dos novios, es decir, si se da de alta un novio eligiendo una boda la cual ya tiene
CAPÍTULO 5. RESULTADOS 51
Figura 5.19: Alta Novio 1.
Figura 5.20: Alta Novio 2.
sus dos novios, el sistema nos lanzará un mensaje de error impidiendo que se inserte en base
de datos al novio.
Figura 5.21: Error 1 en Alta de novios.
Otro de los requisitos era la unicidad del email de los novios, ya que se pensó como caso
muy excepcional la posibilidad de que una misma persona se case dos veces en un mismo
restaurante. De ser así se hablaría con el gerente del restaurante para solucionar el problema.
Debido a la unicidad se hacen las comprobaciones correspondientes para comprobar este
52 5.2. ITERACIÓN II
requisito en base de datos y si existe el email se lanza un mensaje de error impidiendo la
inserción en base de datos.
Figura 5.22: Error 2 en Alta de novios.
5.2.2.1 Diagrama de secuencia
Diagrama de secuencia que muestra la interacción de los objetos que intervienen en el Alta
satisfactoria de un nuevo novio.
Figura 5.23: Diagrama de secuencia Alta de novios.
5.2.2.2 Diagrama de clases
Diagrama de las clases utilizadas para el Alta de Novios.
5.2.3 Administración de Salones
En esta sección se explica como el gerente podrá dar de alta todos los salones de los que
disponga su establecimiento. También tiene la posibilidad de modificar sus características, es
decir, si por algún casual la empresa decide hacer obras en los salones y aumenta o disminuye
la capacidad para albergar personas, el aforo, desde aquí se podrá modificar. Si se decide
CAPÍTULO 5. RESULTADOS 53
Figura 5.24: Diagrama de clases Alta Novios.
también dejar de ofertar ese salón el gerente podrá eliminar el salón de la lista de salones.
Para administrar los salones simplemente se tendrá que pinchar sobre la opción Salones
del menú disponible para el administrador. Una vez dentro, aparecerá la lista completa de
salones que se están ofertando, es decir, que están dados de alta en la base de datos.
Figura 5.25: Lista de salones.
Se ve como el administrador podrá realizar las siguientes acciones:
• Crear salón: Para crear un salón lo único que debe hacer el administrador del salón es
introducir el nombre y el aforo del salón a crear.
54 5.2. ITERACIÓN II
Figura 5.26: Crear salón.
• Consultar salón: Se pueden consultar las características de un salón existente donde
se especifican el nombre, y el aforo del salón seleccionado. Además se pueden ver las
bodas que se celebrarán en ese salón, a continuación se muestra un salón como ejemplo
en el que se celebran varios enlaces.
Figura 5.27: Consultar salón.
• Editar salón: Si el gerente de los salones decide modificar los salones por cualquier
razón lo podrá hacer desde aquí, ya sea modificar los nombre por marketing o modificar
el aforo por obras.
Figura 5.28: Editar salón.
• Eliminar salón: Si el gerente decide dejar de ofertar cualquier salón y desea eliminarlo
de la lista de salones tendrá que pinchar en Eliminar en el salón a eliminar. Nos
CAPÍTULO 5. RESULTADOS 55
aparecerá una ventana de aviso para asegurar que es ese el salón que se quiere eliminar
y no ha sido un error.
Figura 5.29: Eliminar salón.
En esta sección no hay mucho más que comentar, a continuación se muestran los diagramas
realizador para el diseño de este apartado.
5.2.3.1 Diagrama de secuencia
Diagrama de secuencia que muestra la interacción de los objetos que intervienen a la hora de
crear satisfactoriamente de un nuevo Salón.
Figura 5.30: Diagrama de secuencia Crear Salón.
5.2.3.2 Diagrama de clases
Diagrama de las clases utilizadas para la administración de salones
56 5.2. ITERACIÓN II
Figura 5.31: Diagrama clases Administración Salones.
5.2.4 Administración de Mesas
En este apartado del módulo del Gerente del salón se muestra la generación y eliminación de
mesas en cada uno de los salones. En un principio se pensó en un diseño para este apartado
donde se mostraban mesa por mesa todas las mesas de todos los salones.
Figura 5.32: Listado de mesas antiguo.
Como se puede observar no es agradable para el usuario ver todas y cada una de las mesas
dadas de alta, por lo que se acordó con el cliente estudiar una forma diferente de mostrar las
mesas y a continuación se muestra la mejor solución encontrada.
Lo primero se tendrá que hacer es escoger un salón. Esto se hace para mostrar solamente
CAPÍTULO 5. RESULTADOS 57
las mesas de ese salón y si se quiere añadir o eliminar las mesas de ese salón. Esto es debido
a que el Gerente de los salones querrá eliminar o generar mesas de un salón nuevo o que se
haya modificado recientemente. Así que esta será la primera pantalla a la hora de ver las mesas:
Figura 5.33: Mostrar según el salón elegido.
Una vez que se elige el salón nos redirecciona a una página nueva donde muestra las
mesas que contiene ese salón. En vez de mostrar todas las mesas sueltas, lo que se decidió
realizar fue la agrupación de las mesas por número de comensales quedando una interfaz
mucho más amigable para el usuario, en este caso el Gerente del salón.
Figura 5.34: Listado de mesas agrupadas.
En este apartado el dar de alta a las mesas se hace de forma diferente. Se pensó que dar de
alta una por una a las mesas iba a ser una tarea demasiado engorrosa por lo que se ha realizado
un generador de mesas, es decir, el Gerente del salón tendrá que introducir el número de
mesas que desea dar de alta y el número de comensales que tendrá cada una de esas mesas.
Todo esto aparecerá en una ventana modal para agilizar el proceso.
Como se puede observar el introducir así las mesas agiliza mucho el alta de las mesas.
Se decidió realizar el mismo proceso para eliminar las mesas, cuando se quiere eliminar un
número de mesas, aparecerá una ventana modal pidiendo el número de mesas a eliminar y el
numero de comensales de esas mesas.
58 5.2. ITERACIÓN II
Figura 5.35: Generador de mesas.
Figura 5.36: Eliminar mesas.
Al igual que el generador de mesas, el eliminar de esta forma las mesas ahorra tiempo al
Gerente a la hora de eliminar mesas, sin tener que eliminar mesa a mesa.
Con esta última funcionalidad surge el problema de introducir mesas que no estén dadas
de alta, es decir, el gerente puede introducir mesas con un número de comensales que no estén
en la base de datos, en este caso aparecerá un mensaje de alerta diciendo que no existen este
tipo de mesas, y por lo tanto al no estar dadas de alta en la base de datos, no se eliminarán.
CAPÍTULO 5. RESULTADOS 59
Figura 5.37: Error mesas no encontradas.
5.2.4.1 Diagrama de secuencia
Diagrama de secuencia que muestra la interacción de los objetos que intervienen a la hora de
generar satisfactoriamente nuevo Mesas.
Figura 5.38: Diagrama de secuencia Generar Mesas.
5.2.4.2 Diagrama de clases
Diagrama de las clases utilizadas para la administración de mesas
a
a
a
CAPÍTULO 5. RESULTADOS 61
5.3 Iteración III
Una vez que se ha dado de alta a los novio para un enlace, estos ya podrán entrar en el sistema.
Los novios deben entrar al sistema mediante su email y su contraseña. La primera pantalla
que verán será la pantalla de inicio de la interfaz que se ha llamado BienvenidaNovios. En
esta primera pantalla aparecerán todas las funcionalidades que podrá realizar un Novio que
contrate el servicio de esta aplicación.
En esta parte del desarrollo se ha dividido en tres fases:
• La primera fase es cuando el novio entra las primeras veces al sistema. Aquí el novio
debe dar de alta a los invitados a la boda y elegir las mesas que quiere que estén
presentes en el salón. Hasta que alguno de los dos novios no elija las suficientes mesas
como para sentar a todos los invitados, el sistema no le dejará realizar ninguna de las
otras acciones.
Figura 5.40: Primera pantalla inicio Novios.
• La segunda fase empieza cuando los novios han elegido todas las mesas para que
puedan sentarse todos los invitados. En este momento el sistema habilita la opción
para definir las relaciones que existen entre los invitados. Hasta que no se definan estas
relaciones el sistema no dejará avanzar hasta la tercera fase.
Figura 5.41: Primera pantalla inicio Novios.
• La tercera fase para los novios empieza cuando han elegido las suficientes mesas como
para que quepan todos los invitados a la boda y han definido las relaciones existentes
entre ellos. En este momento el sistema dejará a los novios realizar los siguientes pasos
para organizar a los invitados. Para que puedan
62 5.3. ITERACIÓN III
Figura 5.42: Primera pantalla inicio Novios.
En la imagen se puede ver como han aparecido los dos nuevas funcionalidades para los
novios una vez que se hayan elegido las mesas.
A continuación se puede ver el diagrama de casos de uso que se definió en la captura de
requisitos
Figura 5.43: Casos de uso para el rol Novio.
Ahora se va a desglosar una por una las funcionalidades que podrá realizar el rol de Novio
5.3.1 Elegir Mesas
Esta funcionalidad es una de las primeras cosas que puede y debe realizar un usuario con
el rol de Novio. En esta parte del sistema se trata de que el novio elija las mesas que cree
CAPÍTULO 5. RESULTADOS 63
oportuno para sentar a sus invitados. Está claro que cada salón dispondrá de sus propias mesas
y son los novios quienes eligen cuantas mesas habrá de cada tipo. Se diferencian las mesas
según el número de comensales, hay que recordar que quien da de alta las mesas y define su
número de comensales es el Gerente del salón desde su interfaz, como ya se explicó en la
5.2.4. Los novios solo podrán disponer de las mesas que haya dado de alta el Gerente para ese
salón.
A continuación se muestra un ejemplo con las mesas almacenadas en la Base de Datos
para el salón asignado a esta boda.
Figura 5.44: Mesas disponibles en un salón.
Como se ve en la imagen, se anuncia a los Novios las mesas que están disponibles. Como
ya se ha dicho esto es simplemente mera información que se le aporta al usuario. Debajo de
esta información se encuentra el formulario que deben rellenar con el numero de mesas de
cada tipo que desean que posea su enlace.
Además se da la opción de incluir una única mesa para los invitados que sean niños. Es
decir en esta mesa solo se sentarán los niños, dando igual la relación que guarden con los
novios. En esta mesa no hace falta indicar el numero de comensales ya que se creará una
mesa con el número de invitados que sean niños. Esto se ha conseguido almacenando en la
tabla de base de datos de invitados un campo que indique si el invitado en cuestión es niño
o no, y a la hora de crear la mesa se dimensiona con el número total de invitados donde el
campo niño sea true. A continuación se muestra una imagen de ese formulario:
Hay una puntualización que se debe hacer a la hora de elegir las mesas. Si los novios
escogen menos mesas de las que deben y todos sus invitados no pueden sentarse, el sistema
seguirá pidiendo que introduzca mesas hasta que todos los invitados puedan sentarse. De esta
forma nos se asegura que todos los invitados estén sentados y a la hora de organizar a los
invitados no haya problemas.
64 5.3. ITERACIÓN III
Figura 5.45: Formulario elegir Mesas Novio.
5.3.1.1 Diagrama de secuencia
Diagrama de secuencia que muestra la interacción de los objetos que intervienen a la hora de
elegir de forma satisfactoria las mesas para un enlace por parte de los Novios.
Figura 5.46: Diagrama de secuencia Elegir Mesas.
CAPÍTULO 5. RESULTADOS 65
5.3.1.2 Diagrama de clases
Diagrama de las clases utilizadas para la elección de mesas por parte de los Novios
Figura 5.47: Diagrama clases Administración Salones.
5.3.2 Alta de Invitados
Es la hora de crear Invitados, y en esta sección se explicará cómo. Hasta ahora el Gerente de
los salones se ha encargado de dar de alta los enlaces y los novios asociados a esos enlaces,
también se encarga de dar de alta nuevos salones y las que contendrán estos salones. Los
Novios se han encargado de elegir las mesas del salón donde celebrarán su boda, y ahora les
toca dar de alta a los invitados.
Para crear un invitado nuevo, los novios deben irse al enlace Alta de invitados, una vez
dentro deben rellenar el formulario con los datos del invitado que vayan a dar de alta. En este
formulario los Novios deben rellenar nombre, apellidos y email del invitado, además debe
elegir una de las posibles relaciones que tiene el invitado con respecto a los novios. Estas
posibles relaciones son:
• Familiares del Novios
• Familiares del Novios
• Amigos del Novio
• Amigos de la Novia
• Amigos en Común del Novio y de la Novia
66 5.3. ITERACIÓN III
• Compañeros de Trabajo del Novio
• Compañeros de Trabajo de la Novia
Figura 5.48: Relaciones entre invitados.
Esto se ha definido así para que a la hora de realizar la organización de los invitados
resulte más sencillo para los novios definir la relación existente entre estos siete grupos de
invitados. A continuación se muestra el formulario que deben rellenar los Novios para crear
un nuevo invitado.
Figura 5.49: Formulario Nuevo Invitado.
En esta funcionalidad de dar de alta nuevos invitados, se tiene que destacar que se ha
añadido el campo Asistencia para aquellos invitados que se sepa que van a ir y no puedan
confirmar la asistencia, como por ejemplo personas mayares o personas que no dispongan de
ordenador. Para ello los novios son los Novios los encargados de fijar la asistencia a true en
CAPÍTULO 5. RESULTADOS 67
lugar de los invitados.
También se ha incluido el campo Niño donde indica si el nuevo invitado es un niño para
luego incluirlo en la mesa exclusiva para niños.
Para la realización de pruebas de este Trabajo Fin de Grado sería una perdida enorme
de tiempo tener que ir dando de alta invitado a invitado cada vez que se creará una nueva
boda para ver los resultados de nuestro trabajo por lo que se decidió crear un generador de
invitados que se explicará más adelante.
5.3.2.1 Diagrama de secuencia
Diagrama de secuencia que muestra la interacción de los objetos que intervienen a la hora de
dar de alta satisfactoriamente nuevo Invitados.
Figura 5.50: Diagrama de secuencia Alta de invitados.
5.3.2.2 Diagrama de clases
Diagrama de las clases utilizadas para dar de alta nuevos invitados
68 5.3. ITERACIÓN III
Figura 5.51: Diagrama clases Alta Invitados.
5.3.3 Definir Relaciones
En este apartado se va a explicar como y para que sirve definir la relación existente entre
los diferentes grupos de invitados. Este paso es fundamental para organizar a los invitados,
siempre y cuando se quiera sentar a los invitados de una forma correcta y con una relación
optima entre los invitados sentados en una misma mesa.
se han definido tres tipos de relaciones: Buena, Normal y Mala. Así los novios lo único
que tienen que hacer es rellenar el formulario indicando el tipo de relación. Para que sea
una interfaz más amigable para el usuario se ha decidido expresar estos tipos de relaciones
mediante emoticonos que definen a la perfección el tipo del que se trata.
Figura 5.52: Tipos de relaciones.
Como se puede intuir en la imagen, la cara verde será para indicar que la afinidad entre
grupos es Alta, la cara amarilla será para indicar que la afinidad es Normal y la cara roja será
para indicar que la afinidad es Baja.
Los Novios serán los encargados de indicar la afinidad existente entre los 7 grupo: Fami-
CAPÍTULO 5. RESULTADOS 69
liares del Novio, Familiares de la Novia, Amigos del Novio, Amigos de la Novia, Amigos
en Común, Compañeros de Trabajo del Novio y Compañeros de Trabajo de la Novia. Si
se parte de que los invitados de un mismo grupo siempre se van a tener una afinidad alta,
solo se tendrían que definir las afinidades que existen entre el grupo con el resto de grupos,
por ejemplo, en el grupo de invitados Amigos de la novia no hay que definir la relación
con el grupo de invitados Familiares del Novio, ya que esta relación ya está definida en el
grupo Familiares del Novios como se puede observar. Ahora se mostrará una parte de esta
funcionalidad para ver como se tendría que rellenar este formulario.
Figura 5.53: Afinidad Familiares del Novio con el resto.
5.3.3.1 Diagrama de secuencia
Diagrama de secuencia que muestra la interacción de los objetos que intervienen cuando se
define satisfactoriamente el nivel de afinidad existente entre los grupos de invitados.
5.3.3.2 Diagrama de clases
Diagrama de las clases utilizadas para definir la relación existente entre los grupos de invitados.
5.3.4 Organizar Invitados
Una vez que se guarda la afinidad existente entre todos los grupos de invitados, ha llegado la
hora de organizar a los invitados dados de alta en el sistema en las mesas elegido. Sin duda
70 5.3. ITERACIÓN III
Figura 5.54: Diagrama de secuencia Definir Relaciones.
Figura 5.55: Diagrama clases Definir Relaciones.
esta es la funcionalidad más importante y el principal motivo de realización de este Trabajo
Fin de Grado. Es por esto por lo que se detallará más en profundidad esta sección evaluando
todos lo casos posibles para organizar a los invitados.
Para empezar hay que decir que esta aplicación ofrece la posibilidad de empezar a sentar
a los invitados a partir de cualquiera de los siete grupos de invitados, es decir, que en las
primeras mesas se sienten invitados del grupo de la familia del novio, o empezar sentando
invitados del grupo de la familia de la novio, o sentar primero los amigos del novio etc. Para
ello primero se debe elegir en el formulario previo a la lista de invitados organizados.
CAPÍTULO 5. RESULTADOS 71
Figura 5.56: Elegir grupo de invitados para empezar a organizar.
También hay que especificar en este formulario la afinidad existente entre los miembros
de una misma mesa, es decir, si se quedan invitados sin sentar de varios grupos, habrá que
mirar la afinidad existente entre ellos y sentar solo a los invitados cuya afinidad sea igual o
mayor a la indicada en este formulario. Un ejemplo sería el siguiente:
Si en este formulario se indica la afinidad entre invitados en las mesas debe ser buena y si
se quedan sin sentar invitados que sean familiares del novio e invitados que sean familiares de
la novia, sólo se sentarían en la misma mesa si entre ambos grupos existe una afinidad alta
(emoticono de cara verde).
Figura 5.57: Elegir afinidad mínima entre invitados de una misma mesa.
Una vez que se ha seleccionado el grupo de invitados por el que los novios quieren
empezar a sentar a los invitados y la afinidad que quieren que hayan entre los invitados de
una misma mesa, el siguiente paso es que la aplicación nos muestre la lista de invitados
completa organizados por mesas y un porcentaje. Este porcentaje será el número de invitados
sentados en mesas gracias a esta aplicación. Hay que decir que este porcentaje varía según los
datos introducidos en la anterior pantalla (grupo por el que empezar a sentar y afinidad entre
invitados de una misma mesa). A continuación se pondrán ejemplos de los posibles casos que
se pueden dar a la hora de organizar a los invitados.
72 5.3. ITERACIÓN III
Ejemplo 1
Si existe una buena relación entre todos los grupos de invitados, significa que en todas las
mesas habrá una afinidad alta entre cualquier invitado, es por ello por lo que dará igual porque
grupo de invitados se empiece a organizar o el nivel de afinidad mínimo que debe existir entre
los grupos, que siempre sentará al 100 % de los invitados puesto que entre ellos se llevan
todos bien.
Datos de prueba
En la pantalla de Definir relaciones se seleccionará Afinidad Alta (emoticono cara verde)
entre todos los grupo. En este caso habría que definir las 21 afinidades con esta afinidad.
Figura 5.58: Afinidad alta entre todos los invitados.
De esta forma se irán seleccionando todos los campos existentes en este formulario.
En el formulario previo a la lista de invitados organizados, es indiferente los datos a
introducir ya que como se ha dicho antes al tener una alta afinidad entre todos los invitados,
dará igual si se introduce que la afinidad mínima sea una afinidad media, porque el algoritmo
evaluará las afinidades Media y Alta. También da igual por que grupo se empiece a sentar
porque sea cual sea el grupo por el que se empiece a sentar, el porcentaje de invitados sentados
será de un 100 %. Como ejemplo se pondrá el siguiente:
CAPÍTULO 5. RESULTADOS 73
Figura 5.59: Datos de entrada, ejemplo 1.
Resultado obtenido
Figura 5.60: Resultado obtenido, ejemplo 1.
Como se ve se obtiene un 100 % de invitados sentados, además se puede ver como la
primera mesa será la mesa exclusiva para los niños y en las siguientes mesas ya se sentarán
los demás invitados, empezando por los familiares de la novia como se indicó anteriormente
en los Datos de prueba.
A continuación se muestra un ejemplo de mesas donde se tienen que juntar invitados de
distintos grupos de invitados debido a que no cabían con los invitados de su propio grupo
74 5.3. ITERACIÓN III
como se ve en el primer ejemplo. Al tener una buena relación entre todos no hay problemas al
sentar unos grupos con otros.
Figura 5.61: Resultado obtenido, ejemplo 1.
CAPÍTULO 5. RESULTADOS 75
Ejemplo 2
Siguiendo el ejemplo anterior se ve como los grupos amigos del novio, amigos de la novia y
compañero de trabajo de la novio se pueden sentar juntos en una misma mesa porque entre
los 3 grupos existe una Alta afinidad. Sin embargo, si se cambia la afinidad de cualquiera de
estos grupos con otro, ya no se podrán sentar en una misma mesa siempre que la afinidad sea
menor a la indicada. A continuación se ilustra con el ejemplo.
Datos de prueba
Para rellenar los campos previos a la lista de organizados puede valer con la mostrada
anteriormente:
Figura 5.62: Datos de entrada, ejemplo 2.
Sin embargo ahora se va a cambiar la relación entre los amigos del novio y los amigos de
la novia con respecto a compañeros de trabajo de la novia.
Figura 5.63: Datos de entrada, ejemplo 2.
76 5.3. ITERACIÓN III
Con estos datos de entrada se puede prever que en la última mesa no se podrán juntos los
grupos especificados anteriormente ya que la afinidad mínima entre grupos se ha marcado
como buena y la relación entre estos grupo es normal. Ahora se muestra en los resultados
obtenidos.
Resultado obtenido
Figura 5.64: Resultado obtenido, ejemplo 2.
En los resultados obtenidos se ve como al no mantener una buena relación entre los
grupos de amigos del novio y de la novia con los compañeros de trabajo de la novia, estos se
intercambian posiciones con otro grupo de invitados que tengan buena relación para seguir
manteniendo el porcentaje del 100 % de invitados sentados.
CAPÍTULO 5. RESULTADOS 77
Ejemplo 3
Este ejemplo va a ser totalmente diferente, se va a definir una Baja afinidad para todos los
grupos, es decir todos los grupos se llevarán mal entre ellos.
Datos de prueba
Primero se define la mala relación entre los grupos de invitados. A continuación se muestra el
ejemplo de la relación de los familiares del novio con los demás grupos de invitados.
Figura 5.65: Datos de entrada, ejemplo 3.
Ahora se va a introducir los siguiente datos para empezar a organizar a los invitados y
para seleccionar la afinidad mínima entre mesas:
Figura 5.66: Datos de entrada, ejemplo 3.
El resultado que se espera obtener será invitados sentados únicamente con invitados de
sus mismo grupo ya que al tener una relación mala entre todos los grupo e indicarle que
la afinidad mínima entre mesas sea Alta, los invitados que se queden sin sentar no podrán
sentarse con el resto de invitados por tener una mala relación.
78 5.3. ITERACIÓN III
Resultado obtenido
Este es el resultado que se obtiene:
Figura 5.67: Resultado obtenido, ejemplo 3.
Se ve como la aplicación ha sido capaz de sentar al 88 % de los invitados, por las razones
antes comentadas, una mala afinidad entre grupos y una Alta afinidad mínima en las mesas.
A continuación se muestra como los invitados sin sentar no se les asigna ninguna mesa:
Bien, ahora se hará una modificación en los datos de entrada, se verá como introduciendo
una baja afinidad mínima entre los invitados de una misma mesa si que sentará a todos
los invitados. La explicación es muy simple, introducir baja afinidad mínima entre mesas
significa que en una misma mesa pueden sentarse invitados que se lleven mal, bien o regular,
CAPÍTULO 5. RESULTADOS 79
Figura 5.68: Resultado obtenido, ejemplo 3.
entonces en una mesa podrán sentarse grupos de invitados que se lleven mal como es nuestro
caso, ya que no se han modificado las relaciones entre grupos de invitados.
Figura 5.69: Datos de entrada, ejemplo 3.
Gracias a esta modificación se espera obtener un 100 % de invitados sentados, pero claro
habrá mesas en los que los invitados tengan una baja afinidad.
Figura 5.70: Resultado obtenido, ejemplo 3.
Se observa como se obtiene el 100 % de los invitados sentado por lo que no hay invitados
sin sentar, pero hay mesas con grupos de invitado que se tienen una afinidad baja
80 5.3. ITERACIÓN III
Figura 5.71: Resultado obtenido, ejemplo 3.
Ejemplo 4
En este ejemplo se ha querido poner un ejemplo más o menos real, donde se definen las
afinidades que probablemente pueden tener entre sí los grupos de invitados en un entorno
real. En los anteriores ejemplos se han explicado los casos más extremos para explicar de una
manera clara el funcionamiento de la aplicación, ahora se va a explicar un más realista.
Datos de prueba
Lo primero que se va a realizar va a ser la definición de afinidades entre los grupos de
invitados tal y como se haría en una boda real. A continuación se detallan todas las afinidades
introducidas para realizar este ejemplo.
Para este ejemplo se ha decidido empezar a sentar a los invitados por los Familiares del
Novio y la relación mínima entre los invitados de una misma mesa sea Buena
Resultado obtenido
A continuación se muestra el resultado, donde se ha obtenido un 93 % de los invitados sentados
en mesas.
Esto es debido a que hay grupos de invitados que no tienen una relación Buena entre ellos,
por lo que les queda la tarea a los Novios de organizarlos automáticamente.
Se puede ver como con los compañeros de trabajo no se puede sentar a ningún invitado
porque no existe una afinidad alta entre cualquier grupo de invitados y los compañeros de
CAPÍTULO 5. RESULTADOS 81
Figura 5.72: Datos de entrada, ejemplo 4.
trabajo.
Los invitados que quedan sin sentar es debido a que no guardan una Buena relación con
los Familiares del Novio y los Amigos del Novio que son los que están sentados en la última
mesa. Entre ellos si que guardan una Alta afinidad como puede comprobarse en los Datos de
entrada.
Visto que se han sentado a un 93 % de los invitados, los Novios pueden decidir que quieren
aumentar ese porcentaje, entonces lo único que tendrán que hacer sería bajar la relación
mínima que puede haber entre los invitados de una misma mesa. A continuación se muestra
el ejemplo.
Con las mismas afinidades que se definieron anteriormente, lo único que se cambia es lo
82 5.3. ITERACIÓN III
Figura 5.73: Datos de entrada, ejemplo 4.
Figura 5.74: Datos de entrada, ejemplo 4.
Figura 5.75: Resultado obtenido, ejemplo 4.
siguiente:
Una vez que termina de organizar a los invitados, se ve como aumente hasta un 97 % el
porcentaje de los invitados sentados en mesas. Esto se debe que ahora la relación mínima que
deben guardar entre los invitados de una misma mesa es Normal.
Como se observa en una misma mesa se sentarán invitados de los grupos: Familiares del
Novio, Familiares de la Novia, Amigos del Novio y Amigos de la Novia ya que entre ellos
existe una relación Buena o Normal. También se ve como con los Compañeros de Trabajo
no se puede sentar, esto sigue debiéndose a la Mala relación existente entre estos grupos y el
resto de grupos.
CAPÍTULO 5. RESULTADOS 83
Figura 5.76: Resultado obtenido, ejemplo 4.
Figura 5.77: Datos de entrada, ejemplo 4.
Figura 5.78: Resultado obtenido, ejemplo 4.
Se podría hacer una nueva prueba introduciendo que la relación mínima entre invitados de
una misma mesa sea Mala, así se vería como la aplicación sienta al 100 % de los invitados,
84 5.3. ITERACIÓN III
Figura 5.79: Resultado obtenido, ejemplo 4.
pero esta prueba ya se realizó en ejemplos anteriores
5.3.4.1 Diagrama de secuencia
Diagrama de secuencia que muestra la interacción de los objetos que intervienen a la hora de
organizar de forma satisfactoria a todos los invitados.
CAPÍTULO 5. RESULTADOS 85
Figura 5.80: Diagrama de secuencia Organizar Invitados.
5.3.4.2 Diagrama de clases
Diagrama de las clases utilizadas para organizar a los invitados
Figura 5.81: Diagrama clases Organizar Invitados.
86 5.4. ITERACIÓN IV
5.4 Iteración IV
En esta iteración se va a tratar el módulo de Invitados. Para que un invitado pueda entrar en el
sistema, primero tiene que estar dado de alta en el mismo por los Novios. Este grupo es el
que menos acciones podrá realizar. Lo más importante que deben hacer las primeras veces
que ingresen en el sistema será la confirmación de la asistencia al enlace. Por defecto todos
los invitados que se den de alta en el sistema tendrán la asistencia a True por lo que se les
incluirán a la hora de organizar a los invitados, es por este motivo por lo que si no pueden
asistir a la boda deben indicarlo a través de este sistema. Con este simple gesto de marcar una
casilla hacen un favor enorme a los Novios a la hora de que quieran organizar a los invitados a
través de esta aplicación.
En la siguiente imagen se ve todas las acciones que podrán realizar los usuarios con el rol
de Invitados a través de su interfaz.
Figura 5.82: Pantalla inicio rol Invitado.
Con el diagrama de casos de uso se definen estas acciones aceptadas por el cliente por
medio de la captura de requisitos.
Figura 5.83: Diagrama de Casos de Uso para el rol Invitado.
Ahora se detallarán estos tres casos de uso con mas detalle.
CAPÍTULO 5. RESULTADOS 87
5.4.1 Confirmar asistencia
Como ya se ha comentado anteriormente esta es la acción más importante para los Invitados.
Que realicen esta acción no afecta al funcionamiento del sistema pero sí que ayudan a los
Novios a la hora de organizar a todos los invitados en las mesas, ya que todos los invitados
dados de alta se crearan con el campo asistencia a true por lo que en un primer momento
todos asistirán al enlace.
Son los propios invitados, cada uno ingresando al sistema con su usuario y contraseña,
los que deben modificar ese campo desde esta pantalla indicando si no asisten o si sí asisten.
Así a la hora de organizar a los invitado, el sistema sólo seleccionará los invitados con el
campo asistencia a true ignorando todos lo invitados que hayan marcado el campo como
false. El campo asistencia de la tabla de base de datos Invitados se marca como false cuando
se ingresa un No en el siguiente formulario.
Figura 5.84: Confirmar asistencia.
Con este simple formulario los invitados pueden confirmar o declinar la invitación al
enlace.
Como ya se ha comentado este gesto de lo Invitados ayuda a seleccionar solamente a los
invitados que si que asistan ignorando a los que hayan declinado la invitación a la boda. Se
sigue diciendo que esto no influye en el funcionamiento del sistema, sino que únicamente no
incluirá en la organización de los invitados en las mesas a aquellos que no vayan a asistir a la
boda.
88 5.4. ITERACIÓN IV
5.4.1.1 Diagrama de secuencia
Diagrama de secuencia que muestra la interacción de los objetos que intervienen a la hora de
confirmar la asistencia del invitado.
Figura 5.85: Diagrama de secuencia Confirmar Asistencia.
5.4.1.2 Diagrama de clases
Diagrama de las clases utilizadas para confirmar asistencia por parte de los Invitado
Figura 5.86: Diagrama clases Confirmar Asitencia.
CAPÍTULO 5. RESULTADOS 89
5.4.2 Invitados
En este apartado los Invitados que entren en el sistema podrán ver el listado completo de las
personas que asistirán a la boda.
Se trata de un apartado meramente informativo donde se podrá visualizar el listado
completo de los invitados que asistirán al enlace, aquí el usuario con el rol de Invitado no
podrá realizar ninguna acción, solamente ver el listado.
Figura 5.87: Lista completa de invitados.
5.4.2.1 Diagrama de secuencia
Diagrama de secuencia que muestra la interacción de los objetos que intervienen a la hora de
mostrar la lista de invitados asistentes al enlace.
Figura 5.88: Diagrama de secuencia Lista Invitados.
90 5.4. ITERACIÓN IV
5.4.2.2 Diagrama de clases
Diagrama de las clases utilizadas para mostrar la lista de invitados completa.
Figura 5.89: Diagrama clases Lista Invitados.
5.4.3 Posición
En esta sección los Invitados podrán ver la mesa en la cual están sentados según la organi-
zación realizada por la aplicación. También podrán visualizar el resto de invitados que les
acompañaran en la mesa.
Al igual que en el anterior apartado, se trata de una sección informativa para el usuario
donde no podrá realizar ninguna acción, solamente visualizar la mesa donde se sentará.
5.4.3.1 Diagrama de secuencia
Diagrama de secuencia que muestra la interacción de los objetos que intervienen a la hora de
mostrar la mesa del invitado y los invitados que le acompañarán.
5.4.3.2 Diagrama de clases
Diagrama de las clases utilizadas para mostrar la lista de invitados completa.
CAPÍTULO 5. RESULTADOS 91
Figura 5.90: Posición del invitado.
Figura 5.91: Diagrama de secuencia Posición Invitado.
Figura 5.92: Diagrama clases Posicion Invitados.
92 5.5. ITERACIÓN V
5.5 Iteración V
En esta interación se van a tratar otros requisitos funcionales que no influyen en el resultado
final del problema pero que se han considerado lo suficientemente importantes como para
incluirlos en esta memoria. Entre ellos está el acceso al sistema (login), gestión del perfil de
usuario, desarrollo de un generador de invitados para generar casos de prueba y la gestión de
contraseñas y nombres aleatorios en el alta de invitados.
5.5.1 Login
Esta funcionalidad se ha creado para que los usuarios puedan acceder al sistema, y que éste
redireccione al usuario, según el rol con el que entre (Gerente, Novio o Invitado), a la interfaz
correspondiente.
Figura 5.93: Acceso al sistema.
Como se puede ver se trata de un formulario muy simple donde el usuario que quiera
acceder al sistema deberá rellenar los campos con su email y su password. Es aquí donde
el sistema comprueba en la base de datos si el usuario que quiere entrar está dado de alta,
primero se comprueba si el email existe en la base de datos y si existe se comprueba que
las contraseñas, la introducida en el formulario y la existente en base de datos, coinciden.
Es posible que un usuario dado de alta se equivoque a la hora de introducir el email o la
password, es por esto por lo que saltará un mensaje de error avisando del problema:
Esta funcionalidad se ha conseguido gracias a la gema sorcery, algo modificada en la
vista y en el controlador, pero la base de la autenticación y gestion de sessions y cookies está
proporcionada por esta gema.
CAPÍTULO 5. RESULTADOS 93
Figura 5.94: Error al acceder al sistema.
5.5.2 Perfil de usuario
Esta funcionalidad fue creada para satisfacer el artículo 5 de la LOPD, respetando en todo
momento el derecho de acceso, rectificación cnacelación u oposición (ARCO). Es por ello
que se ha creado este apartado donde el usuario podrá consultar o modificar sus datos en todo
momento y darse de baja cuando el decida.
Figura 5.95: Enlace al perfil.
Para acceder al perfil hay que irse al enlace info que se encuentra justo a la derecha de la
pantalla principal al lado del nombre del usuario que haya entrado en el sistema, como se ve
en la anterior imagen.
Figura 5.96: Enlace al perfil.
Dentro del perfil del usuario las acciones que podrá realizar serán las de editar perfil
o darse de baja, si el usuario decide cambiar de contraseña o considera que algún dato es
erróneo podrá modificarlo desde el enlace editar. Si por el contrario decide que no quiere
seguir dado de alta en el sistema podrá darse de baja mediante el enlace darse de baja, antes
94 5.5. ITERACIÓN V
de ser eliminado aparecerá un mensaje de confirmación, una vez aceptado el mensaje de
confirmación, este usuario será borrado de la base de datos.
5.5.3 Generador de invitados
Esta es una funcionalidad externa al sistema, el cliente en ningún momento pidió este requi-
sito, simplemente se hizo para generar datos de de prueba y poder comprobar el correcto
funcionamiento de la aplicación. Para generar invitados solo se pide que se introduzca el
tanto por ciento de Invitados de cada grupo que se quiere generar tal y como se muestra en la
siguiente imagen:
Figura 5.97: Enlace al perfil.
Rellenando los campos de este formulario se crearan los invitados en función del tanto
por ciento introducido y del número de invitados que tenga el enlace.
Gracias a este generador se ha ahorrado mucho tiempo a la hora de generar datos de
prueba, ya que si se hubiese hecho de forma manual, uno por uno, como en la seccón 5.3.2, se
hubiese tardado una eternidad en generar los casi 5.000 invitados de prueba creados gracias a
este generador, es por ello que ha resultado vital para probar la aplicación y poder realizar la
mayor cantidad de pruebas posibles.
CAPÍTULO 5. RESULTADOS 95
5.5.4 Nombres, apellidos y passwords aleatorias
Este apartado está relacionado con el apartado anterior, cuando se utiliza el generador de
invitados, los invitados creados deben contener un nombre y un apellido ya que no pueden ser
NULL en base de datos, es por ello que para crear más realismo se decidió crear un vector
con nombre y otro con apellidos para que los invitados creados de este modo tuviesen un
nombre y un apellido real. Luego simplemente utilizado la función Random de Ruby, se van
asignando unos nombre u otros a los invitados, lo mismo ocurrirá con los apellidos.
Figura 5.98: Vector de nombres y apellidos.
Estos son los nombres y apellidos elegidos aleatoriamente y ahora se muestra como se
llama a la función Random en Ruby para asignar un nombre y apellido al azar a los invitados
creados por el generador:
Figura 5.99: Función Random en Ruby.
Tanto los nombres como los apellidos aleatorios se han utilizado para el generador de
invitados, sin embargo las claves aleatorias se ha decidido realizar para los Invitados que se
den de alta de forma manual además de los creados por el generador. En este caso se decide
utilizar otra función de Ruby que genera Strings aleatorios de forma segura, de esta forma se
evita suplantación de identidad proporcionando un grado mayor de seguridad al sistema.
Figura 5.100: Función SecureRandom en Ruby.
Esta función de Ruby crea Strings combinando letras, mayúsculas y minúsculas, números
y simbolos. De esta forma la contraseña que se le envíe al Invitado por correo será segura.
96 5.5. ITERACIÓN V
Este es un ejemplo de contraseñas generadas por esta función:
Figura 5.101: Ejemplo de contraseñas generadas.
Capítulo 6
Conclusiones y Propuestas
En este capítulo se exponen las conclusiones del desarrollo de este Proyecto Final de Carrera
y se proponen propuestas de trabajo futuros. Además se realiza una comprobación del grado
de satisfacción de los objetivos propuestos en el Capítulo 2.
6.1 Conclusiones
En este apartado se discutirán los objetivos logrados y dando una justificación de porqué
motivo se han conseguido superar.
Cumpliendo con los objetivos parciales, se ha logrado desarrollar una aplicación web que
servirá de ayuda a personas que decidan casarse, gracias a esta herramienta los Novios se
ahorrarán la tarea de tener que organizar a los invitados en las mesas ya que esta aplicación lo
realza automáticamente, también servirá de ayuda a Gerentes de salones de boda para llevar
un control acerca de las bodas que se celebrarán en sus salones. A continuación se definen los
objetivos parciales y se comprueba su consecución.
98 6.1. CONCLUSIONES
Objetivo Justificación Éxito?
Op1 Plan de pro-
yecto
Se ha desarrollado un plan de proyecto y un estudio de viabilidad
(sección 5.1.2 y 5.1.3) del proyecto donde se estiman costes y
tiempo de realización
SI
Op2 Documento
IEEE 830
Se elaboró el documento IEEE 830 sección 5.1.1 con los requisitos
de la aplicación tras las primeras entrevistas con el cliente
SI
Op3 Diseño de la
aplicación
Se han elaborado diferentes diagramas de Casos de Uso, de Clases
y de Secuencia presentes a lo largo de la seccion 5
SI
Op4 Diseño de la
base de datos
Se elaboró el diagrama Entidad/Relación de la aplicación, sección
5.1.1
SI
Op5 Aprendizaje
de Ruby, HTML y
CSS
Se realizaron cursos durante dos semanas y como puesta en prácti-
ca de esos conocimientos es este Trabajo Fin de Grado
SI
Op6 Desarrollo
de la aplicación
Se desarrolló esta aplicación cumpliendo con los objetivos como
puede observarse en la sección 5
SI
Tabla 6.1: Tabla resumen de los objetivos.
Como se ven cumplidos todos lo objetivos parciales, el objetivo principal de este Trabajo
Fin de Grado, que no es otro que es el desarrollo de una herramienta que ayude a las personas
que deciden casarse a gestionar algunos aspectos de la celebración del enlace, se ve cumplido.
Además será una aplicación que podrá ser utilizada por el Gerente del lugar de celebración
del enlace para controlar todas las bodas que se celebrarán en su establecimiento o controlar
temas como los salones disponibles o mesas disponibles en cada salón.
CAPÍTULO 6. CONCLUSIONES Y PROPUESTAS 99
6.2 Propuestas futuras
En esta sección se van a proponer algunas mejoras para una posible comercialización de la
aplicación. Ya que en este Trabajo, el desarrollo se ha centrado en la organización de los
invitados, se han dejado algunos temas de la gestión de bodas sin tocar por no tener relación
con la gestión y organización de los invitados.
A continuación se citan algunas de las posibles mejoras para la aplicación.
• Gestión integral de Menús: Una mejora podría ser la incorporación al sistema de la
gestión de menús por parte de los novios. En este apartado los novios podría escoger de
cuántos platos dispondría el menú a servir en su enlace, de esos platos cuantos serían
entrantes, cuantos serían primeros platos etc. Por supuesto ellos serían quienes elegirían
cada plato. También tendrían la posibilidad de elegir la bebida durante el banquete, o
podrían decidir si quieren barra libre para después de la cena o animación para los niños
etc.
• Elaborar presupuesto: Esta sería una funcionalidad a añadir en la parte del Gerente,
donde el podría ir llevando una hoja de gastos según todo lo que vayan configurando
los novios en cuanto a número de invitados, mesas y salón elegido, menú escogido, etc.
Para realizar este módulo económico sería necesario definir algunos aspectos legales,
que en este Trabajo Fin de Grado no se han abarcado.
• Disposición física de las mesas: Una opción para el futuro sería la posibilidad de
incorporar la elección de distribución de las mesas en el salón por parte de los Novios,
pudiendo así colocar las mesas que como ellos quieran, a su gusto, pudiendo colocar,
por ejemplo, las mesas de los familiares más cerca de la mesa presidencial, o cerca de
los otros grupos de invitados que tengan una afinidad alta.
Bibliografía
[1] bodas.net. www.bodas.net.
[2] Evolucion desarrollo web. https://docs.google.com/presentation/d/
1chk81rXDo8ZXwVB_aymOAieJBDYd9u0al2IItwg-TnU/edit#slide=
id.i21.
[3] Evolucion web. http://www.evolutionoftheweb.com/?hl=es.
[4] Ventajas desarrollo Web. http://www.pixima.net/aplicaciones-web/
ventajas-de-las-aplicaciones-web/.
[5] Ventajas desarrollo Web. http://www.internetya.co/
ventajas-y-beneficios-de-las-aplicaciones-web/.
[6] Caracterisiticas desarrollo Web. http://www.logindesarrollos.com/es/
Servicios-aplicaciones-web-21.
[7] PHP. http://es.wikipedia.org/wiki/PHP.
[8] PHP. http://www.ecured.cu/index.php/PHP.
[9] ASP. http://msdn.microsoft.com/es-es/library/4w3ex9c2(v=vs.
100).aspx.
[10] ASP. http://es.wikipedia.org/wiki/ASP.NET.
[11] ASP. http://www.ecured.cu/index.php/ASP.NET.
[12] Libro ASP. http://dgsa.uaeh.edu.mx:8080/bibliotecadigital/
bitstream/231104/349/1/ASP%20.NET%20orientado%20web.pdf.
102 BIBLIOGRAFÍA
[13] Modelos programación ASP. http://blogs.msdn.com/b/daniem/
archive/2012/05/10/modelos-de-programacion-en-aspnet.
aspx.
[14] Ruby on Rails. http://www.rubyonrails.org.es/.
[15] Libro Modelo-Vista-Controlador. http://book.cakephp.org/2.0/
es/cakephp-overview/understanding-model-view-controller.
html.
[16] Porque Ruby. http://www.cristalab.com/blog/
por-que-aprender-ruby-on-rails-c109181l/.
[17] 10 razones para aprender Ruby. http://blog.xenodesystems.com/2012/
06/10-razones-para-aprender-ruby-on-rails.html.
[18] 10 razones para aprender Ruby. http://blog.xenodesystems.com/2012/
06/10-razones-para-aprender-ruby-on-rails.html.
[19] Primeros pasos con ruby. http://html5facil.com/tutoriales/
ruby-on-rails-desde-cero-primeros-pasos/.
[20] Utilizar Ruby. http://www.innovaxp.com/es/blog/
por-que-utilizar-ruby-on-rails/.
[21] Lenguajes de programacion en 2006. http://www.tufuncion.com/
diferentes-lenguajes-programacion.
[22] Lenguajes de programacion en 2010. http://www.innovaxp.com/.
[23] Lenguajes de programacion en 2013. http://programacion.net/noticia/
los_lenguajes_de_programacion_mas_populares_en_2013_2114/.
[24] Introduccion a MVC. http://www.desarrolloweb.com/articulos/
que-es-mvc.html.
[25] CaracterÃsticas MVC. http://www.desarrolloweb.com/articulos/
modelo-vista-controlador-codeigniter.html.
BIBLIOGRAFÍA 103
[26] Introduccion a MVC. http://es.wikipedia.org/wiki/Modelo%E2%80%
93vista%E2%80%93controlador.
[27] Flujo de ejecucion MVC. http://si.ua.es/es/documentacion/
asp-net-mvc-3/1-dia/modelo-vista-controlador-mvc.html.
[28] Web inovios. http://www.inovios.es/.
[29] Web Wedtool. es.wedtool.com/.
[30] Web bodas.net. http://www.bodas.net/.
[31] AUP. http://www.ambysoft.com/unifiedprocess/agileUP.html.
[32] AUP. http://es.slideshare.net/joseluisdifu/
proceso-unificado-gil-aup-17171038.
[33] Metodologia AUP. http://ubuntu-adempiere.blogspot.com.es/2011/
09/metodologia-aup-agile-unified-process.html.
[34] AUP. http://nosolopau.com/2012/06/07/
mas-sobre-el-proceso-unificado-agil-fases-y-disciplinas/.
[35] AUP. http://nosolopau.com/2012/06/07/
mas-sobre-el-proceso-unificado-agil-fases-y-disciplinas/.
[36] Visual Paradigm. http://www.visual-paradigm.com/.
[37] Latex. http://www.latex-project.org/.
[38] Bootstrap. http://getbootstrap.com/.
[39] MySQL. http://www.mysql.com/.
[40] SublimeText2. http://www.sublimetext.com/2.
[41] Microsoft Project 2013. http://es.wikipedia.org/wiki/Microsoft_
Project.
Anexo A
Acrónimos
A continuación se muestra el listado de acrónimos encontrados en la memoria de este Trabajo
Fin de Grado.
AJAX. Asynchronous JavaScript and XML.
ASP. Active Server Pages.
AUP. Proceso Unificado Ágil.
CASE. Computer Aided Software Engineering.
CSS. Cascading Style Sheets.
DRY. Don´t Repeat Yourself.
E/R. Entidad Relacion.
HTML. HyperText Markup Language.
IEEE. Institute of Electrical and Electronics Engineers.
LOPD. Ley Organica de Protección de Datos.
MVC. Modelo-Vista-Controlador.
ODBC. Open DataBase Connectivity.
Op. Objetivo parcial.
ORM. Object-Relational mapping.
PHP. Hypertext Preprocessor.
RDLOPD. Real Decreto de la Ley Organica de Protección de Datos.
RoR. Ruby on Rails.
RUP. Proceso Unificado Rational.
SQL. Structured Query Language.
TFG. Trabajo Fin de Grado.
UML. Unified Modeling Language.
XML. eXtensible Markup Language
Anexo B
Manual de Usuario
A continuación se explica cómo podrá utilizar la aplicación cada uno de los usuarios depen-
diendo del rol que tengan dentro del sistema.
B.1 Gerente
El Gerente de los salones de boda debe entrar en la aplicación con el email [email protected]
y con el password admin.
Figura B.1: Login del Gerente.
Una vez dentro del sistema, siguiendo estos pasos no se tendrá ningún problema
B.1.1 Crear Salón
En la pantalla inicial pinchar en el enlace Salones
Figura B.2: Crear Salon.
108 B.1. GERENTE
Aquí aparece un listado de salones, para crear uno nuevo hay que acceder a través del
enlace Crear Salón
Figura B.3: Crear Salon.
En el formulario que aparece en esta pantalla, rellenarlo con los datos que quiera el
Gerente
Figura B.4: Crear Salon.
B.1.2 Generar y eliminar Mesas
En la pantalla inicial de la interface del Gerente, pinchar en el enlace Mesas
Figura B.5: Generar Mesas.
Una vez dentro, se elegirá el salón donde se quieran generar o eliminar mesas.
ANEXO B. MANUAL DE USUARIO 109
Figura B.6: Generar Mesas.
Aquí se muestran las mesas que tiene este salón, para generar mesas hay que pulsar sobre
el enlace Generar Mesas
Figura B.7: Generar Mesas.
Entonces aparece una ventana modal donde hay que introducir el número de mesas que se
quieren generar y el número de invitados por mesa.
Figura B.8: Generar Mesas.
El mismo procedimiento habría que hacer para eliminar mesas, solo que habrá que pinchar
en el enlace Eliminar Mesas, y habrá que introducir correctamente el número de mesas y el
número de invitados por mesa.
B.1.3 Crear Boda
Crear una boda es muy sencillo, simplemente se pincha en el enlace Crear Boda
Y una vez dentro, rellenar el formulario indicando la fecha del enlace y el número de
invitados.
110 B.2. NOVIO
Figura B.9: Crear Boda.
Figura B.10: Crear Boda.
B.1.4 Alta de Novios
Para dar de alta a un novio dentro del sistema, se pulsa en el enlace Alta de Novios
Figura B.11: Alta de Novios.
Una vez dentro se rellena el formulario y se elige la fecha de la boda cuando se casará ese
novio.
B.2 Novio
Si el usuario entra con el rol de Novio, a continuación se explica cómo podrá realizar las
acciones de este tipo de usuarios.
B.2.1 Alta de Invitados
Lo primer que debe hacer el Novio cuando entra en el sistema es dar de alta a los invitados.
Para ello se pulsa sobre el enlace Alta de Invitados
ANEXO B. MANUAL DE USUARIO 111
Figura B.12: Alta de Novios.
Figura B.13: Alta de Invitados.
Aqui se rellenan los campos del invitado eligiendo bien al grupo al que pertenece el
invitado, ya que luego influirá a la hora de la organización automática
Otro campo a tener en cuenta es el campo Nino, ya que indica si el invitado que se da de
alta es un niños o no para posteriormente sentarlo en la mesa exclusiva de niños.
B.2.2 Elegir Mesas
Este es el siguiente paso que debe realizar el novio. Una vez que se den de alta todos los
invitados, se debe elegir las mesas. Se accede mediante el enlace Elegir Mesas
Una vez dentro, Los novios son los encargados de decidir cuantas mesas quieren de cada
tipo. Aquí solo están las mesas disponibles para el salón que se ha adjudicado al enlace.
Aquí el campo a destacar, es el campos Mesa exclusiva para niños, en caso de querer una
mesa exclusiva para los niños, este campo debe ser Si.
112 B.2. NOVIO
Figura B.14: Alta de Invitados.
Figura B.15: Elegir Mesas.
B.2.3 Definir Relaciones
El tercer paso que deben realizar los novios es la definición de las afinidades entre los grupos
de invitados. Solo los novios saben como se llevan entre los grupos de invitados, por esta
razón son ellos quienes tienen que definir las relaciones entre los invitados.
Para acceder simplemente pulsamos sobre el enlace Definir Relaciones.
Aquà simplemente ir marcando como se llevan entre los invitados: Si tienen una afinidad
alta marcar emoticono de carita verde, si tienen una afinidad media marcar emoticono de
carita amarilla y si tienen una afinidad baja marcar emoticono de carita roja.
B.2.4 Organizar Invitados
Esta es la última acción que se puede hacer si se entra con el rol de Novios. Para acceder a
ella hay que dirigirse al enlace Organizar invitados.
En esta pantalla hay que elegir el grupo de invitados por el que la aplicación empezará
ANEXO B. MANUAL DE USUARIO 113
Figura B.16: Elegir Mesas.
Figura B.17: Definir Relaciones.
a sentar a los invitados, y la afinidad mÃnima que quieren los novios que haya entre los
invitados de una misma mesa.
Cuando se hayan decidido los datos a introducir en el anterior paso, se pulsa en el botón
Organizar invitados y esto llevará a la lista de invitados organizados en las mesas.
114 B.2. NOVIO
Figura B.18: Definir Relaciones.
Figura B.19: Organizar Invitados.
Figura B.20: Organizar Invitados.
Figura B.21: Organizar Invitados.
Anexo C
Codigo fuente
En este anexo se muestra parte del código generado para proporcionar la solución a este
Trabajo Fin de Grado. Se han incluido solamente los algoritmos o partes de clases que se han
considerado más importantes para dar solución al problema inicial.
C.1 Organización de invitados
El algoritmo más importante de este Trabajo Fin de Grado. Aquí su solución:
1 d e f o r g a n i z a d o r
2 @mesas = MesaEnlace . s e l e c t ("id, mesa_id, numero_comensales" )
. where ( : e n l a c e _ i d => s e s s i o n [ : e n l a c e _ i d ] ) ;
3 i f ( params [ : o rden ] )
4 o r g a n i z a r ( params [ : o rden ] , params [ : r e l a c i o n _ m e s a s ] )
5 end
6 end
7
8 d e f o r g a n i z a r ( orden , r e l a c i o n M e s a s )
9 @ i n v i t a d o s = I n v i t a d o . s e l e c t ("id, nombre, apellidos, relacion
, mesa_id" ) . where ("enlace_id=? AND asistencia =? AND
nino=?" , s e s s i o n [ : e n l a c e _ i d ] , t r u e , f a l s e )
10
11 @ i n v i t a d o n i n o = I n v i t a d o . where ("enlace_id=? AND asistencia =?
AND nino=?" , s e s s i o n [ : e n l a c e _ i d ] , t r u e , t r u e ) . f i r s t
12 i f @ i n v i t a d o n i n o
13 @mesanino=MesaEnlace . where ("enlace_id = ? AND mesa_id = ?" ,
s e s s i o n [ : e n l a c e _ i d ] , @ i n v i t a d o n i n o . mesa_id )
14 end
15 @ i n v i t a d o s . each do | i n v i t a d o |
116 C.1. ORGANIZACIÓN DE INVITADOS
16 i n v i t a d o . u p d a t e _ a t t r i b u t e s ( { : mesa_id => n i l } )
17 end
18
19 #raise @mesanino.cogida.inspect
20 @ a c t u a l i z a r m e s a s = MesaEnlace . s e l e c t ("id, mesa_id,
numero_comensales" ) . where ("enlace_id = ?" , s e s s i o n [ :
e n l a c e _ i d ] ) ;
21
22 @ a c t u a l i z a r m e s a s . each do | mesa |
23 mesa . u p d a t e _ a t t r i b u t e s ( {
24 : c o g i d a => f a l s e
25 } )
26 end
27 i f @mesanino
28 @mesanino . each do | mesanino |
29 mesanino . u p d a t e _ a t t r i b u t e s ( {
30 : c o g i d a => t r u e
31 } )
32 end
33 end
34 @mesas = MesaEnlace . s e l e c t ("id, mesa_id, numero_comensales" )
. where ("enlace_id = ? AND cogida =?" , s e s s i o n [ : e n l a c e _ i d
] , f a l s e ) ;
35
36 c a s e o rden . t o _ i
37 when 1
38 @i=1
39 @mesas . each do | mesa |
40
41 @num_comensales = 0
42 #@invitadosmesa = Invitado.order("relacion ASC").where("
enlace_id = ? AND asistencia =? AND nino=?", session
[:enlace_id], true, false)
43
44 @inv i t adosmesa = I n v i t a d o . where ("enlace_id = ? AND
asistencia =? AND nino=? AND relacion = ? AND
mesa_id IS NULL" , s e s s i o n [ : e n l a c e _ i d ] , t r u e , f a l s e ,
@i )
45
ANEXO C. CODIGO FUENTE 117
46
47 @ i n v i t a d o c o n t = I n v i t a d o . where ("enlace_id = ? AND
asistencia =? AND nino=? AND relacion = ? AND
mesa_id IS NULL " , s e s s i o n [ : e n l a c e _ i d ] , t r u e , f a l s e ,
@i ) . c o u n t
48 #raise @invitadocont.inspect
49
50 i f @ i n v i t a d o c o n t >= mesa . numero_comensa les . t o _ i
51 @inv i t adosmesa . each do | i n v i t a d o |
52 i f @num_comensales . t o _ i < mesa . numero_comensa les .
t o _ i
53
54 i f i n v i t a d o . mesa_id == n i l
55 i n v i t a d o . u p d a t e _ a t t r i b u t e s ( {
56 : mesa_id =>mesa . mesa_id ,
57 } )
58 @num_comensales = @num_comensales + 1
59 end
60 e l s e
61 mesa . u p d a t e _ a t t r i b u t e s ( {
62 : c o g i d a => t r u e
63 } )
64 end
65
66 end
67 e l s e
68 @i = @i + 1
69
70 s e n t a r i n v i t a d o s ( @i , mesa )
71
72 end
73 end
74 s e n t a r I n v i t a d o s S i n M e s a ( r e l a c i o n M e s a s )
75 when 2
76 @i=2
77 s e n t a r ( @i , @mesas , r e l a c i o n M e s a s )
78
79 when 3
80 @i=3
118 C.1. ORGANIZACIÓN DE INVITADOS
81 s e n t a r ( @i , @mesas , r e l a c i o n M e s a s )
82
83 when 4
84 @i=4
85 s e n t a r ( @i , @mesas , r e l a c i o n M e s a s )
86
87
88 when 5
89 @i=5
90 s e n t a r ( @i , @mesas , r e l a c i o n M e s a s )
91
92
93 when 6
94 @i=6
95 s e n t a r ( @i , @mesas , r e l a c i o n M e s a s )
96
97 when 7
98 @i=7
99 s e n t a r ( @i , @mesas , r e l a c i o n M e s a s )
100
101 #fin de recorrer todas las mesas
102 end
103
104 r e s p o n d _ t o do | f o r m a t |
105 f o r m a t . h tml { r e d i r e c t _ t o n o v i o s _ l i s t a i n v i t a d o s _ u r l ,
n o t i c e : ’Mesa was successfully created.’ }
106 f o r m a t . j s o n { r e n d e r j s o n : @invi tado , s t a t u s : : c r e a t e d ,
l o c a t i o n : @inv i t ado }
107 end
108
109 end
110
111 d e f s e n t a r ( i , mesas , r e l a c i o n M e s a s )
112
113 @i= i . t o _ i
114 mesas . each do | mesa |
115
116 @num_comensales = 0
117 #@invitadosmesa = Invitado.order("relacion ASC").where("
ANEXO C. CODIGO FUENTE 119
enlace_id = ? AND asistencia =? AND nino=?", session
[:enlace_id], true, false)
118
119 @inv i t adosmesa = I n v i t a d o . where ("enlace_id = ? AND
asistencia =? AND nino=? AND relacion = ? AND
mesa_id IS NULL" , s e s s i o n [ : e n l a c e _ i d ] , t r u e , f a l s e ,
@i )
120
121
122 @ i n v i t a d o c o n t = I n v i t a d o . where ("enlace_id = ? AND
asistencia =? AND nino=? AND relacion = ? AND
mesa_id IS NULL " , s e s s i o n [ : e n l a c e _ i d ] , t r u e , f a l s e ,
@i ) . c o u n t
123 #raise @invitadocont.inspect
124
125 i f @ i n v i t a d o c o n t >= mesa . numero_comensa les . t o _ i
126 @inv i t adosmesa . each do | i n v i t a d o |
127 i f @num_comensales . t o _ i < mesa . numero_comensa les .
t o _ i
128
129 i f i n v i t a d o . mesa_id == n i l
130 i n v i t a d o . u p d a t e _ a t t r i b u t e s ( {
131 : mesa_id =>mesa . mesa_id ,
132 } )
133 @num_comensales = @num_comensales + 1
134 end
135 e l s e
136 mesa . u p d a t e _ a t t r i b u t e s ( {
137 : c o g i d a => t r u e
138 } )
139 end
140
141 end
142 e l s e
143 @i = @i + 1
144 i f @i== i . t o _ i
145 @i=8
146 b r e a k
147
120 C.1. ORGANIZACIÓN DE INVITADOS
148 end
149
150 i f @i<=7
151 s e n t a r i n v i t a d o s ( @i , mesa )
152 e l s e
153 @i = 1
154 s e n t a r i n v i t a d o s ( @i , mesa )
155 end
156 end
157 end
158 @inv i t adosS inMesa = I n v i t a d o . where ("enlace_id = ? and
mesa_id IS NULL" , s e s s i o n [ : e n l a c e _ i d ] )
159
160 i f @inv i t adosS inMesa . c o u n t != 0
161 s e n t a r I n v i t a d o s S i n M e s a ( r e l a c i o n M e s a s )
162 end
163 end
164
165 d e f s e n t a r i n v i t a d o s ( r e l a c i o n , mesa )
166
167 @invi t adosmesa1 = I n v i t a d o . where ("enlace_id = ? AND
asistencia =? AND nino=? AND relacion = ? AND mesa_id IS
NULL" , s e s s i o n [ : e n l a c e _ i d ] , t r u e , f a l s e , r e l a c i o n . t o _ i )
168
169 @ i n v i t a d o c o n t = I n v i t a d o . where ("enlace_id = ? AND
asistencia =? AND nino=? AND relacion = ? AND mesa_id IS
NULL" , s e s s i o n [ : e n l a c e _ i d ] , t r u e , f a l s e , r e l a c i o n . t o _ i )
. c o u n t
170 @invi t adosmesa1 . each do | i n v i t a d o |
171 i f @num_comensales . t o _ i < mesa . numero_comensa les . t o _ i
172
173 i f i n v i t a d o . mesa_id == n i l
174 i n v i t a d o . u p d a t e _ a t t r i b u t e s ( {
175 : mesa_id =>mesa . mesa_id ,
176 } )
177 @num_comensales = @num_comensales + 1
178 end
179 e l s e
180 mesa . u p d a t e _ a t t r i b u t e s ( {
ANEXO C. CODIGO FUENTE 121
181 : c o g i d a => t r u e
182 } )
183 end
184
185 end
186
187 end
188
189 d e f l i s t a i n v i t a d o s
190 @mesas=MesaEnlace . s e l e c t ("id, mesa_id, numero_comensales" ) .
where ( : e n l a c e _ i d => s e s s i o n [ : e n l a c e _ i d ] ) ;
191 @ i n v i t a d o s = I n v i t a d o . s e l e c t ("id, nombre, apellidos, mesa_id,
relacion" ) . where ( : e n l a c e _ i d => s e s s i o n [ : e n l a c e _ i d ] )
192 @ i n v i t a d o s c o n = I n v i t a d o . where ("enlace_id =? AND mesa_id IS
NOT NULL" , s e s s i o n [ : e n l a c e _ i d ] ) . c o u n t
193 @ i n v i t a d o s s i n m e s a = I n v i t a d o . where ("enlace_id =? AND mesa_id
IS NULL" , s e s s i o n [ : e n l a c e _ i d ] )
194 ( ( @ i n v i t a d o s c o n . t o _ f ) / ( @ i n v i t a d o s . c o u n t . t o _ f ) ) . i n s p e c t
195 @ p o r c e n t a j e = ( ( @ i n v i t a d o s c o n . t o _ f / @ i n v i t a d o s . c o u n t . t o _ f ) *
100) . t o _ i
196 #raise @porcentaje.inspect
197 end
198
199 d e f s e n t a r I n v i t a d o s S i n M e s a ( r e l a c i o n M e s a s )
200
201 @inv i t adosS inMesa = I n v i t a d o . where ("enlace_id = ? and
mesa_id IS NULL" , s e s s i o n [ : e n l a c e _ i d ] )
202
203 i f @inv i t adosS inMesa . c o u n t != 0
204
205 @mesas l i b r e s = MesaEnlace . where ("enlace_id = ? AND cogida
= ?" , s e s s i o n [ : e n l a c e _ i d ] , f a l s e )
206
207 #INICIO CONDICION RELACION BUENA
208 #if relacionMesas.to_i == relacionMesas.to_i
209 @ r e l a c i o n e s = R e l a c i o n . where ( : e n l a c e _ i d => s e s s i o n [ :
e n l a c e _ i d ] ) . f i r s t
210 @mesas l i b r e s . each do | r e l a c i o n |
211 #Relacion buena entre familiares del novio y los
122 C.1. ORGANIZACIÓN DE INVITADOS
demas grupos
212 i f @ r e l a c i o n e s . fNov io fNov ia >= r e l a c i o n M e s a s . t o _ i
213 s e n t a r I n v i t a d o s S i n M e s a H e l p e r ( 1 , 2 )
214 end
215 i f @ r e l a c i o n e s . fNovioaNovio >= r e l a c i o n M e s a s . t o _ i
216 s e n t a r I n v i t a d o s S i n M e s a H e l p e r ( 1 , 3 )
217 end
218 i f @ r e l a c i o n e s . fNovioaNovia >= r e l a c i o n M e s a s . t o _ i
219 s e n t a r I n v i t a d o s S i n M e s a H e l p e r ( 1 , 4 )
220 end
221 i f @ r e l a c i o n e s . fNovioaComun >= r e l a c i o n M e s a s . t o _ i
222 s e n t a r I n v i t a d o s S i n M e s a H e l p e r ( 1 , 5 )
223 end
224 i f @ r e l a c i o n e s . fNov io tNov io >= r e l a c i o n M e s a s . t o _ i
225 s e n t a r I n v i t a d o s S i n M e s a H e l p e r ( 1 , 6 )
226 end
227 i f @ r e l a c i o n e s . f N o v i o t N o v i a >= r e l a c i o n M e s a s . t o _ i
228 s e n t a r I n v i t a d o s S i n M e s a H e l p e r ( 1 , 7 )
229 end
230
231 #relacion buena entre familiares de la novia y los
demas grupos
232 i f @ r e l a c i o n e s . fNoviaaNovio >= r e l a c i o n M e s a s . t o _ i
233 s e n t a r I n v i t a d o s S i n M e s a H e l p e r ( 2 , 3 )
234 end
235 i f @ r e l a c i o n e s . fNov iaaNovia >= r e l a c i o n M e s a s . t o _ i
236 s e n t a r I n v i t a d o s S i n M e s a H e l p e r ( 2 , 4 )
237 end
238 i f @ r e l a c i o n e s . fNoviaaComun >= r e l a c i o n M e s a s . t o _ i
239 s e n t a r I n v i t a d o s S i n M e s a H e l p e r ( 2 , 5 )
240 end
241 i f @ r e l a c i o n e s . f N o v i a t N o v i o >= r e l a c i o n M e s a s . t o _ i
242 s e n t a r I n v i t a d o s S i n M e s a H e l p e r ( 2 , 6 )
243 end
244 i f @ r e l a c i o n e s . f N o v i a t N o v i a >= r e l a c i o n M e s a s . t o _ i
245 s e n t a r I n v i t a d o s S i n M e s a H e l p e r ( 2 , 7 )
246 end
247
248 #relacion buena entre amigos del novio y los demas
ANEXO C. CODIGO FUENTE 123
grupos
249 i f @ r e l a c i o n e s . aNovioaNovia >= r e l a c i o n M e s a s . t o _ i
250 s e n t a r I n v i t a d o s S i n M e s a H e l p e r ( 3 , 4 )
251 end
252 i f @ r e l a c i o n e s . aNovioaComun >= r e l a c i o n M e s a s . t o _ i
253 s e n t a r I n v i t a d o s S i n M e s a H e l p e r ( 3 , 5 )
254 end
255 i f @ r e l a c i o n e s . aNovio tNovio >= r e l a c i o n M e s a s . t o _ i
256 s e n t a r I n v i t a d o s S i n M e s a H e l p e r ( 3 , 6 )
257 end
258 i f @ r e l a c i o n e s . aNovio tNovia >= r e l a c i o n M e s a s . t o _ i
259 s e n t a r I n v i t a d o s S i n M e s a H e l p e r ( 3 , 7 )
260
261 end
262
263 #relacion buena entre amigos de la novia y los demas
grupos
264 i f @ r e l a c i o n e s . aNoviaaComun >= r e l a c i o n M e s a s . t o _ i
265 s e n t a r I n v i t a d o s S i n M e s a H e l p e r ( 4 , 5 )
266 end
267 i f @ r e l a c i o n e s . aNovia tNovio >= r e l a c i o n M e s a s . t o _ i
268 s e n t a r I n v i t a d o s S i n M e s a H e l p e r ( 4 , 6 )
269 end
270 i f @ r e l a c i o n e s . aNov ia tNov ia >= r e l a c i o n M e s a s . t o _ i
271 s e n t a r I n v i t a d o s S i n M e s a H e l p e r ( 4 , 7 )
272
273 end
274
275 #relacion buena entre amigos Comun y los demas
grupos
276 i f @ r e l a c i o n e s . aComuntNovio >= r e l a c i o n M e s a s . t o _ i
277 s e n t a r I n v i t a d o s S i n M e s a H e l p e r ( 5 , 6 )
278 end
279 i f @ r e l a c i o n e s . aComuntNovia >= r e l a c i o n M e s a s . t o _ i
280 s e n t a r I n v i t a d o s S i n M e s a H e l p e r ( 5 , 7 )
281
282 end
283
284 #relacion buena entre trabajo del Novio y los demas
124 C.1. ORGANIZACIÓN DE INVITADOS
grupos
285 i f @ r e l a c i o n e s . aComuntNovia >= r e l a c i o n M e s a s . t o _ i
286 s e n t a r I n v i t a d o s S i n M e s a H e l p e r ( 6 , 7 )
287
288 end
289
290 end
291
292 #FIN CONDICION RELACION BUENA
293 #end
294
295 #FIN del if que comprueba si hay invitados sin sentar
296 end
297 #if relacionMesas.to_i == 1
298 c o m p l e t a r ( r e l a c i o n M e s a s . t o _ i )
299 #end
300 end
301
302 d e f s e n t a r I n v i t a d o s S i n M e s a H e l p e r ( i n v i t a d o s N 1 , i n v i t a d o s N 2 )
303 @mesas l i b r e s . each do | m e s a l i b r e |
304
305 @inv i t adosmesa = I n v i t a d o . where ("enlace_id = ? AND
mesa_id = ?" , s e s s i o n [ : e n l a c e _ i d ] , m e s a l i b r e .
mesa_id ) . c o u n t
306
307 i f @inv i t adosmesa ==0
308 @ i n v i t a d o s 1 = I n v i t a d o . where ("enlace_id = ? AND
relacion =? AND mesa_id IS NULL" , s e s s i o n [ :
e n l a c e _ i d ] , i n v i t a d o s N 1 . t o _ i )
309 @ i n v i t a d o s 1 c o n t = I n v i t a d o . where ("enlace_id = ? AND
relacion =? AND mesa_id IS NULL" , s e s s i o n [ :
e n l a c e _ i d ] , i n v i t a d o s N 1 . t o _ i ) . c o u n t
310
311 @ i n v i t a d o s 2 = I n v i t a d o . where ("enlace_id = ? AND
relacion =? AND mesa_id IS NULL" , s e s s i o n [ :
e n l a c e _ i d ] , i n v i t a d o s N 2 . t o _ i )
312 @ i n v i t a d o s 2 c o n t = I n v i t a d o . where ("enlace_id = ? AND
relacion =? AND mesa_id IS NULL" , s e s s i o n [ :
e n l a c e _ i d ] , i n v i t a d o s N 2 . t o _ i ) . c o u n t
ANEXO C. CODIGO FUENTE 125
313
314
315 i f @ i n v i t a d o s 1 c o n t >0 && @ i n v i t a d o s 2 c o n t >0
316 @ i n v i t a d o s 1 . each do | i n v i t a d o 1 |
317 i n v i t a d o 1 . u p d a t e _ a t t r i b u t e s ( { : mesa_id =>
m e s a l i b r e . mesa_id , } )
318 #fin de sentar a los invitados familiares del
novio
319 end
320 @num_comensales = @ i n v i t a d o s 1 c o n t
321
322 @ i n v i t a d o s 2 . each do | i n v i t a d o 2 |
323 i f @num_comensales < m e s a l i b r e .
numero_comensa les . t o _ i
324 i n v i t a d o 2 . u p d a t e _ a t t r i b u t e s ( { : mesa_id =>
m e s a l i b r e . mesa_id , } )
325 @num_comensales=@num_comensales+1
326 i f @num_comensales== m e s a l i b r e .
numero_comensa les
327 m e s a l i b r e . u p d a t e _ a t t r i b u t e s ( {
328 : c o g i d a => t r u e
329 } )
330
331 end
332
333 end
334 #fin de sentar a los invitados familiares de
la novia
335 end
336
337 #fin del if que compruba que hay familiares de
ambos novios
338 end
339
340 #fin del if que comprubea que la mesa esté vacía
341 end
342 #fin del recorrido de todas las mesas
343 end
344 end
126 C.1. ORGANIZACIÓN DE INVITADOS
345
346 d e f c o m p l e t a r ( r e l a c i o n M e s a s )
347 @mesasSinCoger = MesaEnlace . where ("enlace_id = ? AND cogida
= ?" , s e s s i o n [ : e n l a c e _ i d ] , f a l s e )
348 @mesasSinCogercount = MesaEnlace . where ("enlace_id = ? AND
cogida = ?" , s e s s i o n [ : e n l a c e _ i d ] , f a l s e ) . c o u n t
349
350 @mesasSinCoger . each do | mesaSinCoger |
351 @sentar = f a l s e
352 @ i n v i t a d o s = I n v i t a d o . where ("enlace_id = ? AND mesa_id IS
NULL" , s e s s i o n [ : e n l a c e _ i d ] )
353 @ i n v i t a d o s c o n t = I n v i t a d o . where ("enlace_id = ? AND mesa_id
=? " , s e s s i o n [ : e n l a c e _ i d ] , mesaSinCoger . mesa_id ) .
c o u n t
354 @invi tadosMesa = I n v i t a d o . where ("enlace_id = ? AND mesa_id
=? " , s e s s i o n [ : e n l a c e _ i d ] , mesaSinCoger . mesa_id )
355
356 @num_comensales = @ i n v i t a d o s c o n t
357
358 @ i n v i t a d o s . each do | i n v i t a d o |
359 @invi tadosMesa . each do | i n v i t a d o M e s a |
360 #raise invitadoMesa.relacion.inspect
361 i f i n v i t a d o . r e l a c i o n == 1 && i n v i t a d o M e s a == 2
362 i f @ r e l a c i o n e s . fNov io fNov ia >= r e l a c i o n M e s a s . t o _ i
363 @sentar = t r u e
364 end
365 end
366
367 i f i n v i t a d o . r e l a c i o n == 1 && i n v i t a d o M e s a . r e l a c i o n
== 3
368 i f @ r e l a c i o n e s . fNovioaNovio >= r e l a c i o n M e s a s . t o _ i
369 @sentar = t r u e
370 end
371 end
372
373 i f i n v i t a d o . r e l a c i o n == 1 && i n v i t a d o M e s a . r e l a c i o n
== 4
374 i f @ r e l a c i o n e s . fNovioaNovia >= r e l a c i o n M e s a s . t o _ i
375 @sentar = t r u e
ANEXO C. CODIGO FUENTE 127
376 end
377 end
378
379 i f i n v i t a d o . r e l a c i o n == 1 && i n v i t a d o M e s a . r e l a c i o n
== 5
380 i f @ r e l a c i o n e s . fNovioaComun >= r e l a c i o n M e s a s . t o _ i
381 @sentar = t r u e
382 end
383 end
384
385 i f i n v i t a d o . r e l a c i o n == 1 && i n v i t a d o M e s a . r e l a c i o n
== 6
386 i f @ r e l a c i o n e s . fNov io tNov io >= r e l a c i o n M e s a s . t o _ i
387 @sentar = t r u e
388 end
389 end
390
391 i f i n v i t a d o . r e l a c i o n == 1 && i n v i t a d o M e s a . r e l a c i o n
== 7
392 i f @ r e l a c i o n e s . f N o v i o t N o v i a >= r e l a c i o n M e s a s . t o _ i
393 @sentar = t r u e
394 end
395 end
396
397 i f i n v i t a d o . r e l a c i o n == 2 && i n v i t a d o M e s a . r e l a c i o n
== 1
398 i f @ r e l a c i o n e s . fNov io fNov ia >= r e l a c i o n M e s a s . t o _ i
399 @sentar = t r u e
400 end
401 end
402
403 i f i n v i t a d o . r e l a c i o n == 2 && i n v i t a d o M e s a . r e l a c i o n
== 3
404 i f @ r e l a c i o n e s . fNoviaaNovio >= r e l a c i o n M e s a s . t o _ i
405 @sentar = t r u e
406 end
407 end
408
409 i f i n v i t a d o . r e l a c i o n == 2 && i n v i t a d o M e s a . r e l a c i o n ==
128 C.1. ORGANIZACIÓN DE INVITADOS
4
410 i f @ r e l a c i o n e s . fNov iaaNovia >= r e l a c i o n M e s a s . t o _ i
411 @sentar = t r u e
412 end
413 end
414
415 i f i n v i t a d o . r e l a c i o n == 2 && i n v i t a d o M e s a . r e l a c i o n
== 5
416 i f @ r e l a c i o n e s . fNoviaaComun >= r e l a c i o n M e s a s . t o _ i
417 @sentar = t r u e
418 end
419 end
420
421 i f i n v i t a d o . r e l a c i o n == 2 && i n v i t a d o M e s a . r e l a c i o n
== 6
422 i f @ r e l a c i o n e s . f N o v i a t N o v i o >= r e l a c i o n M e s a s . t o _ i
423 @sentar = t r u e
424 end
425 end
426
427 i f i n v i t a d o . r e l a c i o n == 2 && i n v i t a d o M e s a . r e l a c i o n
== 7
428 i f @ r e l a c i o n e s . f N o v i a t N o v i a >= r e l a c i o n M e s a s . t o _ i
429 @sentar = t r u e
430 end
431 end
432
433 i f i n v i t a d o . r e l a c i o n == 3 && i n v i t a d o M e s a . r e l a c i o n
== 2
434 i f @ r e l a c i o n e s . fNoviaaNovio >= r e l a c i o n M e s a s . t o _ i
435 @sentar = t r u e
436 end
437 end
438
439 i f i n v i t a d o . r e l a c i o n == 3 && i n v i t a d o M e s a . r e l a c i o n
== 1
440 i f @ r e l a c i o n e s . fNovioaNovio >= r e l a c i o n M e s a s . t o _ i
441 @sentar = t r u e
442 end
ANEXO C. CODIGO FUENTE 129
443 end
444
445 i f i n v i t a d o . r e l a c i o n == 3 && i n v i t a d o M e s a . r e l a c i o n
== 4
446 i f @ r e l a c i o n e s . aNovioaNovia >= r e l a c i o n M e s a s . t o _ i
447 @sentar = t r u e
448 end
449 end
450
451 i f i n v i t a d o . r e l a c i o n == 3 && i n v i t a d o M e s a . r e l a c i o n
== 5
452 i f @ r e l a c i o n e s . aNovioaComun >= r e l a c i o n M e s a s . t o _ i
453 @sentar = t r u e
454 end
455 end
456
457 i f i n v i t a d o . r e l a c i o n == 3 && i n v i t a d o M e s a . r e l a c i o n
== 6
458 i f @ r e l a c i o n e s . aNovio tNovio >= r e l a c i o n M e s a s . t o _ i
459 @sentar = t r u e
460 end
461 end
462
463 i f i n v i t a d o . r e l a c i o n == 3 && i n v i t a d o M e s a . r e l a c i o n
== 7
464 i f @ r e l a c i o n e s . aNovio tNovia >= r e l a c i o n M e s a s . t o _ i
465 @sentar = t r u e
466 end
467 end
468
469 i f i n v i t a d o . r e l a c i o n == 4 && i n v i t a d o M e s a . r e l a c i o n
== 2
470 i f @ r e l a c i o n e s . fNov iaaNovia >= r e l a c i o n M e s a s . t o _ i
471 @sentar = t r u e
472 end
473 end
474
475 i f i n v i t a d o . r e l a c i o n == 4 && i n v i t a d o M e s a . r e l a c i o n
== 1
130 C.1. ORGANIZACIÓN DE INVITADOS
476 i f @ r e l a c i o n e s . fNovioaNovia >= r e l a c i o n M e s a s . t o _ i
477 @sentar = t r u e
478 end
479 end
480
481 i f i n v i t a d o . r e l a c i o n == 4 && i n v i t a d o M e s a . r e l a c i o n
== 3
482 i f @ r e l a c i o n e s . aNovioaNovia >= r e l a c i o n M e s a s . t o _ i
483 @sentar = t r u e
484 end
485 end
486
487 i f i n v i t a d o . r e l a c i o n == 4 && i n v i t a d o M e s a . r e l a c i o n
== 5
488 i f @ r e l a c i o n e s . aNoviaaComun >= r e l a c i o n M e s a s . t o _ i
489 @sentar = t r u e
490 end
491 end
492
493 i f i n v i t a d o . r e l a c i o n == 4 && i n v i t a d o M e s a . r e l a c i o n
== 6
494 i f @ r e l a c i o n e s . aNovia tNovio >= r e l a c i o n M e s a s . t o _ i
495 @sentar = t r u e
496 end
497 end
498
499 i f i n v i t a d o . r e l a c i o n == 4 && i n v i t a d o M e s a . r e l a c i o n
== 7
500 i f @ r e l a c i o n e s . aNovio tNovia >= r e l a c i o n M e s a s . t o _ i
501 @sentar = t r u e
502 end
503 end
504
505 i f i n v i t a d o . r e l a c i o n == 5 && i n v i t a d o M e s a . r e l a c i o n
== 2
506 i f @ r e l a c i o n e s . aNoviaaComun >= r e l a c i o n M e s a s . t o _ i
507 @sentar = t r u e
508 end
509 end
ANEXO C. CODIGO FUENTE 131
510
511 i f i n v i t a d o . r e l a c i o n == 5 && i n v i t a d o M e s a . r e l a c i o n
== 1
512 i f @ r e l a c i o n e s . fNovioaComun >= r e l a c i o n M e s a s . t o _ i
513 @sentar = t r u e
514 end
515 end
516
517 i f i n v i t a d o . r e l a c i o n == 5 && i n v i t a d o M e s a . r e l a c i o n
== 3
518 i f @ r e l a c i o n e s . aNovioaComun >= r e l a c i o n M e s a s . t o _ i
519 @sentar = t r u e
520 end
521 end
522
523 i f i n v i t a d o . r e l a c i o n == 5 && i n v i t a d o M e s a . r e l a c i o n
== 4
524 i f @ r e l a c i o n e s . aNoviaaComun >= r e l a c i o n M e s a s . t o _ i
525 @sentar = t r u e
526 end
527 end
528
529 i f i n v i t a d o . r e l a c i o n == 5 && i n v i t a d o M e s a . r e l a c i o n
== 6
530 i f @ r e l a c i o n e s . aComuntNovio >= r e l a c i o n M e s a s . t o _ i
531 @sentar = t r u e
532 end
533 end
534
535 i f i n v i t a d o . r e l a c i o n == 5 && i n v i t a d o M e s a . r e l a c i o n
== 7
536 i f @ r e l a c i o n e s . aComuntNovia >= r e l a c i o n M e s a s . t o _ i
537 @sentar = t r u e
538 end
539 end
540
541 i f i n v i t a d o . r e l a c i o n == 6 && i n v i t a d o M e s a . r e l a c i o n
== 2
542 i f @ r e l a c i o n e s . aNovia tNovio >= r e l a c i o n M e s a s . t o _ i
132 C.1. ORGANIZACIÓN DE INVITADOS
543 @sentar = t r u e
544 end
545 end
546
547 i f i n v i t a d o . r e l a c i o n == 6 && i n v i t a d o M e s a . r e l a c i o n
== 1
548 i f @ r e l a c i o n e s . fNov io tNov io >= r e l a c i o n M e s a s . t o _ i
549 @sentar = t r u e
550 end
551 end
552
553 i f i n v i t a d o . r e l a c i o n == 6 && i n v i t a d o M e s a . r e l a c i o n
== 3
554 i f @ r e l a c i o n e s . aNovio tNovio >= r e l a c i o n M e s a s . t o _ i
555 @sentar = t r u e
556 end
557 end
558
559 i f i n v i t a d o . r e l a c i o n == 6 && i n v i t a d o M e s a . r e l a c i o n
== 4
560 i f @ r e l a c i o n e s . aNovia tNovio >= r e l a c i o n M e s a s . t o _ i
561 @sentar = t r u e
562 end
563 end
564
565 i f i n v i t a d o . r e l a c i o n == 6 && i n v i t a d o M e s a . r e l a c i o n
== 5
566 i f @ r e l a c i o n e s . aComuntNovio >= r e l a c i o n M e s a s . t o _ i
567 @sentar = t r u e
568 end
569 end
570
571 i f i n v i t a d o . r e l a c i o n == 6 && i n v i t a d o M e s a . r e l a c i o n
== 7
572 i f @ r e l a c i o n e s . t N o v i o t N o v i a >= r e l a c i o n M e s a s . t o _ i
573 @sentar = t r u e
574 end
575 end
576
ANEXO C. CODIGO FUENTE 133
577 i f i n v i t a d o . r e l a c i o n == 7 && i n v i t a d o M e s a . r e l a c i o n
== 2
578 i f @ r e l a c i o n e s . aNov ia tNov ia >= r e l a c i o n M e s a s . t o _ i
579 @sentar = t r u e
580 end
581 end
582
583 i f i n v i t a d o . r e l a c i o n == 7 && i n v i t a d o M e s a . r e l a c i o n
== 1
584 i f @ r e l a c i o n e s . f N o v i o t N o v i a >= r e l a c i o n M e s a s . t o _ i
585 @sentar = t r u e
586 end
587 end
588
589 i f i n v i t a d o . r e l a c i o n == 7 && i n v i t a d o M e s a . r e l a c i o n
== 3
590 i f @ r e l a c i o n e s . aNovio tNovia >= r e l a c i o n M e s a s . t o _ i
591 @sentar = t r u e
592 end
593 end
594
595 i f i n v i t a d o . r e l a c i o n == 7 && i n v i t a d o M e s a . r e l a c i o n
== 4
596 i f @ r e l a c i o n e s . aNov ia tNov ia >= r e l a c i o n M e s a s . t o _ i
597 @sentar = t r u e
598 end
599 end
600
601 i f i n v i t a d o . r e l a c i o n == 7 && i n v i t a d o M e s a . r e l a c i o n
== 5
602 i f @ r e l a c i o n e s . aComuntNovia >= r e l a c i o n M e s a s . t o _ i
603 @sentar = t r u e
604 end
605 end
606
607 i f i n v i t a d o . r e l a c i o n == 7 && i n v i t a d o M e s a . r e l a c i o n
== 6
608 i f @ r e l a c i o n e s . t N o v i o t N o v i a >= r e l a c i o n M e s a s . t o _ i
609 @sentar = t r u e
134 C.1. ORGANIZACIÓN DE INVITADOS
610 end
611 end
612
613 end
614
615 i f @sentar == t r u e
616 i f @num_comensales < mesaSinCoger . numero_comensa les
617 i n v i t a d o . u p d a t e _ a t t r i b u t e s ( { : mesa_id =>mesaSinCoger .
mesa_id , } )
618 @num_comensales=@num_comensales . t o _ i +1
619
620 i f @num_comensales . t o _ i == mesaSinCoger .
numero_comensa les
621 mesaSinCoger . u p d a t e _ a t t r i b u t e s ( {
622 : c o g i d a => t r u e
623 } )
624 end
625 end
626 end
627
628 end
629 end
630
631 end
ANEXO C. CODIGO FUENTE 135
C.2 Asignar salones libres
1 @salones = Sa lon . f i n d ( : a l l , : o r d e r => "aforo desc" )
2 @salones . each do | s a l o n |
3 @ s a l o n e l e g i d o = s a l o n . i d
4 i f s a l o n . a f o r o >= params [ : n u m e r o _ i n v i t a d o s ] . t o _ i
5 @enlaces = En l ac e . s e l e c t ("id" ) . where ("salon_id = ?
AND fecha = ?" , s a l o n . id , @enlace . f e c h a ) . c o u n t
6 i f @enlaces == 0
7 @enlace . s a l o n _ i d = s a l o n . i d
8 end
9
10 end
11 end
136 C.3. GENERADOR DE INVITADOS
C.3 Generador de invitados
1 d e f g e n e r a r I n v i t a d o s ( p o r c e n t a j e F a m i l i a N o v i o ,
p o r c e n t a j e F a m i l i a N o v i a , po rcen ta j eAmigosNov io ,
po rcen t a j eAmigosNov ia , porcentajeAmigosComun ,
p o r c e n t a j e T r a b a j o N o v i o , p o r c e n t a j e T r a b a j o N o v i a ,
p o r c e n t a j e N i n o s )
2 @enlace= En la c e . f i n d ( s e s s i o n [ : e n l a c e _ i d ] ) ;
3 @mesas = MesaEnlace . s e l e c t ("id, mesa_id, numero_comensales" )
. where ( : e n l a c e _ i d => s e s s i o n [ : e n l a c e _ i d ] ) ;
4 @mesai=@mesas . f i r s t
5 @mesaf=@mesas . l a s t
6 l i m i t e =@enlace . n u m e r o _ i n v i t a d o s ;
7 c o n t a d o r = 0 ;
8
9 nombres = ["CARLOS" , "ALEJANDRO" ,"DANIEL" , "PABLO" , "HUGO" ,
"ALVARO" , "ADRIAN" , "DAVID" ,
10 "DIEGO" , "JAVIER" , "MARIO" , "SERGIO" , "MANUEL" , "NICOLAS" ,
"JORGE" , "VICTOR" , "LUCIA" ,
11 "PAULA" , "CARLA" , "MARIA" , "ALBA" , "CLAUDIA" , "MARTINA" , "
JULIA" , "MARTA" , "LAURA" ,
12 "VALERIA" , "CARMEN" , "ADRIANA" , "ANA" , "ISABEL" ] ;
13
14 a p e l l i d o s = ["GARCIA" , "FERNANDEZ" , "MARTINEZ" , "GONZALEZ" ,
"MARTIN" , "DIAZ" , "GIL" , "RUIZ" ,
15 "ALONSO" ,"SERRANO" , "TORRES" , "RAMOS" , "RUBIO" , "GALLEGO" ,
"AGUADO" , "NIETO" , "CRUZ" , "CARRASCO" ] ;
16
17 i f p o r c e n t a j e F a m i l i a N o v i o
18 l im = ( ( l i m i t e . t o _ i * p o r c e n t a j e F a m i l i a N o v i o . t o _ i ) / 1 0 0 ) .
t o _ i
19 w h i l e c o n t a d o r < l im
20
21 @inv i t ado = I n v i t a d o . new ( {
22 : nombre => nombres [ Random . r and ( nombres . s i z e ) ] ,
23 : a p e l l i d o s => a p e l l i d o s [ Random . r and ( a p e l l i d o s . s i z e ) ] ,
24 : e m a i l => "FamiliaNovio" + c o n t a d o r . t o _ s + "@gmail.com
" ,
ANEXO C. CODIGO FUENTE 137
25 : p a s s => SecureRandom . base64 ( 1 2 ) ,
26 : a s i s t e n c i a => t r u e ,
27 : r e l a c i o n => 1 ,
28 : e n l a c e _ i d => s e s s i o n [ : e n l a c e _ i d ] ,
29 : n ino => f a l s e ,
30 #:mesa_id => Random.rand(@mesai.mesa_id...(@mesaf.
mesa_id+1)),
31 : mesa_id => n i l ,
32 } )
33 @inv i t ado . s ave
34 c o n t a d o r +=1;
35 end
36 end
37
38 c o n t a d o r = 0 ;
39 i f p o r c e n t a j e F a m i l i a N o v i a
40 l im = ( ( l i m i t e . t o _ i * p o r c e n t a j e F a m i l i a N o v i a . t o _ i ) / 1 0 0 ) .
t o _ i
41 w h i l e c o n t a d o r < l im
42
43 @inv i t ado = I n v i t a d o . new ( {
44 : nombre => nombres [ Random . r and ( nombres . s i z e ) ] ,
45 : a p e l l i d o s => a p e l l i d o s [ Random . r and ( a p e l l i d o s . s i z e ) ] ,
46 : e m a i l => "FamiliaNovia" + c o n t a d o r . t o _ s + "@gmail.com
" ,
47 : p a s s => SecureRandom . base64 ( 1 2 ) ,
48 : a s i s t e n c i a => t r u e ,
49 : r e l a c i o n => 2 ,
50 : e n l a c e _ i d => s e s s i o n [ : e n l a c e _ i d ] ,
51 : n ino => f a l s e ,
52 #:mesa_id => Random.rand(@mesai.mesa_id...(@mesaf.
mesa_id+1)),
53 : mesa_id => n i l ,
54 } )
55 @inv i t ado . s ave
56 c o n t a d o r +=1;
57 end
58 end
59 c o n t a d o r = 0 ;
138 C.3. GENERADOR DE INVITADOS
60 i f p o rc e n t a j e A m i go s N o v io
61 l im = ( ( l i m i t e . t o _ i * p o rc e n t a j e A m i g os N o v i o . t o _ i ) / 1 0 0 ) .
t o _ i
62 w h i l e c o n t a d o r < l im
63
64 @inv i t ado = I n v i t a d o . new ( {
65 : nombre => nombres [ Random . r and ( nombres . s i z e ) ] ,
66 : a p e l l i d o s => a p e l l i d o s [ Random . r and ( a p e l l i d o s . s i z e ) ] ,
67 : e m a i l => "AmigosNovio" + c o n t a d o r . t o _ s + "@gmail.com"
,
68 : p a s s => SecureRandom . base64 ( 1 2 ) ,
69 : a s i s t e n c i a => t r u e ,
70 : r e l a c i o n => 3 ,
71 : e n l a c e _ i d => s e s s i o n [ : e n l a c e _ i d ] ,
72 : n ino => f a l s e ,
73 #:mesa_id => Random.rand(@mesai.mesa_id...(@mesaf.
mesa_id+1)),
74 : mesa_id => n i l ,
75 } )
76 @inv i t ado . s ave
77 c o n t a d o r +=1;
78 end
79 end
80 c o n t a d o r = 0 ;
81 i f p o r c e n t a j e A m i g o s N o v i a
82 l im = ( ( l i m i t e . t o _ i * p o r c e n t a j e A m i g o s N o v i a . t o _ i ) / 1 0 0 ) .
t o _ i
83 w h i l e c o n t a d o r < l im
84
85 @inv i t ado = I n v i t a d o . new ( {
86 : nombre => nombres [ Random . r and ( nombres . s i z e ) ] ,
87 : a p e l l i d o s => a p e l l i d o s [ Random . r and ( a p e l l i d o s . s i z e ) ] ,
88 : e m a i l => "AmigosNovia" + c o n t a d o r . t o _ s + "@gmail.com"
,
89 : p a s s => SecureRandom . base64 ( 1 2 ) ,
90 : a s i s t e n c i a => t r u e ,
91 : r e l a c i o n => 4 ,
92 : e n l a c e _ i d => s e s s i o n [ : e n l a c e _ i d ] ,
93 : n ino => f a l s e ,
ANEXO C. CODIGO FUENTE 139
94 #:mesa_id => Random.rand(@mesai.mesa_id...(@mesaf.
mesa_id+1)),
95 : mesa_id => n i l ,
96 } )
97 @inv i t ado . s ave
98 c o n t a d o r +=1;
99 end
100 end
101 c o n t a d o r = 0 ;
102 i f porcenta jeAmigosComun
103 l im = ( ( l i m i t e . t o _ i * porcenta jeAmigosComun . t o _ i ) / 1 0 0 ) .
t o _ i
104 w h i l e c o n t a d o r < l im
105
106 @inv i t ado = I n v i t a d o . new ( {
107 : nombre => nombres [ Random . rand ( nombres . s i z e ) ] ,
108 : a p e l l i d o s => a p e l l i d o s [ Random . r and ( a p e l l i d o s . s i z e ) ] ,
109 : e m a i l => "AmigosComun" + c o n t a d o r . t o _ s + "@gmail.com"
,
110 : p a s s => SecureRandom . base64 ( 1 2 ) ,
111 : a s i s t e n c i a => t r u e ,
112 : r e l a c i o n => 5 ,
113 : e n l a c e _ i d => s e s s i o n [ : e n l a c e _ i d ] ,
114 : n ino => f a l s e ,
115 #:mesa_id => Random.rand(@mesai.mesa_id...(@mesaf.
mesa_id+1)),
116 : mesa_id => n i l ,
117 } )
118 @inv i t ado . s ave
119 c o n t a d o r +=1;
120 end
121 end
122 c o n t a d o r = 0 ;
123 i f p o r c e n t a j e T r a b a j o N o v i o
124 l im = ( ( l i m i t e . t o _ i * p o r c e n t a j e T r a b a j o N o v i o . t o _ i ) / 1 0 0 ) .
t o _ i
125 w h i l e c o n t a d o r < l im
126
127 @inv i t ado = I n v i t a d o . new ( {
140 C.3. GENERADOR DE INVITADOS
128 : nombre => nombres [ Random . r and ( nombres . s i z e ) ] ,
129 : a p e l l i d o s => a p e l l i d o s [ Random . r and ( a p e l l i d o s . s i z e ) ] ,
130 : e m a i l => "TrabajoNovio" + c o n t a d o r . t o _ s + "@gmail.com
" ,
131 : p a s s => SecureRandom . base64 ( 1 2 ) ,
132 : a s i s t e n c i a => t r u e ,
133 : r e l a c i o n => 6 ,
134 : e n l a c e _ i d => s e s s i o n [ : e n l a c e _ i d ] ,
135 : n ino => f a l s e ,
136 #:mesa_id => Random.rand(@mesai.mesa_id...(@mesaf.
mesa_id+1)),
137 : mesa_id => n i l ,
138 } )
139 @inv i t ado . s ave
140 c o n t a d o r +=1;
141 end
142 end
143
144 c o n t a d o r = 0 ;
145 i f p o r c e n t a j e T r a b a j o N o v i a
146 l im = ( ( l i m i t e . t o _ i * p o r c e n t a j e T r a b a j o N o v i a . t o _ i ) / 1 0 0 ) .
t o _ i
147 w h i l e c o n t a d o r < l im
148
149 @inv i t ado = I n v i t a d o . new ( {
150 : nombre => nombres [ Random . r and ( nombres . s i z e ) ] ,
151 : a p e l l i d o s => a p e l l i d o s [ Random . r and ( a p e l l i d o s . s i z e ) ] ,
152 : e m a i l => "TrabajoNovia" + c o n t a d o r . t o _ s + "@gmail.com
" ,
153 : p a s s => SecureRandom . base64 ( 1 2 ) ,
154 : a s i s t e n c i a => t r u e ,
155 : r e l a c i o n => 7 ,
156 : e n l a c e _ i d => s e s s i o n [ : e n l a c e _ i d ] ,
157 : n ino => f a l s e ,
158 #:mesa_id => Random.rand(@mesai.mesa_id...(@mesaf.
mesa_id+1)),
159 : mesa_id => n i l ,
160 } )
161 @inv i t ado . s ave
ANEXO C. CODIGO FUENTE 141
162 c o n t a d o r +=1;
163 end
164 end
165
166 c o n t a d o r = 0 ;
167 i f p o r c e n t a j e N i n o s
168 l im = ( ( l i m i t e . t o _ i * p o r c e n t a j e N i n o s . t o _ i ) / 1 0 0 ) . t o _ i
169 w h i l e c o n t a d o r < l im
170
171 @inv i t ado = I n v i t a d o . new ( {
172 : nombre => nombres [ Random . rand ( nombres . s i z e ) ] ,
173 : a p e l l i d o s => a p e l l i d o s [ Random . r and ( a p e l l i d o s . s i z e ) ] ,
174 : e m a i l => "Nino" + c o n t a d o r . t o _ s + "@gmail.com" ,
175 : p a s s => SecureRandom . base64 ( 1 2 ) ,
176 : a s i s t e n c i a => t r u e ,
177 : r e l a c i o n => 1 + Random . rand ( 6 ) ,
178 : e n l a c e _ i d => s e s s i o n [ : e n l a c e _ i d ] ,
179 : n ino => t r u e ,
180 #:mesa_id => Random.rand(@mesai.mesa_id...(@mesaf.
mesa_id+1)),
181 : mesa_id => n i l ,
182 } )
183 @inv i t ado . s ave
184 c o n t a d o r +=1;
185 end
186 end
187
188 r e s p o n d _ t o do | f o r m a t |
189 f o r m a t . h tml { r e d i r e c t _ t o i n v i t a d o s _ u r l , n o t i c e : ’Invitado
was successfully created.’ }
190 f o r m a t . j s o n { r e n d e r j s o n : @invi tado , s t a t u s : : c r e a t e d ,
l o c a t i o n : @inv i t ado }
191 end
192 end
142 C.4. ALGORITMO PARA ELEGIR MESAS
C.4 Algoritmo para elegir mesas
Este es el algoritmo para dar solución a la sección 5.3.1.
1 d e f e l e g i r m e s a s
2 @enlace= En la c e . f i n d ( s e s s i o n [ : e n l a c e _ i d ] )
3 @salon= Sa lon . s e l e c t ("id" ) . where ( : i d => @enlace . s a l o n _ i d ) .
f i r s t ;
4 @mesas=Mesa . group ("numero_comensales" ) . where ( : s a l o n _ i d =>
@salon . i d ) . c o u n t
5 @mesasenlaces = MesaEnlace . group ("numero_comensales" ) . where
( : e n l a c e _ i d => s e s s i o n [ : e n l a c e _ i d ] ) . c o u n t
6 @ i n v i t a d o s n i n o = I n v i t a d o . s e l e c t ("id, mesa_id" ) . where ("nino
=? AND enlace_id =?" , t r u e , s e s s i o n [ : e n l a c e _ i d ] ) . f i r s t
7 @ i n v i t a d o s n i n o c o u n t = I n v i t a d o . where ("nino =? AND enlace_id
=?" , t r u e , s e s s i o n [ : e n l a c e _ i d ] ) . c o u n t
8 i f ( @ i n v i t a d o s n i n o )
9 @mesanino=MesaEnlace . s e l e c t ("id" ) . where ( : mesa_id =>
@ i n v i t a d o s n i n o . mesa_id ) . c o u n t
10 end
11
12 @z=1
13 @error = f a l s e
14
15 i f ( params [ : mesa_n inos ]=="true" )
16 c r e a r m e s a n i n o ( @salon . i d )
17 end
18
19 i f ( params [ : numero_mesas1 ] )
20
21 @mesas . each do | mesa |
22
23 @i=1;
24 numero_comensa les =mesa [ 0 ]
25 mesas_con t =mesa [ 1 ] . t o _ i
26 @mesa = Mesa . s e l e c t ("id, numero_comensales,
enlace_id" ) . where ("numero_comensales =? AND
salon_id = ?" , numero_comensales , @enlace .
s a l o n _ i d )
ANEXO C. CODIGO FUENTE 143
27 @mesaenlacecont = MesaEnlace . s e l e c t ("id,
numero_comensales, enlace_id" ) . where ("
numero_comensales =? AND enlace_id = ?" ,
numero_comensales , @enlace . i d ) . c o u n t
28 p a r a m e t r o s =( params ["numero_mesas"+(@z) . t o _ s ] . t o _ i )
29 t o t a l = @mesaenlacecont . t o _ i + p a r a m e t r o s
30 @comparacion =( t o t a l <= mesas_con t )
31 i f ( t o t a l <= mesas_con t )
32 @mesa . each do | mesa1 |
33 i f ( e s t a l i b r e ( mesa1 . id , mesa1 .
numero_comensa les ) == t r u e and ( p a r a m e t r o s
) >=@i )
34 @mesaenlace = MesaEnlace . new ( {
35 : e n l a c e _ i d => s e s s i o n [ : e n l a c e _ i d ] ,
36 : mesa_id => mesa1 . id ,
37 : numero_comensa les => mesa1 .
numero_comensales ,
38 : c o g i d a => f a l s e ,
39 } )
40 @mesaenlace . s ave
41 end
42 @i = @i + 1
43 end
44 e l s e
45 @error= t r u e
46 end
47
48 @z=@z+1
49
50 end
51 end
52
53 i f ( params [ : numero_mesas1 ] )
54 r e s p o n d _ t o do | f o r m a t |
55 i f @error == t r u e
56
57 f o r m a t . h tml { r e n d e r a c t i o n : "elegirmesas" }
58 f o r m a t . j s o n { r e n d e r j s o n : @mesa . e r r o r s , s t a t u s : :
u n p r o c e s s a b l e _ e n t i t y }
144 C.4. ALGORITMO PARA ELEGIR MESAS
59 e l s e
60 f o r m a t . h tml { r e d i r e c t _ t o m e s a _ e n l a c e s _ u r l , n o t i c e : ’
Mesa was successfully created.’ }
61 f o r m a t . j s o n { r e n d e r j s o n : @mesa , s t a t u s : : c r e a t e d ,
l o c a t i o n : @mesa }
62 end
63 end
64 end
65 end
66
67 d e f e s t a l i b r e ( id_m , numero_comensa les )
68 l i b r e = t r u e
69 @mesaenlace = MesaEnlace . s e l e c t ("id, enlace_id, mesa_id" ) .
where ("enlace_id =? AND numero_comensales =? " , s e s s i o n
[ : e n l a c e _ i d ] , numero_comensa les )
70
71 @mesaenlace . each do | m e s a e n l a c e |
72 i f ( m e s a e n l a c e . mesa_id == id_m . t o _ i )
73 l i b r e = f a l s e
74 e l s e
75 l i b r e = t r u e
76 end
77 end
78 r e t u r n l i b r e
79 end
ANEXO C. CODIGO FUENTE 145
C.5 Clase para iniciar sesión
En esta clase se controlan las sesiones que se guardan en el navegador.
1 c l a s s T e s t S e s i o n e s C o n t r o l l e r < A p p l i c a t i o n C o n t r o l l e r
2 d e f i n i c i a r _ s e s i o n
3 @ e r r o r _ l o g i n = f a l s e ;
4 #Verifica si se ha enviado el formulario.
5 i f r e q u e s t . p o s t ?
6 #Verifica si el nombre de usuario y la contraseña son
correctos.
7 i f l o g i n ( params [ : n o m b r e _ u s u a r i o ] , params [ : c o n t r a s e n a ] ) &&
@user
8 #Los datos son correctos así que redirecciona a la
página de bienvenida.
9 r e d i r e c t _ t o : c o n t r o l l e r => "test_sesiones" , : a c t i o n =>
"bienvenida" ;
10 e l s i f l o g i n ( params [ : n o m b r e _ u s u a r i o ] , params [ : c o n t r a s e n a ] )
&& @novio
11 r e d i r e c t _ t o : c o n t r o l l e r => "test_sesiones" , : a c t i o n
=> "bienvenidaNovio" ;
12 e l s i f l o g i n ( params [ : n o m b r e _ u s u a r i o ] , params [ : c o n t r a s e n a
] ) && @inv i t ado
13 r e d i r e c t _ t o : c o n t r o l l e r => "test_sesiones" , : a c t i o n
=> "bienvenidaInvitado" ;
14 e l s e
15 #Los datos son incorrectos así que setea la variable
@error_login a true para mostrar el error por
pantalla.
16 @ e r r o r _ l o g i n = t r u e ;
17 end
18 end
19 end
20
21 d e f c e r r a r _ s e s i o n
22 @sesion = g e t _ l o g i n ( ) ;
23 i f @sesion
24 l o g o u t ( ) ;
25 e l s e
146 C.5. CLASE PARA INICIAR SESIÓN
26 r e d i r e c t _ t o : c o n t r o l l e r => "test_sesiones" , : a c t i o n => "
iniciar_sesion" ;
27 end
28 end
29 d e f b i e n v e n i d a
30 #@enlaces = Enlace.all
31 @enlaces= En la c e . o r d e r ( : f e c h a )
32 @novios = Novio . a l l
33 #@salon = Salon.select("metros_ancho, metros_largo, nombre").
where(:id => @enlace.salon_id).first
34 @sesion = g e t _ l o g i n ( ) ;
35 i f @sesion
36 @nombre = @sesion [ : nombre ] ;
37 @ ap e l l i do = @sesion [ : a p e l l i d o ] ;
38 e l s e
39 r e d i r e c t _ t o : c o n t r o l l e r => "test_sesiones" , : a c t i o n => "
iniciar_sesion" ;
40 end
41 end
42 d e f b i e n v e n i d a N o v i o
43 @enlace = En la c e . s e l e c t ("fecha, numero_invitados" ) . where ( : i d
=> s e s s i o n [ : e n l a c e _ i d ] ) . f i r s t
44 @mesaEnlace= MesaEnlace . s e l e c t ("id, mesa_id, enlace_id,
numero_comensales" ) . where ( : e n l a c e _ i d => s e s s i o n [ : e n l a c e _ i d
] )
45 @numero_to ta l = 0 ;
46
47 @ i n v i t a d o s = I n v i t a d o . where ("enlace_id = ? AND asistencia = ?"
, s e s s i o n [ : e n l a c e _ i d ] , t r u e ) . c o u n t
48 @mesaEnlace . each do | m e s a e n l a c e |
49
50 @numero_to ta l = @numero_to ta l + m e s a e n l a c e .
numero_comensa les
51 end
52 @ r e l a c i o n e s = R e l a c i o n . where ("enlace_id = ? " , s e s s i o n [ :
e n l a c e _ i d ] ) . f i r s t
53
54 @sesion = g e t _ l o g i n ( ) ;
55 i f @sesion
ANEXO C. CODIGO FUENTE 147
56 @nombre = @sesion [ : nombre ] ;
57 @a p e l l i do = @sesion [ : a p e l l i d o ] ;
58 @email = @sesion [ : e m a i l ]
59 @novio = Novio . s e l e c t ("id, nombre, apellidos" ) . where ( : i d
=> s e s s i o n [ : i d _ n o v i o ] ) . f i r s t
60
61 e l s e
62 r e d i r e c t _ t o : c o n t r o l l e r => "test_sesiones" , : a c t i o n => "
iniciar_sesion" ;
63 end
64 end
65 d e f b i e n v e n i d a I n v i t a d o
66 @enlace = En la c e . s e l e c t ("fecha" ) . where ( : i d => s e s s i o n [ :
e n l a c e _ i d ] ) . f i r s t
67
68 @sesion = g e t _ l o g i n ( ) ;
69
70 i f @sesion
71 @nombre = @sesion [ : nombre ] ;
72 @a p e l l i do = @sesion [ : a p e l l i d o ] ;
73 @inv i t ado = I n v i t a d o . s e l e c t ("id, nombre, apellidos" ) . where
( : i d => s e s s i o n [ : i d _ i n v i t a d o ] ) . f i r s t
74 e l s e
75 r e d i r e c t _ t o : c o n t r o l l e r => "test_sesiones" , : a c t i o n => "
iniciar_sesion" ;
76 end
77 end
78 p r i v a t e
79 d e f l o g i n ( u s u a r i o , c o n t r a s e n a )
80 @user = U s u a r i o . s e l e c t ("nombre, apellidos, pass" ) . where ( :
e m a i l => u s u a r i o ) . f i r s t
81 @novio = Novio . s e l e c t ("id, nombre, pass, apellidos, email,
telefono, enlace_id" ) . where ( : e m a i l => u s u a r i o ) . f i r s t
82 @inv i t ado = I n v i t a d o . s e l e c t ("id,nombre, apellidos, pass,
enlace_id" ) . where ( : e m a i l => u s u a r i o ) . f i r s t
83 i f ( @novio ) && ( @novio . p a s s == c o n t r a s e n a )
84 s e s s i o n [ : l o g u e a d o ] = t r u e ;
85 s e s s i o n [ : nombre ] = @novio [ : nombre ] ;
86 s e s s i o n [ : a p e l l i d o ] = @novio [ : a p e l l i d o s ] ;
148 C.5. CLASE PARA INICIAR SESIÓN
87 s e s s i o n [ : e m a i l ] = @novio [ : e m a i l ] ;
88 s e s s i o n [ : t e l e f o n o ] = @novio [ : t e l e f o n o ] ;
89 s e s s i o n [ : i d _ n o v i o ]= @novio [ : i d ]
90 s e s s i o n [ : e n l a c e _ i d ] = @novio [ : e n l a c e _ i d ] ;
91 s e s s i o n [ : i d ] = 1 ;
92
93 r e t u r n t r u e ;
94 r e d i r e c t _ t o "/novios" , : n o t i c e => "Logged in!"
95
96 e l s i f ( @user ) && @user . p a s s == c o n t r a s e n a
97 s e s s i o n [ : l o g u e a d o ] = t r u e ;
98 s e s s i o n [ : nombre ] = @user [ : nombre ] ;
99 s e s s i o n [ : a p e l l i d o ] = @user [ : a p e l l i d o s ] ;
100 s e s s i o n [ : e m a i l ] = @user [ : e m a i l ] ;
101 s e s s i o n [ : i d ] = 2 ;
102 r e t u r n t r u e ;
103
104 r e d i r e c t _ b a c k _ o r _ t o "/usuarios" , : n o t i c e => "Logged in!"
105
106 e l s i f ( @inv i t ado ) && @inv i t ado . p a s s == c o n t r a s e n a
107 s e s s i o n [ : l o g u e a d o ] = t r u e ;
108 s e s s i o n [ : nombre ] = @inv i t ado [ : nombre ] ; ;
109 s e s s i o n [ : a p e l l i d o ] = @inv i t ado [ : a p e l l i d o s ] ;
110 s e s s i o n [ : i d _ i n v i t a d o ]= @inv i t ado [ : i d ]
111 s e s s i o n [ : i d ]= 3 ;
112 s e s s i o n [ : e n l a c e _ i d ]= @inv i t ado [ : e n l a c e _ i d ] ;
113 r e t u r n t r u e ;
114
115 r e d i r e c t _ b a c k _ o r _ t o "/invitados" , : n o t i c e => "Logged
in!"
116
117 e l s e
118 r e t u r n f a l s e ;
119 end
120
121 end
122 d e f l o g o u t
123 #Desloguea al usuario.
124 r e s e t _ s e s s i o n ;
ANEXO C. CODIGO FUENTE 149
125 end
126 d e f g e t _ l o g i n
127 #Verifica si el usuario está logueado. Primero pregunta si
existe la session[:logueado] y además que este sea
true, si existe devuelve la sesión sino existe
devuelve false.
128 i f d e f i n e d ? ( s e s s i o n [ : l o g u e a d o ] ) and s e s s i o n [ : l o g u e a d o ]
129 #Está logueado.
130 r e t u r n s e s s i o n ;
131 e l s e
132 #No está logueado.
133 r e t u r n f a l s e ;
134 end
135 end
136
137 end