TRABAJO FIN DE ESTUDIOS - Biblioteca de la Universidad de ... · PDF fileIdentificación...
Transcript of TRABAJO FIN DE ESTUDIOS - Biblioteca de la Universidad de ... · PDF fileIdentificación...
TRABAJO FIN DE ESTUDIOS
Padelink: portal social para un club de padel
Marcos Alguacil Gil
PROYECTO FIN DE CARRERA
Tutor: Eloy Javier Mata Sotés
Curso 2011-2012
© El autor© Universidad de La Rioja, Servicio de Publicaciones, 2012
publicaciones.unirioja.esE-mail: [email protected]
Padelink: portal social para un club de padel, trabajo fin de estudiosde Marcos Alguacil Gil, dirigido por Eloy Javier Mata Sotés (publicado por la Universidad
de La Rioja), se difunde bajo una LicenciaCreative Commons Reconocimiento-NoComercial-SinObraDerivada 3.0 Unported.Permisos que vayan más allá de lo cubierto por esta licencia pueden solicitarse a los
titulares del copyright.
UNIVERSIDAD DE LA RIOJA
Facultad de Ciencias, Estudios Agroalimentarios e Informática
PROYECTO FIN DE CARRERA
Ingeniería Técnica en Informática de Gestión
Introducción 8
Documento de Objetivos del Proyecto 10
Antecedentes 11
Objetivos 11
Descripción 11
Alcance 12
Arquitectura física 12
EDT y Estimaciones de Tiempo 13
Gestión – Dirección del Proyecto 14
Análisis 15
Diseño 16
Construcción 17
Estimaciones Globales 18
Diagrama de Gantt 18
Justificaciones Tecnológicas 20
Riesgos 21
Análisis 24
Identificación de Requisitos 25
Descripción 26
Glosario de Términos 28
Roles 28
Requisitos 29
Identificación de Casos de Uso 32
Introducción 33
Casos de uso 33
Usuarios 33
Administración 35
Identificación de Clases 38
Introducción 39
Clases que modelen los datos y soporten sus operaciones 39
Clases para el control de los procesos 40
Identificación del Plan de Pruebas 42
Introducción 43
Pruebas unitarias 43
Pruebas funcionales 43
Pruebas de seguridad 44
Diseño 46
Especificación de Casos de Uso 47
Introducción 48
Usuarios 48
Administración 60
Diseño de Interfaces 66
Esquema general de la aplicación 67
Interfaz pública de usuario 69
Interfaz privada de administrador 79
Diseño de Base de Datos 85
Esquemas conceptual y lógico 86
Notas sobre el framework de desarrollo 88
Tablas de la base de datos 89
Diseño de Clases 96
Arquitectura software del sistema 97
Diseño de los modelos 98
Esquema global de la arquitectura de modelos 98
Clases tipo en los modelos 99
Modelos del sistema 101
Clases complementarias de la lógica de negocio 121
Diseño de los controladores 126
Esquema global de la arquitectura de controladores 126
Controladores de la aplicación 127
Implementación 135
Introducción 136
Frameworks, tecnologías y SGBD 136
Requisitos de la aplicación 136
Ficheros de configuración 137
Symfony extendido y plugins 140
Plugins 141
Javascript 142
Puntos críticos en la aplicación 147
Tests 152
Pruebas unitarias 152
Pruebas funcionales 159
Gestión del proyecto 171
Anotaciones finales 176
Bibliografía y referencia 180
Anexo A. Actas de reunión 183
Anexo B. Guía de la aplicación 191
FIGURA 1. ARQUITECTURA FÍSICA DEL SISTEMA 12
FIGURA 2. ESTRUCTURA DE DESCOMPOSICIÓN DE TAREAS 13
FIGURA 3. DIAGRAMA DE HORAS ESTIMADAS 18
FIGURA 4. DIAGRAMA DE GANTT DE LA GESTIÓN-DIRECCIÓN DEL PROYECTO 18
FIGURA 5. DIAGRAMA DE GANTT DEL ANÁLISIS 19
FIGURA 6. DIAGRAMA DE GANTT DEL DISEÑO 19
FIGURA 7. DIAGRAMA DE GANTT DE LA CONSTRUCCIÓN 19
FIGURA 8. CASOS DE USO – ACCESO 48
FIGURA 9. CASOS DE USO – PERFIL Y CUENTA DE USUARIO 50
FIGURA 10. CASOS DE USO – AGENDA 52
FIGURA 11. CASOS DE USO – RESERVAS 53
FIGURA 12. CASOS DE USO – PARTIDOS 55
FIGURA 13. CASOS DE USO – COMPETICIONES 56
FIGURA 14. CASOS DE USO – AMIGOS 57
FIGURA 15. CASOS DE USO – MENSAJES 59
FIGURA 16. CASOS DE USO – ADMINISTRACIÓN USUARIOS 60
FIGURA 17. CASOS DE USO – ADMINISTRACIÓN COMPETICIONES 61
FIGURA 18. CASOS DE USO – ADMINISTRACIÓN PISTAS 63
FIGURA 19. ESQUEMA GENERAL DE LA INTERFAZ DE LA APLICACIÓN 67
FIGURA 20. VENTANAS MODALES Y SUBPROCESOS 68
FIGURA 21. INTERFAZ – ACCESO, REGISTRO Y RECUPERACIÓN DE CONTRASEÑA 69
FIGURA 22- INTERFAZ – PÁGINA DE INICIO 69
FIGURA 23. INTERFAZ – CUENTA DE USUARIO: INFORMACIÓN PERSONAL Y DISPONIBILIDAD 70
FIGURA 24. INTERFAZ – CUENTA DE USUARIO: PRIVACIDAD Y PREFERENCIAS 71
FIGURA 25. INTERFAZ – AGENDA 72
FIGURA 26. INTERFAZ – RESERVAS: LISTADO DE RESERVAS 72
FIGURA 27. INTERFAZ – RESERVAS: PROCESOS CREACIÓN, APLAZAMIENTO, CANCELACIÓN 73
FIGURA 28. INTERFAZ – EVENTOS: LISTADO DE PARTIDOS Y COMPETICIONES 73
FIGURA 29. INTERFAZ – EVENTOS: TABLÓN Y DETALLES DE PARTIDO 74
FIGURA 30. INTERFAZ – EVENTOS: PROCESO DE CREACIÓN DE PARTIDOS Y MODIFICACIÓN DE RESULTADO 74
FIGURA 31. INTERFAZ – EVENTOS: TABLÓN, CLASIFICACIÓN Y LISTADO DE PARTIDOS DE COMPETICIÓN 75
FIGURA 32. INTERFAZ – AMIGOS: LISTADO DE AMIGOS Y PETICIONES 76
FIGURA 33. INTERFAZ – VISTA DEL PERFIL DE OTRO USUARIO 76
FIGURA 34. INTERFAZ – BUSCADOR DE AMIGOS 77
FIGURA 35. INTERFAZ – SUGERENCIAS EN BUSCADOR DE AMIGOS 77
FIGURA 36. INTERFAZ – MENSAJES: LISTADO DE MENSAJES 78
FIGURA 37. INTERFAZ – MENSAJES: ENVÍO DE MENSAJE 78
FIGURA 38. INTERFAZ PRIVADA – USUARIOS: LISTADO DE USUARIOS 79
FIGURA 39. INTERFAZ PRIVADA – USUARIOS: FICHA DE USUARIO 79
FIGURA 40. INTERFAZ PRIVADA – RESERVAS: LISTADO DE RESERVAS 80
FIGURA 41. INTERFAZ PRIVADA – COMPETICIONES: LISTADO DE COMPETICIONES 80
FIGURA 42. INTERFAZ PRIVADA – COMPETICIONES: FICHA DE COMPETICIÓN Y SOLICITUDES DE PARTICIPACIÓN 81
FIGURA 43. INTERFAZ PRIVADA – COMPETICIONES: PARTICIPANTES/PAREJAS Y PARTIDOS 82
FIGURA 44. INTERFAZ PRIVADA – PISTAS: LISTADO DE PISTAS Y FICHA DE PISTA 83
FIGURA 45. DISEÑO DE BASE DE DATOS – ESQUEMA CONCEPTUAL 86
FIGURA 46. DISEÑO DE BASE DE DATOS – ESQUEMA LÓGICO 87
FIGURA 47. DISEÑO DE CLASES – PATRÓN MVC 97
FIGURA 48. DISEÑO DE CLASES – ESQUEMA GENERAL DE LOS MODELOS CON DOCTRINE/SYMFONY 98
FIGURA 49. DISEÑO DE CLASES – ESQUEMA DE CLASES OBJETO DEL MODELO USER 99
FIGURA 50. DISEÑO DE CLASES – ESQUEMA DE CLASES TABLA DEL MODELO USER 100
FIGURA 51. DISEÑO DE CLASES – ESQUEMA DE MODELOS DE TIPO OBJETO DE LA APLICACIÓN 101
FIGURA 52. DISEÑO DE CLASES – ESQUEMA DE CLASES DE PAGO 121
FIGURA 53. DISEÑO DE CLASES – CLASE ABSTRACTA PAYMENTGATEWAY 122
FIGURA 54. DISEÑO DE CLASES – ESQUEMA DE CLASES DE COMPETICIONES 123
FIGURA 55. DISEÑO DE CLASES – CLASE ABSTRACTA COMPETITIONENGINE 124
FIGURA 56. DISEÑO DE CLASES – ESQUEMA GLOBAL DE CONTROLADORES Y EN SYMFONY Y EN LA APLICACIÓN 126
FIGURA 57. DISEÑO DE CLASES – ESQUEMA DE CONTROLADORES DE LA APLICACIÓN 126
FIGURA 58. IMPLEMENTACIÓN – PROCESO DE PAGO DE RESERVA CON PAYPAL 147
FIGURA 59. GESTIÓN DEL PROYECTO – DIAGRAMA DE REPARTICIÓN DE LA CARGA DE TRABAJO 172
FIGURA 60. GESTIÓN DEL PROYECTO – DIAGRAMA DE HORAS REALES 173
FIGURA 61. GESTIÓN DEL PROYECTO – DIAGRAMA DE COMPARACIÓN DE HORAS ESTIMADAS Y REALES 173
8
9
10
11
12
Figura 1. Arquitectura física del sistema
Internet HTTP serverSGBD server
Gecko
Trident
Webkit
Presto
13
Figura 2. Estructura de descomposición de tareas
14
15
16
17
18
Figura 3. Diagrama de horas estimadas
Figura 4. Diagrama de Gantt de la Gestión-Dirección del Proyecto
19
Figura 5. Diagrama de Gantt del Análisis
Figura 6. Diagrama de Gantt del Diseño
Figura 7. Diagrama de Gantt de la Construcción
20
21
22
23
24
25
26
27
28
29
-
-
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
Figura 8. Casos de uso – Acceso
admin usuario
registro login logout
recuperar contraseña
<extends>
49
50
Figura 9. Casos de uso – Perfil y cuenta de usuario
admin usuario
publicar comentario
modificar perfil
modificar disponib.
modificar contraseña
modificar privacidad
modificar email
51
52
Figura 10. Casos de uso – Agenda
admin usuario
visualizar agenda
53
Figura 11. Casos de uso – Reservas
admin usuario
reservar pista
pagar reserva
aplazar reserva
cancelar reserva
<extends>
visualizar reserva
listar reservas
54
55
Figura 12. Casos de uso – Partidos
admin usuario
crear partido
modificar partido
visualizar partido
listar partidos
comentar partido
56
Figura 13. Casos de uso – Competiciones
admin usuario
enviar solicitud
visualizar torneo
listar torneos
57
Figura 14. Casos de uso – Amigos
admin usuario
solicitar amistad
aceptar amistad
rechazar amistad
bloquear usuario
buscar usuarios
visualizar perfil
listar amigos
comentar usuario
58
59
Figura 15. Casos de uso – Mensajes
admin usuario
enviar mensaje
leer mensaje
eliminar mensaje
listar mensajes
60
Figura 16. Casos de uso – Administración Usuarios
admin
crear usuario
modificar usuario
bloquear usuario
visualizar usuario
listar usuarios
61
Figura 17. Casos de uso – Administración Competiciones
admin
crear torneo
gestionar partidos
listar torneos
visualizar torneo
añadir participantes
procesar solicitudes
realizar emparejam.
62
63
Figura 18. Casos de uso – Administración Pistas
admin
establecer horarios establecer
estado
visualizar pista
listar pistas
64
65
66
67
Figura 19. Esquema general de la interfaz de la aplicación
Inicio Agenda Reser vas Eventos Mensajes Amigos M i cuenta SalirBuscar
M arcos Alguacil
Novedades
Gust avo Lizasoain
Part ido mañana a las 19:30 en la pist a 6
Coméntaselo al mundo
Raúl Ochoa
Part ido del t orneo Unir ioja el Viernes a las 12:00 en la pist a 2
Daniel Pertegaz
Daniel Jorge
Jesús Erasovs.Amigos
Añade t us amigos desde ot ras redes sociales
Not icias
Not icia de prueba Hoy
Not icia de prueba que pasa de línea Ayer
Not icia que paso hace var ios días 7 Julio
Ver mas
Ver mas
Ofertas
Oferta de 2x1 Hasta 31 de Diciembre
Ofert a invit a a t u amigo Hasta 15 de Diciembre
Ver mas
Barra de menúElemento activo
Elemento del menú Buscador
Columna izquierdaColumna central Columna derecha
68
Figura 20. Ventanas modales y subprocesos
amigo
mensaje
Enviar
Enviar mensaje
Conf irmar
Cancelar reser va
¿esta seguro de que desea cancelar la reser va realizada para el 12 Febrero, 16:00 en la Pist a 6 durante 60 minutos ?
Cualquier part ido ligado a esta reser va será eliminado. Cancelar
Titulo de la ventana
Acciones
Contenido
69
Figura 21. Interfaz – Acceso, registro y recuperación de contraseña
Figura 22- Interfaz – Página de inicio
Inicio Agenda Reser vas Eventos Mensajes Amigos M i cuenta SalirBuscar
M arcos Alguacil
Novedades
Gust avo Lizasoain
Part ido mañana a las 19:30 en la pist a 6
Coméntaselo al mundo
Raúl Ochoa
Part ido del t orneo Unir ioja el Viernes a las 12:00 en la pist a 2
Daniel Pertegaz
Daniel Jorge
Jesús Erasovs.Amigos
Añade t us amigos desde ot ras redes sociales
Not icias
Not icia de prueba Hoy
Not icia de prueba que pasa de línea Ayer
Not icia que paso hace var ios días 7 Julio
Ver mas
Ver mas
Ofertas
Oferta de 2x1 Hasta 31 de Diciembre
Ofert a invit a a t u amigo Hasta 15 de Diciembre
Ver mas
70
Figura 23. Interfaz – Cuenta de usuario: Información personal y disponibilidad
Inicio Agenda Reser vas Eventos Mensajes Amigos M i cuenta SalirBuscar
Información personal
Pr ivacidad
Preferencias de la cuenta
Datos personales
Domicilio
Nombre
Apellidos
7 7 1985Fecha nacimiento
sexo Hombre Mujer
Localidad
Dirección
Codigo postal
Guardar
Horar io de disponibilidad
Guardar
Disponibilidad
Información personal
Pr ivacidad
Preferencias de la cuenta
Disponibilidad dias Ent re semana Fines de semana
per iodo M añanas Tardes
horas
X
D
S
M
L
J
121109 13 15 17 19 2010 14 16 18
V
Foto de perf il
Cambiar f oto
71
Figura 24. Interfaz – Cuenta de usuario: Privacidad y preferencias
Información personal
Pr ivacidad
Preferencias de la cuenta
Email de la cuenta
Nuevo email
Cont raseña
Email act ual [email protected]
Cont raseña de la cuenta
Nueva cont raseña
Repet ir nueva cont raseña
Cont raseña act ual
Estado de la cuenta
Desact ivar cuenta
Pr ivacidad
Ver mi perf il Solo mis amigos
Enviarme mensajes Todo el mundo
Invit arme a part idos Amigos de mis amigos
Ver mis próximos part idos Nadie
Guardar
Inf ormación personal
Pr ivacidad
Preferencias de la cuenta
Disponibilidad
Disponibilidad
Guardar
Guardar
72
Figura 25. Interfaz – Agenda
Figura 26. Interfaz – Reservas: Listado de reservas
Inicio Agenda Reser vas Eventos Mensajes Amigos M i cuenta SalirBuscar
Calendar io
Filt ro
Reser vas Enf rentamientos Part idos de t orneos
Agenda de reser vas y part idos
Lunes M artes M iércoles Jueves Sábado Domingo
09:00
10:00
11:00
12:00
13:00
14:00
15:00
16:00
17:00
18:00
reser va
reser va
Semana del 8 al 14 de Febrero
Viernes
part ido
Febrero 2010
M X J V S DL
2 3 4 5 6 719 10 11 13 14816 17 18 19 20 211523 24 25 26 27 2822
12
Inicio Agenda Reser vas Eventos Mensajes Amigos M i cuenta SalirBuscar
Filt ro
Reser vas Reser vas de part idos
Mis reser vasHacer nueva reser va
Act ivas
Pasadas
10 Febrero, 17:30
Pista 4 9 Febrero, 15:30
Reser va cancelada
Reser va realizada para el 9 Febrero, 15:30 con una duración de 90 minutos en la Pist a 4
9 Febrero, 13:12
8 Febrero, 11:42
Ver mas
Pista 4 6 Febrero, 16:00
Reser va aplazada para el 6 Febrero, 16:00 con una duración de 60 minutos en la Pista 4
Reser va realizada para el 5 Febrero, 16:30 con una duración de 90 minutos en la Pist a 1
5 Febrero, 14:25
5 Febrero, 10:58
Est a reser va está ligada a un part ido
Pista 2 7 Febrero, 11:00
Reser va realizada para el 7 Febrero, 11:00 con una duración de 60 minutos en la Pista 2 6 Febrero, 12:25
opciones «
opciones «
aplazarcancelar
60 minutos
60 minutos
Cancelada
73
Figura 27. Interfaz – Reservas: Procesos creación, aplazamiento, cancelación
Figura 28. Interfaz – Eventos: Listado de partidos y competiciones
Pagar
Pagar reser va
Paypal
Google Checkout
VisaM astercard
selecciona una f orma de pago:
f orma de pago seleccionada: Tar jet a de crédito
Su reser vá se guardará durante 15 minutos. Si durante ese t iempo el pago no es realizado, la reser va será cancelada de f orma automát ica.
Conf irmar
Cancelar reser va
¿esta seguro de que desea cancelar la reser va realizada para el 12 Febrero, 16:00 en la Pista 6 durante 60 minutos ?
Cualquier part ido ligado a esta reserva será eliminado. Cancelar
1
pista
Conf irmar
Reser var pista / Aplazar reser va
2no disponible
3no disponible
6
5no disponible
4
fecha 20 Febrero hora9 am 19 pm
16:00 17:00 18:00
16:30 18:00
90'
60'
17:00
t u reser va: 90 minutos en la pista 4 el 20 Febrero a las 18:00
Inicio Agenda Reser vas Eventos Mensajes Amigos M i cuenta SalirBuscar
Part idos
Compet iciones
Part idos
Compet iciones
Filt ro
Part idos propios De torneos y ligas
Filt ro
En las que compito En las que no compito
Sin comenzar
Mis part idos
7 Febrero, 12:00 en pista 2
Tu compañero es Daniel Pertegaz
Liga Unir ioja
Tus adversar ios son Raúl Ochoa y Gustavo Lizasoaín
12 Febrero, 11:30 en pist a 4
Tu compañero es Jesús Eraso
Torneo Per itos
Tus adversar ios son Adr ián Gómez y Daniel Jorge
14 Febrero, 18:30 en pista 4
Tu compañero es Gustavo Lizasoaín
Part ido libre
Tus adversar ios son Daniel Jorge y Daniel Pertegaz
18 Febrero, 17:00 en pist a 1
Tu compañero es Daniel Pertegaz
Part ido libre
Tus adversar ios son Raúl Ochoa y Álvaro Valero
Torneos y ligas del club
Liga Unir iojaComienza en 25 días
Inscr ibirse
Inscr ipción hast a 15 Febrero60 plazas
Torneo Per itos
Solicit ud enviada
Comienza mañana
36 plazas Inscr ipción cer rada
Torneo ITIG insideComenzó hace 25 días
Inscr ipción cerrada22 parejas inscr it as
Liga Regular
No llegaste a t iempo
Finalizó hace un mes
32 parejas inscr it asInscr ipción cer rada
¡Part icipas en este torneo!
Crear nuevo part ido
Crear nuevo part ido
74
Figura 29. Interfaz – Eventos: Tablón y detalles de partido
Figura 30. Interfaz – Eventos: Proceso de creación de partidos y modificación de resultado
Inicio Agenda Reser vas Eventos Mensajes Amigos M i cuenta SalirBuscar
Liga Unir ioja
Pat rocinadores
Universidadde La Rioja
Tablón
Detalles del part ido
¿Algo que comentar sobre el part ido?
Ult imos comentar ios
Gustavo LizasoainVamos a ganar !
Adr ián GómezVeremos en la pist a quien es el mejor...
Ayer a las 11:40
Ayer a las 12:05
Liga Unir ioja
Pat rocinadores
Universidadde La Rioja
Tablón
Detalles del part ido
Part icipantes
Result ado
Datos de reser va asociados
Raúl Ochoa
Daniel Pertegaz
Daniel Jorge
Jesús Eraso
Modif icar
El part ido se jugará el Sabado 13, 12:00 en la pista 3
Cancelar Aplazar
El result ado t odavía no ha sido establecido.
Establecer result ado
part icipantes
Crear part ido
Datos de creación / modif icación del part ido
Yovs.
seleccionar cont r incante 2
seleccionar pareja
seleccionar cont r incante 1
set 1
Conf irmar
Establecer result ado del part ido
G. LizasoainD. Pertegaz
R. OchoaÁ. Valero
Result ado f inal 2-1 Ganaron Gustavo Lizasoaín y Daniel Pertegaz
set 2 set 3
6 4 6
4 6 3
75
Figura 31. Interfaz – Eventos: Tablón, clasificación y listado de partidos de competición
Inicio Agenda Reser vas Eventos Mensajes Amigos M i cuenta SalirBuscar
Tablón de notas, act ividad y novedadesTablón
Clasif icación
Part idos
Liga Unir ioja
Pat rocinadores
Universidadde La Rioja
Part icipantes y clasif icación del torneoTablón
Clasif icación
Part idos
Liga Unir ioja
Pat rocinadores
Universidadde La Rioja
Gustavo LizasoainDaniel Pertegaz
Jug Gan Perd
Raúl OchoaÁlvaro Valero
Adr ián GomezDaniel Foronda
3 1 9
2 2 8
2 1 6
Pareja Ptos
4
4
3
Inscr ipciones abiert as hasta el 15 de Febrero.Premios #1 · 700 € #2 · 500 € #3 · 350 € #4 · 250 €
Hace 20 días
las inscr ipciones han sido cerradas, se han inscr ito 71 part icipantes.
Hace 2 días
Los emparejamientos han sido realizados, compet irán 38 parejas.
Ayer, 16:40
Part idos de la ligaTablón
Part idos
Liga Unir ioja
Pat rocinadores
Universidadde La Rioja
Clasif icación
Gustavo LizasoainDaniel Pertegaz
Raúl OchoaÁlvaro Valero
Sabado 12 Febrero
vs.
Adr ián GómezDaniel Foronda
Jesús ErasoDaniel Jorgevs.
En Pist a 1 a las 09:00
En Pist a 2 a las 09:00
76
Figura 32. Interfaz – Amigos: Listado de amigos y peticiones
Figura 33. Interfaz – Vista del perfil de otro usuario
Inicio Agenda Reser vas Eventos Mensajes Amigos M i cuenta SalirBuscar
AmigosMis amigos
Pet iciones de amistad Gustavo LizasoainEstella, Navarra
Adr ián GómezLogroño, La Rioja
Ver mas
Enviar mensajeBloquear amigo
AmigosMis pet iciones de amistad
Pet iciones de amistad
hace 2 minutos
Enviar mensajeBloquear amigo
hace 25 minutos
Acept ar amist ad
Álvaro ValeroLogroño, La Rioja
Daniel ForondaLogroño, La Rioja
Hoy , 15:45
Ayer, 22:56
Rechazar amistad
Acept ar amist adRechazar amistad
Inicio Agenda Reser vas Eventos Mensajes Amigos M i cuenta SalirBuscar
Gust avo Lizasoaín
Novedades
¿Algo que decir le a Gustavo?
Raúl Ochoa
Part ido del t orneo Unir ioja el Viernes a las 12:00 en la pist a 2
Daniel Pertegaz
Daniel Jorge
Jesús Erasovs.
Adr ián Gómez
Perdió 1-2 ayer en la pist a 4 a las 17:00
Amigos
Ver mas
Próximos part idos
Part ido Liga Unir iojaM añana, 16:30
Part ido Torneo Per itosSabado 14, 10:00
28 años, ChicoEstella, Navarra
77
Figura 34. Interfaz – Buscador de amigos
Figura 35. Interfaz – Sugerencias en buscador de amigos
Inicio Agenda Reser vas Eventos Mensajes Amigos M i cuenta SalirBuscar
Gente encont rada con "python"
Michel PalinShef f ield, England
Graham ChapmanLeicester, England
Ver mas
Enviar mensaje Añadir como amigo
Añadir como amigo
John CleeseWeston-Super-M are, England
Enviar mensaje Añadir como amigo
Terry GilliamMinneapolis, EEUU
Enviar mensaje Añadir como amigo
Er ic IdleDurham, England
Añadir como amigo
Terr y JonesColwyn Bay, England
Añadir como amigo
Filt ro
Sexo Hombre Mujer
Edadde 18 a 42
Nivel
Localidad
1 5
Gustavo Lizasoain
Jesús Eraso
aso
78
Figura 36. Interfaz – Mensajes: Listado de mensajes
Figura 37. Interfaz – Mensajes: Envío de mensaje
Inicio Agenda Reser vas Eventos Mensajes Amigos M i cuenta SalirBuscar
Bandeja de ent rada
Bandeja de ent rada
Enviar
Jesús Eraso Ayer, 11:46
Lorem ipsum dolor sit amet, consectet ur adipiscing elit. Nam iaculis, sem et eleifend rhoncus,
orci f elis f r ingilla ante, vel congue lorem quam ut ante.
Class aptent t acit i sociosqu ad lit ora t orquent per conubia nost ra, per inceptos himenaeos.
Suspendisse mollis aliquet quam ut lobort is.
Yo Ayer, 10:15
Raúl Ochoa
Ver mas
Enviados
Escr ibir nuevo mensaje
8 Febrero, 09:01
opciones «Jesús Eraso archivareliminar
Archivados
amigo
mensaje
Enviar
Enviar mensaje
mensaje
Enviar
Enviar mensaje a Gustavo Lizasoaín
79
Figura 38. Interfaz privada – Usuarios: Listado de usuarios
Figura 39. Interfaz privada – Usuarios: Ficha de usuario
Inicio Agenda Reser vas Eventos Mensajes Amigos M i cuenta Salir AdminBuscar
Usuar ios
Torneos y ligas
Crear nuevo usuar io
PistasSexo Hombre Mujer
Edadde 18 a 42
Nivel
1 5
Michel Palin Graham [email protected] [email protected]
John Cleese Terry [email protected] [email protected]
Er ic Idle Terry [email protected] t [email protected]
Usuar ios
Reser vas
Estadist icas globales
Filt ro
Ficha de usuar io Datos personales de M ichael Palin
Estadíst ica del usuar io
Inicio Agenda Reser vas Eventos Mensajes Amigos M i cuenta Salir AdminBuscar
Nombre
Fecha nacimiento
Localidad
Dirección
Codigo postal
Sexo Hombre
Guardar
7 de Julio de 1985
M arcos Alguacil Gil
Pradejon
Or iente, 29
26510
Datos de la cuenta de usuar io
Tipo de cuent a Usuar io
Estado de la cuenta Act iva
Foto de perf il
Limpiar imagen
80
Figura 40. Interfaz privada – Reservas: Listado de reservas
Figura 41. Interfaz privada – Competiciones: Listado de competiciones
Inicio Agenda Reser vas Eventos Mensajes Amigos M i cuenta Salir AdminBuscar
Usuar ios
Torneos y ligas
Hacer nueva reser va
PistasHora
Pista
FIlt rarReser vas de pistas
Reser vas
Est adist icas globales
6 Febrero, 16:00 en Pista 4 por Terr y Gilliam opciones «
6 Febrero, 16:00 en Pist a 2 por Er ic Idle opciones
6 Febrero, 16:30 en Pist a 3 por Ter ry Gilliam opciones
6 Febrero, 17:00 en Pist a 6 por Ter ry Gilliam opciones
9 am 19 pm
Pista 1Aplazamiento: 6 Febrero, 16:00 - 60' en Pista 4
Reser va: 5 Febrero, 16:30 - 60' en Pista 1
5 Febrero, 14:25
5 Febrero, 10:58
Reserva pagada con Paypal y ligada a part ido
Inicio Agenda Reser vas Eventos Mensajes Amigos M i cuenta Salir AdminBuscar
Usuar ios
Torneos y ligas
Crear nueva compet ición
Pistas
Tipo
Año
FIlt rarTorneos y ligas del club
Reser vas
Est adist icas globales2010
Liga Unir iojaEn espera
20/ 60 plazas
Torneo Per itosAct ivo
36/ 36 plazas
Torneo ITIG insideAct ivo
22 parejas
Liga RegularFinalizado
32 parejas
Torneo Liga
81
Figura 42. Interfaz privada – Competiciones: Ficha de competición y solicitudes de participación
Ficha de compet ición
Solicit udes
Inicio Agenda Reser vas Eventos Mensajes Amigos M i cuenta Salir AdminBuscar
Datos de Liga Unir ioja
Mensajes del t ablón
Formato
Nº de subscr ipciones
Nombre
Guardar
32
Enviar
Subscr ipciones automát icas
Part icipantes y parejas
Part idos
Sí No
Subscr ipción parejas Sí No
Los emparejamientos han sido realizados, compet irán 38 parejas.
Ayer, 16:40
20 02 2010Fecha limite subscr ipción
Ficha de compet ición
Solicit udes
Solicit udes de part icipación en Liga Unir ioja
Liga ida y vuelta
Michel Palin
Graham Chapman
John Cleese
Terry Gilliam
Er ic Idle
Terr y Jones
Cartel del evento
Cambiar cartel
Categoría M asculino
Estadíst icas de la liga
Part icipantes y parejas
Part idos
Estadíst icas de la liga
Enviada el 20 f ebrero 16:45
Enviada el 20 f ebrero 16:45
Enviada el 20 f ebrero 16:45
Enviada el 20 f ebrero 16:45
Enviada el 20 f ebrero 16:45
Enviada el 20 f ebrero 16:45
Pet ición acept ada
Pet ición autoacept ada
Pet ición autoacept ada
Pet ición autoacept ada
opciones «aceptarrechazar
opciones «
82
Figura 43. Interfaz privada – Competiciones: Participantes/Parejas y partidos
Ficha de compet ición
Solicit udes
Part icipantes de Liga Unir ioja
Michel Palin
Graham Chapman Ter ry Gilliam
Er ic IdleTerry Jones
Creación de parejas
Selecciona dos part icipantes y pulsa el botón "Crear pareja"
Crear pareja
Part icipantes y parejas
Part idos
Est adíst icas de la liga
John Cleeseopciones «
opciones «
desemparejarmodif icar
Añadir part icipante
Pulsa "Añadir usuar io" para añadir un nuevo part icipante
Añadir usuar io
o pulsa "Sortear parejas" y realiza un emparejamiento aleaator io
Sortear parejas
Ficha de compet ición
Solicit udes
Part idos de Liga Unir ioja Rondas
Part icipantes y parejas
Part idos
Estadíst icas de la liga
Todavía no se han sorteado los part idos
Sortear part idos
El f ormato de esta compet ición es Liga a un solo part ido.
Pulsa para crear las rondas y sus part idos correspondientes.
Ficha de compet ición
Solicit udes
Próxima ronda de Liga Unir ioja Rondas
Part icipantes y parejas
Part idos
Estadíst icas de la liga
Ronda 1
Ronda 2
Ronda 3
Michel PalinJohn Cleese
Er ic IdleTerr y Jones
Crear part idoG. LizasoainD. Pertegaz
Jesús ErasoDaniel Jorge
20 Febr. 09:00Pist a 1 Suger ir f echas
Pulsa "Suger ir fechas" para crear los part idos automát icamente.
83
Figura 44. Interfaz privada – Pistas: Listado de pistas y ficha de pista
Ficha de pista
Estadist icas de pist a
Inicio Agenda Reser vas Eventos Mensajes Amigos M i cuenta Salir AdminBuscar
Inicio Agenda Reser vas Eventos Mensajes Amigos M i cuenta Salir AdminBuscar
Usuar ios
Torneos y ligas
Crear nueva pista
Pistas
Pistas del club
Reser vas
Est adist icas globales
Pist a 1Tipo: 60'
Estado: 20% libre
Pista 2Tipo: 90'
Estado: 60% libre
Pista 3Tipo: 60'
Est ado: 20% libre
Pista 4Tipo: 60'
Estado: 35% libre
Pista 5Tipo: 60'
Est ado: En mantenimiento
Pista 6Tipo: 90'
Estado: 10% libre
Datos de la Pista 1
Horas reser vadas para uso del club
Tipo de pista
Estado
Nombre
Información ext ra
Guardar
Act iva
60 minutos
121109 13 15 17 19 2010 14 16 18
Guardar
84
85
86
Figura 45. Diseño de Base de Datos – Esquema conceptual
iden
tifier
«ke
y»em
ail
pass
wor
dle
vel
first
_nam
ese
cond
_nam
ebi
rth_d
ate
gend
erph
one
pict
ure
addr
ess_
hom
ead
dres
s_to
wn
addr
ess_
zip
addr
ess_
stat
eac
coun
t_st
atus
acco
unt_
type
user
iden
tifier
«ke
y»cr
eate
d_at
cont
ent
mes
sage
show
_pro
file
show
_mat
ches
rece
ive_
mes
sage
sin
vite
_mat
ches
{wea
k}pr
ivac
y
iden
tifier
«ke
y»da
te_t
ime
from
_tim
eto
_tim
em
inut
esis
_pos
tpon
edis
_can
cele
dis
_pai
dpa
ymen
t_m
etho
dpa
ymen
t_co
depa
ymen
t_am
ount
crea
ted_
atup
date
d_at
rese
rvat
ion
iden
tifier
«ke
y»na
me
min
utes
is_a
ctiv
ein
form
atio
n
cour
t
loca
l_re
sult
away
_res
ult
mat
ch_n
umbe
rdu
ratio
nro
und
was
_mat
ch_c
ompl
eted
{wea
k}m
atch
set_
num
ber «
parti
al k
ey»
loca
l_ga
mes
away
_gam
estim
e
{wea
k}re
sult_
deta
il
iden
tifier
«ke
y»te
am
poin
tspl
ayed
won
lost
drawclas
sific
atio
nfriend
**
parent
child
*0.
.1
*fro
m1
*to
1 11
1
*
1
iden
tifier
«ke
y»cr
eate
d_at
cont
ent
com
men
t fro
m
1 mat
ch_c
omm
ent
user
_com
men
t
com
petit
ion_
com
men
t
iden
tifier
«ke
y»ty
peca
tego
ryna
me
vaca
ncie
sis
_aut
omat
icda
te_l
imit
year
post
erst
atusco
mpe
titio
n
*
1 *
1*
1
*
*
2* *
{dis
join
t, to
tal}
1
*
*
iden
tifier
«ke
y»st
atus
crea
ted_
at
requ
est
is_p
endi
ngis
_acc
epte
dis
_lef
t_ac
tive
is_r
ight
_act
ive
rela
tions
hip
iden
tifier
«ke
y»w
eek_
day
from
_tim
eto
_tim
e
avai
labi
lity
user
_ava
ilabi
lity
cour
t_av
aila
bilit
y
{disjoint, total}
«ide
ntify
ing»
*1
* 1
parent
child
*
0..1
1*
«ide
ntify
ing»
from
_is_
dele
ted
stat
e
to_i
s_re
aded
to_i
s_de
lete
d
stat
e
0..1
0..1
1«i
dent
ifyin
g»
*2
is_n
otifi
edis
_vie
wed
type
«pa
rtial
key
»cr
eate
d_at
«pa
rtial
key
»
{wea
k}ac
tivity
1
*«i
dent
ifyin
g»
*
1
*
1
com
men
t_ac
tivity
mat
ch_a
ctiv
ity
requ
est_
activ
ity
1
*
*
*
1
87
Figura 46. Diseño de Base de Datos – Esquema lógico
com
petit
ion_
iden
tifier
team
_ide
ntifi
erco
mpe
titio
n_te
ampo
ints
play
edw
onlo
stdr
aw
min
utes
nam
eis
_act
ive
iden
tifier
info
rmat
ion
cour
t
iden
tifier
team
left_
user
_ide
ntifi
errig
ht_u
ser_
iden
tifier
loca
l_ga
mes
away
_gam
esm
atch
_ide
ntifi
erm
atch
_res
ult_
deta
iltim
ese
t_nu
mbe
r
rese
rve_
iden
tifier
loca
l_te
am_i
dent
ifier
away
_tea
m_i
dent
ifier
loca
l_re
sult
away
_res
ult
mat
chco
mpe
titio
n_id
entifi
er to_u
ser_
iden
tifier
iden
tifier
com
men
tco
nten
tfro
m_u
ser_
iden
tifier
crea
ted_
atto
_mat
ch_i
dent
ifier
to_c
ompe
titio
n_id
entifi
er
user
addr
ess_
tow
nad
dres
s_ho
me
addr
ess_
zip
addr
ess_
stat
eid
entifi
erm
ail
pass
wor
dle
vel
first
_nam
ese
cond
_nam
ebi
rth_d
ate
gend
erph
one
acco
unt_
stat
usac
coun
t_ty
pepi
ctur
e
type
crea
ted_
atis
_not
ified
user
_ide
ntifi
eris
_vie
wed
activ
ity
show
_mat
ches
show
_pro
file
user
_ide
ntifi
erpr
ivac
yre
ceiv
e_m
essa
ges
invi
te_m
atch
es
from
_tim
ew
eek_
day
iden
tifier
avai
labi
lity us
er_i
dent
ifier
cour
t_id
entifi
erto
_tim
e
is_p
endi
ngrig
ht_u
ser_
iden
tifier
left_
user
_ide
ntifi
erre
latio
nshi
pis
_acc
epte
dis
_lef
t_ac
tive
is_r
ight
_act
ive
from
_is_
dele
ted
iden
tifier
pare
nt_i
dent
ifier
mes
sage
from
_use
r_id
entifi
erto
_use
r_id
entifi
erto
_is_
read
edto
_is_
dele
ted
cont
ent
crea
ted_
atrequ
est_
iden
tifier
mat
ch_i
dent
ifier
com
men
t_id
entifi
er
com
petit
ion_
iden
tifier
user
_ide
ntifi
erco
mpe
titio
n_re
ques
tcr
eate
d_at
stat
usid
entifi
er
iden
tifier
type
cate
gory
nam
eva
canc
ies
is_a
utom
atic
date
_lim
itye
arco
mpe
titio
npo
ster
stat
us
mat
ch_n
umbe
rro
und
dura
tion
was
_mat
ch_c
ompl
eted
iden
tifier
crea
ted_
atm
inut
esis
_pos
tpon
edpa
rent
_ide
ntifi
erco
urt_
iden
tifier
user
_ide
ntifi
er
rese
rvat
ion
paym
ent_
met
hod
paym
ent_
code
is_c
ance
led
date
_tim
efro
m_t
ime
to_t
ime
upda
ted_
atis
_pai
d
paym
ent_
amou
nt
88
89
90
91
92
93
94
95
96
97
Figura 47. Diseño de Clases – Patrón MVC
Servidor
Internet
Controlador
Modelo
Vista
RespuestaPetición
Cliente
98
Figura 48. Diseño de Clases – Esquema general de los modelos con Doctrine/Symfony
BaseModelo
Modelo
ModeloTable
Doctrine_Table
sfDoctrineRecord
Con herencia de tablas
BaseModeloHeredado
ModeloHeredado
Doctrine_Record
ModeloTableHeredado
99
Figura 49. Diseño de Clases – Esquema de clases Objeto del modelo User
+getIdentifier(): Integer+getEmail(): String...+getAvailability(): Doctrine_Collection+getPrivacyConfiguration(): Privacy
+identifier: Integer+email: String...+availability: Doctrine_Collection+privacy_configuration: Privacy
BaseUser
+getFullName(): String+isEnabledToReserveAt($date: Integer, $hour: Float, $duration: Integer): Boolean
User
100
Figura 50. Diseño de Clases – Esquema de clases Tabla del modelo User
_getInstance(): UserTable_addActiveUsersQuery(query: Doctrine_Query): Doctrine_Query..._getFriendsOfQuery(user_idenitfier: Integer): Doctrine_Query
UserTable
101
Figura 51. Diseño de Clases – Esquema de modelos de tipo Objeto de la aplicación
User
Availability
Comment
MatchComment
CompetitionComment
UserComment
Reservation
Match
Privacy
Court
Relationship
CompetitionRequest
Team
CompetitionTeam
UserAvailability
CourtAvailability
MatchResultDetail
Competition
Activity
CommentActivity
MatchActivity
RequestActivity
102
getFullName(trim_to_length: int): string
getPicture(size: string): string
getExcludeMeQuery(): Doctrine_Query
getProfileCommentsQuery(): Doctrine_Query
getFriendRelationsipsQuery(like_value: string): Doctrine_Query
getRequestRelationshipsQuery(): Doctrine_Query
getLockedRelationshipsQuery(): Doctrine_Query
getActiveReservationsQuery(): Doctrine_Query
getPastReservationsQuery(): Doctrine_Query
getActiveMatchesQuery(): Doctrine_Query
getPastMatchesQuery(): Doctrine_Query
getFriendUsersQuery(): Doctrine_Query
getActivityQuery(): Doctrine_Query
+getFullName(trim_to_length)+getPicture(size)+getExcludeMeQuery()+getProfileCommentsQuery()+getFriendRelationshipsQuery(like_value)+getRequestRelationshipsQuery()+getLockedRelationshipsQuery()+getActiveReservationsQuery()+getPastReservationsQuery()+getActiveMatchesQuery()+getPastMatchesQuery()+getFriendUsersQuery()+getActivityQuery()+getRelationshipWith(user_identifier)+canReserveAt(date, hour, duration)+isActive()+isAdmin()+deleteAccount()
User
BaseUser
103
getRelationshipWith(user_identifier: int): Relationship
canReserveAt(timestamp: date, hour: float, duration: int): bool
isActive(): bool
isAdmin(): bool
deleteAccount(): void
get(identifier: int): User
findNotDeletedUserBy(field: string, value:
mixed): User
addNotDeletedUsersQuery(query:
Doctrine_Query): Doctrine_Query
addActiveUsersQuery(query: Doctrine_Query): Doctrine_Query
addExcludeUserFromQuery(user_identifier: int, query: Doctrine_Query): Doctrine_Query
addExcludeLockerUsersFromQuery(user_identifier: int, query: Doctrine_Query):
Doctrine_Query
_get(identifier)_findNotDeletedUserBy(field, value)_addNotDeletedUserQuery(query)_addActiveUsersQuery(query)_addExcludeUserFromQuery(user, query)_addExcludeLockerUsersFromQuery(user, query)_createLikeFilterQueryPart(like_value, like_fields, query)_addNameOrEmailFilterQuery(like_value, query, alias)_addNameFilterQuery(like_value, query, alias)_addLevelFilterQuery(level, query)_addGenderFilterQuery(gender, $query)_addAgeFromFilterQuery(age_from, $query)_addAgeToFilterQuery(age_to, query)_addLocalityFilterQuery(locality, query)_addFriendsOfFilterQuery(user_identifier, query)
UserTable
BaseUserTable
104
createLikeFilterQueryPart(like_value: string, like_fields: array, alias: string):
Array
addNameOrEmailFilterQuery(like_value: string, query: Doctrine_Query, alias: string):
Doctrine_Query
addNameFilterQuery(like_value: string, query: Doctrine_Query, alias: string):
Doctrine_Query
addLevelFilterQuery(level: int, query: Doctrine_Query): Doctrine_Query
addGenderFilterQuery(gender: int, query: Doctrine_Query): Doctrine_Query
addAgeFromFilterQuery(age_from: int, query: Doctrine_Query): Doctrine_Query
addAgeToFilterQuery(age_to: int, query: Doctrine_Query): Doctrine_Query
addLocalityFilterQuery(locality: string, query: Doctrine_Query): Doctrine_Query
addFriendsOfFilterQuery(user_identifier: int, query: Doctrine_Query): Doctrine_Query
105
get(user_identifier: int): Privacy
getRelatedUserFor(user_identifier: int): User
canBeAutoAcceptedFor(user_identifier: int): bool
canBeRequestedAsFriend(): bool
canRequestBeDecided(): bool
canBeDeleted(): bool
getScope(): int
isLocked(): bool
isFriend(): bool
isFriendOfFriend(): bool
isAbleToViewProfile(user_identifier: int): bool
isAbleToSendMessages(user_identifier: int): bool
_get(user_identifier)PrivacyTable
BasePrivacy Table
+getRelateduserFor(user_identifier)+canBeAutoAcceptedFor(user_identifier)+canBeRequestedAsFriend()+canRequestBeDecided()+canBeDeleted()+getScope()+isLocked()+isFriend()+isFriendOfFriend()+isAbleToViewProfile(user_identifier)+isAbleToSendMessages(user_identifier)+isAbleToInviteMatches(user_identifier)+isAbleToViewMatches(user_identifier)+setAsUnlockedFor(user_identifier)+setAsLockedFor(user_identifier)+acceptAsFriend()+refuseAsFriend()+requestAsFriendBy(user_identifier)
Relationship
Base Relationship
106
isAbleToInviteMatches(user_identifier: int): bool
isAbleToViewMatches(user_identifier: int): bool
setAsUnlockedFor(user_identifier: int): void
setAsLockedFor(user_identifier: int): void
acceptAsFriend(): void
refuseAsFriend(): void
requestAsFriendBy(user_identifier: int): void
get(left_user_identifier: int,
right_user_identifier: int): Relationship
getRelationshipQuery(): Doctrine_Query
addRelationshipForQuery(left_user_identifier: int, right_user_identifier: int,
query: Doctrine_Query): Doctrine_Query
addActiveRelationshipsQuery(query: Doctrine_Query): Doctrine_Query
_get(left_user, right_user)_getRelationshipQuery()_addRelationshipForQuery(left_user, right_user, query)_addActiveRelationshipsQuery(query)_addIsUnlockedRelationshipQuery(query)_addIsFriendRelationshipQuery(query)_addIsRequestedRelationshipQuery(query)_getFriendOfFriendQuery(left_user, right_user)
RelationshipTable
BaseRelationshipTable
107
addIsUnlockedRelationshipQuery(query: Doctrine_Query): Doctrine_Query
addIsFriendRelationshipQuery(query: Doctrine_Query): Doctrine_Query
addIsRequestedRelationshipQuery(query: Doctrine_Query): Doctrine_Query
getFriendOfFriendQuery(left_user_identifier: int, right_user_identifier: int):
Doctrine_Query
isUserFromTeam(user_identifier: int): bool
getAverageLevel(): float
get(identifier: int): Team
getTeamsQuery(): Doctrine_Query
addTeamUserQuery(user_identifier: int, query: Doctrine_Query): Doctrine_Query
gerOrCreateTeam(left_user_identifier: int, right_user_identifier: int): Team
+isUserFromTeam(user_identifier)+getAverageLevel()
Team
BaseTeam
_get(identifier)_getTeamsQuery()_addTeamUserQuery(user, query)_getOrCreateTeam(left_user, right_user)
TeamTable
BaseTeamTable
108
getSummary(trim_to_length: int): string
getConversationLength(): int
getConversationMessages(): Doctrine_Collection<Message>
isConversation(): bool
isReadedBy(user_identifier: int): bool
isUserFromConversation(user_identifier: int): bool
updateAsReadedBy(user_identifier: int): void
addChildMessageFrom(user_identifier: int, content: string): void
get(conversation_identifier: int,
user_identifier: int): Conversation
getMessagesQuery(): Doctrine_Query
addConversationQuery(conversation_identifier: int, query: Doctrine_Query):
Doctrine_Query
+getSummary(trim_to_length)+getConversationLength()+getConversationMessages()+isConversation()+isReadedBy(user_identifier)+isUserFromConversation(user_identifier)+updateAsReadedBy(user_identifier)+addChildMessageFrom(user_identifier, content)
Message
BaseMessage
_get(conversation, user)_getMessagesQuery()_addConversationQuery(conversation, query)_addMessagesOfConversationQuery(conversation, query)_addUserConversationQuery(user, query)_addUnreadedMessagesForUserQuery(user, query)_getInboxConversationsQuery(user)_getSentConversationsQuery(user)_setConversationReadedBy(conversation, user)
MessageTable
BaseMessageTable
109
addMessagesOfConversationQuery(conversation_identifier: int, query: Doctrine_Query):
Doctrine_Query
addUserConversationQuery(user_identifier: int, query: Doctrine_Query):
Doctrine_Query
addUnreadedMessagesForUserQuery (user_identifier: int, query: Doctrine_Query):
Doctrine_Query
getInboxConversationsQuery(user_identifier: int): Doctrine_Query
getSentConversationsQuery(user_identifier: int): Doctrine_Query
setConversationReadedBy(conversation_identifier: int, user_identifier: int): void
110
getSavingState(): int
setSavingState(saving_state: int): void
getPaymentGateway(): PaymentGateway
setPaymentGateway(gateway: PaymentGateway): void
getDate(): string
getLastChild(): Reservation
getUniqueCode(): string
getPostponedDateTime(): Timestamp
getReservationList(): Doctrine_Collection<Reservation>
getTotalPaidAmount(): float
getTotalAmountToPay(): float
getAmountToPay(): float
getUnpaidAmount(absolute: bool): float
+getSavingState()+setSavingState(state)+getPaymentGateway()+setPaymentGateway(gateway)+getDate()+getLastChild()+getUniqueCode()+getPostponedDateTime()+getReservationList()+getTotalPaidAmount()+getTotalAmountToPay()+getAmountToPay()+getUnpaidAmount(absolute)+hasChildReservations()+hasParentReservation()+isMatch()+isPostponable()+isCancelable()+isModifiable()+cancel()+chargePayment()+saveWithTransaction(conn)_isValidDayHour(day, hour)_isValidDuration(duration)_isValidDayHourAndDuration(day, hour, duration)
Reservation
BaseReservation
111
hasChildReservations(): bool
hasParentReservation(): bool
isMatch(): bool
isPostponable(): bool
isCancelable(): bool
isModifiable(): bool
cancel(): void
chargePayment(): void
saveWithTransaction(con: Doctrine_Connection): void
isValidDayHour(day: int, hour: float): bool
isValidDuration(duration: int): bool
isValidDayHourAndDuration(day: int, hour: float, duration: int): bool
112
get(identifier: int): Reservation
getValidReservationsWhereClause(alias: string):
string
getReservationsQuery(): Doctrine_Query
getParentReservationsQuery(): Doctrine_Query
buildRealDateTimeSubQuery(alias: string, subquery_alias: string): string
addActiveReservationsQuery(query: Doctrine_Query): Doctrine_Query
addPastReservationsQuery(query: Doctrine_Query): Doctrine_Query
addReservationQuery(identifier: int, query: Doctrine_Query): Doctrine_Query
addReservationsUserQuery(user_identifier: int, query: Doctrine_Query):
Doctrine_Query
addCodeFilterQuery(unique_code: string, query: Doctrine_Query): Doctrine_Query
addUserFilterQuery(search: string, query: Doctrine_Query): Doctrine_Query
_get(identifier)_getValidReservationsWhereClause(alias)_getReservationsQuery()_getParentReservationsQuery()_buildRealDateTimeSubQuery(alias, subquery_alias)_addActiveReservationsQuery(query)_addPastReservationsQuery(query)_addReservationQuery(identifier, query)_addReservationsUserQuery(user_identifier, query)_addCodeFilterQuery(unique_code, query)_addUserFilterQuery(search, query)_addStatusFilterQuery(status, query)_addCourtFilterQuery(court, query)_getReservationFor(identifier, user_identifier)
ReservationTable
BaseReservationTable
113
addStatusFilterQuery(status: int, query: Doctrine_Query): Doctrine_Query
addCourtFilterQuery(court_identifier: int, query: Doctrine_Query): Doctrine_Query
getReservationFor(identifier: int, user_identifier: int): Reservation
getWinnerTeam(): Team
getLoserTeam(): Team
getTeamFor(user_identifier: int): Team
getOpponentTeamFor(user_identifier: int): Team
getPartnerFor(user_identifier: int): User
getCompetitors(): Doctrine_Collection<User>
getReceivedCommentsQuery(): Doctrine_Query
+getWinnerTeam()+getLoserTeam()+getTeamFor(user_identifier)+getOpponentTeamFor(user_identifier)+getPartnerFor(user_identifier)+getCompetitors()+getReceivedCommentsQuery()+hasCompetition()+isResultAvailable()+isResultEditableFor(user_identifier)+isVisibleFor(user_identifier)+isUserFromMatch(user_identifier)+areTeamsEditableFor(user_identifier)+addTeam(team_identifier)
Match
BaseMatch
114
hasCompetition(): bool
isResultAvailable(): bool
isResultEditableFor(user_identifier: int): bool
isVisibleFor(user_identifier: int): bool
isUserFromMatch(user_identifier: int): bool
areTeamsEditableFor(user_identifier: int): bool
addTeam(team_identifier: int): bool
get(match_identifier: int): Match
getMatchesQuery(): Doctrine_Query
addMatchByIdQuery(identifier: int, query: Doctrine_Query): Doctrine_Query
addMatchesForQuery(user_identifier: int, query: Doctrine_Query): Doctrine_Query
_get(reservation_identifier)_getMatchesQuery()_addMatchByIdQuery(match_identifier, query)_addMatchesForQuery(user_identifier, query)_addNotCanceledMatchesQuery(query)_addActiveMatchesQuery(query)_addPastMatchesQuery(query)_getNotCanceledMatch(identifier)
MatchTable
BaseMatchTable
115
addNotCanceledMatchesQuery(query: Doctrine_Query): Doctrine_Query
addActiveMatchesQuery(query: Doctrine_Query): Doctrine_Query
addPastMatchesQuery(query: Doctrine_Query): Doctrine_Query
getNotCanceledMatch(match_identifier: int): Match
get(identifier: int): Court
addAvailableCourtsForQuery(date: string,
hour: float, duration: int, query:
Doctrine_Query): Doctrine_Query
getCourtsAvailabilityAt(date: string, hour: float): Doctrine_Query
getOneAvailableCourtAt(date: string, hour: float, duration: int): Court
_get(identifier)_addAvailableCourtsForQuery(date, hour, duration, query)_getCourtsAvailabilityAt(date, hour)_getOneAvailableCourtAt(date, hour, duration)
RelationshipTable
BaseCourt Table
116
isDeletableBy(user_identifier: int): bool
get(identifier: int): Comment
addUserCommentsQuery(query: Doctrine_Query): Doctrine_Query
addMatchCommentsQuery(query: Doctrine_Query): Doctrine_Query
BaseUser CommentTable
BaseComment Table
BaseMatch CommentTable
BaseCompetition CommentTable
_addUserCommentsQuery(query)UserCommentTable
_addMatchCommentsQuery(query)UserCommentTable
_addCompetitionCommentsQuery(query)CompetitionCommentTable
_get(identifier)CommentTable
+isDeletableBy(user_identifier)Comment
BaseComment
117
addCompetitionCommentsQuery(query: Doctrine_Query): Doctrine_Query
getYear(): int
getPoster(size: string): string
isOpen(): bool
isClosed(): bool
isActive(): bool
isFinished(): bool
isQualifier(): bool
isAutomatedSubscriptionEnabled(): bool
isUserInCompetition(user_identifier: int): bool
isTeamInCompetition(team_identifier: int): bool
+getYear()+getPoster(size)+isOpen()+isClosed()+isActive()+isFinished()+isQualifier()+isAutomatedSubscriptionEnabled()+isUserInCompetition(user_identifier)+isTeamInCompetition(team_identifier)+canMatchesBeDrawn()+getUserRequest(user_identifier)+getReceivedCommentsQuery()+getMatchesQuery()+getRequestsQuery()+getParticipantsQuery()+getParticipantsWithoutTeam()+getMatchByNumber(match_number)+getRankingTeams()+addParticipant(user_identifier)+addUserRequest(user_identifier)+createTeam(left_user, right_user)+removeTeam(team_identifier)+getNumberOfRounds()+drawTeams()+drawMatches()+suggestMatchesDates()+getMatchesForRound(round_number)+getNextQualifingMatch(match)
Competition
BaseCompetition
118
canMatchesBeDrawn(): bool
getUserRequest(user_identifier: int): CompetitionRequest
getReceivedCommentsQuery(): Doctrine_Query
getMatchesQuery(): Doctrine_Query
getRequestsQuery(): Doctrine_Query
getParticipantsQuery(): Doctrine_Query
getParticipantsWithoutTeam(): Doctrine_Collection<CompetitionRequest>
getMatchByNumber(match_number: int): Match
getRankingTeams(): Doctrine_Collection<Team>
addParticipant(user_identifier: int): CompetitionRequest
addUserRequest(user_identifier: int): CompetitionRequest
createTeam(left_user_identifier: int, right_user_identifier: int): void
removeTeam(team_identifier: int): void
119
getNumberOfRounds(): int
drawTeams(): void
drawMatches(): void
suggestMatchesDates(): void
getMatchesForRound(round_number: int): Doctrine_Collection<Match>
getNextQualifingMatch(match: Match): Match
get(identifier: int): Competition
getCompetitionsQuery(): Doctrine_Query
getActiveCompetitionsQuery(): Doctrine_Query
getPastCompetitionsQuery(): Doctrine_Query
addNameFilterQuery(name: string, query: Doctrine_Query): Doctrine_Query
addTypeFilterQuery(type: int, query: Doctrine_Query): Doctrine_Query
_get(identifier)_getCompetitionsQuery()_getActiveCompetitionsQuery()_getPastCompetitionsQuery()_addNameFilterQuery(name, query)_addTypeFilterQuery(type, query)_addYearFilterQuery(year, query)_getCompetitionYears()
CompetitionTable
BaseCompetitionTable
120
addYearFilterQuery(year: int, query: Doctrine_Query): Doctrine_Query
getCompetitionYears(): array
isAccepted(): bool
isPending(): bool
isRefused(): bool
get(identifier: int): CompetitionRequest
getCompetitionRequestsQuery(): Doctrine_Query
getUnpairedRequestsQuery(): Doctrine_Query
+isAccepted()+isPending()+isRefused()
CompetitionRequest
BaseCompetitionRequest
_get(identifier)_getCompetitionRequestsQuery()_getUnpairedRequestsQuery()
CompetitionRequestTable
BaseCompetitionRequestTable
121
Figura 52. Diseño de Clases – Esquema de clases de pago
Reservation <<interface>>PaymentGateway
PaymentGatewayFactory
ConcretePaymentGateway
usa
crea
pide objeto
122
Figura 53. Diseño de Clases – Clase abstracta PaymentGateway
retrieveGatewayUrl(): string
doPayment(): string
loadReturnParameters(request: sfWebRequest): void
isConfirmable(): bool
create(type: string): PaymentGateway
+setGatewayConfiguration(key, value)+getGatewayConfiguration(key)+setPaymentDetail(key, value)+getPaymentDetail(key)+setTransactionPrice(price)+setTransactionName(name)+setTransactionDescription(description)+setToken(token)+getToken(token)retrieveGatewayUrl()doPayment()loadReturnParameters(request)isConfirmable()
<<abstract>>PaymentGateway
_create(type)PaymentGatewayFactory
123
Figura 54. Diseño de Clases – Esquema de clases de competiciones
Competition <<interface>>CompetitionEngine
CompetitionEngineFactory
ConcreteCompetitionEngine
usa
crea
pide objeto
<<interface>>CompetitionAction
DrawMatches
<<interface>>CompetitionAction
DrawTeams
<<interface>>CompetitionAction
QualifierRuling
<<interface>>CompetitionAction
SuggestDates
ConcreteCompetitionActionDrawMatches
ConcreteCompetitionActionDrawTeams
ConcreteCompetitionActionQualifierRuling
ConcreteCompetitionActionSuggestDates
124
Figura 55. Diseño de Clases – Clase abstracta CompetitionEngine
setCalculateNumberOfRoundsAction(action: CompetitionActionCalculateNumberOfRounds):
void
setDrawTeamsAction(action: CompetitionActionDrawTeams): void
setDrawMatchesAction(action: CompetitionActionDrawMatches): void
setSuggestDatesAction(action: CompetitionActionSuggestDates): void
setQualifierRulingAction(action: CompetitionActionQualifierRuling): void
performCalculateNumberOfRounds(number_of_participants: int): int
performDrawTeams(competition: Competition): void
performDrawMatches(competition: Competition): void
+setCalculateNumberOfRoundsAction(action)+setDrawTeamsAction(action)+setDrawMatchesAction(action)+setSuggestDatesAction(action)+setQualifierRulingAction(action)+performCalculateNumberOfRounds(number_of_participants)+performDrawTeams(competition)+performDrawMatches(competition)+performSuggestDates(competition)+performIsQualifier()+performCalculateNextQualifingMatch(match)
-calculateNumberOfRoundsAction-drawTeamsAction-drawMatchesAction-suggestDatesAction-qualifierRulingAction
<<abstract>>CompetitionEngine
125
performSuggestDates(competition: Competition): void
performIsQualifier(): bool
performCalculateNextQualifingMatch(match: Match): Match
create(type: string): CompetitionEngine
+calculateNumberOfRounds(number_of_participants)
<<interface>>CompetitionActionCalculateNumberOfRounds
+drawMatches(competition)
<<interface>>CompetitionActionDrawMatches
+drawTeams(competition)
<<interface>>CompetitionActionDrawTeams
+isQualifier()+calculateNextQualifingMatch(match)
<<interface>>CompetitionActionQualifierRuling
+suggestDates(competition)
<<interface>>CompetitionActionSuggestDates
_create(type)CompetitionEngineFactory
126
Figura 56. Diseño de Clases – Esquema global de controladores y en Symfony y en la aplicación
Figura 57. Diseño de Clases – Esquema de controladores de la aplicación
basePadelclubActionssfActions baseReservation
Actions
sfAction sfComponent
sfComponents
basePadelclubActions
Search Actions
Security Actions
Account Actions
Agenda Actions
MessageActions
CommentActions
People Actions
Home Actions
Admin Actions
AdminCourt Actions
AdminCompetitionActions
AdminUser Actions
Event Actions
baseReservationActions
ReservationActions
AdminReservationActions
127
setJsonResponse(is_success: bool, message: string,
data: array): void
setJsonResponseMessage(message: string): void
setJsonResponseData(data: array): void
setJsonResponseSuccess(message: string): void
setJsonResponseFailed(message: string): void
isJsonRequest(): bool
getAppUser(): User
storeReservationOnMemory(reservation:
Reservation): void
fetchReservationFromMemory(): Reservation
cleanStoredReservation(also_clean_match: bool): void
+setJsonResponse(is_success, message, data)+setJsonResponseMessage(message)+setJsonResponseData(data)+setJsonResponseSuccess(message)+setJsonResponseFailed(message)+isJsonRequest()+getAppUser()
-is_success-message-data-request_type
basePadelclubActions
+storeReservationOnMemory(reservation)+fetchReservationFromMemory()+cleanStoredReservation(also_clean_match)+processReservationFor(user)
baseReservationActions
128
processReservationFor(user: User): Reservation
executeLogin()executeLogout()executeRegister()executeRequestPassword()executeAuthorize()
securityActions
basePadelclubActions
executeIndex()executeViewActivity()
homeActions
basePadelclubActions
executeIndex()agendaActions
basePadelclubActions
129
executeViewPersonalInformation()executeViewAvailability()executeViewPrivacy()executeViewPreferences()executeViewPictureUpdater()executeViewDeleteAccount()executeUpdatePersonalData()executeUpdateAddress()executeUpdateAvailability()executeUpdatePrivacy()executeUpdateEmail()executeUpdatePassword()executeUpdateStatus()executeDeleteAccount()executeUpdatePicture()
accountActins
basePadelclubActions
executeViewFriends()executeViewRequests()executeViewLocked()executeViewProfile()executeUpdateLocking()executeSendRequest()executeAcceptRequest()executeCancelRequest()executeDeleteRelation()
peopleActions
basePadelclubActions
130
executeViewInbox()executeViewSent()executeViewConversation()executeViewSendMessage()executeResponseConversation()executeSendMessage()executeDeleteConversation()
message
basePadelclubActions
executeViewUserComments()executeViewMatchComments()executeViewCompetitionComments()executePostUserComment()executePostMatchComment()executePostCompetitionComment()executeDeleteComment()
commentActions
basePadelclubActions
executeViewUsers()executeViewFriends()executeViewUsersForAdmin()executeViewReservationsForAdmin()executeViewCompetitionsForAdmin()executeSuggestFriends()executeSuggestUsersForAdmin()
searchActions
basePadelclubActions
131
executeViewUserMatches()executeViewUserCompetitions()executeViewMatchBoard()executeViewMatchDetails()executeViewUpdateMatchParticipants()executeViewUpdateMatchResult()executeViewCreateMatch()executeViewCompetitionBoard()executeViewCompetitionRanking()executeViewCompetitionMatches()executeCreateMatch()executeUpdateMatchParticipants()executeUpdateMatchResult()executeCompetitionInscriptionRequest()
eventActions
basePadelclubActions
executeViewActive()executeViewPast()executeViewReservation()executeViewCreateReservation()executeViewPostponeReservation()executePostponeReservation()executeCancelReservation()executeFindAvailability()executeViewReservationPayment()executeViewWaitPaymentGateway()executeViewReservationResult()executeViewPaymentGatewayLoader()executeCheckout()executeTransactionReturn()executeTrasnsactionConfirmation()executeTransactionCancel()
reservationActions
baseReservationActions
132
executeIndex()adminActions
basePadelclubActions
executeIndex()executeViewEditUser()executeCreateUser()executeUpdatePersonalData()executeUpdateAccountData()executeCleanPicture()
adminUserActions
basePadelclubActions
executeIndex()executeViewEditCourt()executeCreateCourt()executeUpdateData()executeLoadAvailability()executeUpdateAvailability()
adminCourtActions
basePadelclubActions
133
executeIndex()executeViewCreateReservation()executeViewPostponeReservation()executeCreateReservation()executePostponeReservation()executeCancelReservation()executeChargeReservation()
adminReservationActions
basePadelclubActions
executeIndex()executeViewEditCompetition()executeViewRequests()executeViewParticipants()executeViewPosterUpdater()executeViewMatches()executeViewEditMatch()executeCreateCompetition()executeUpdateData()executeUpdatePoster()executeAcceptRequest()executeRefuseRequest()executeAddParticipant()executeCreateTeam()executeUnpairTeam()executeDrawTeams()executeDrawMatches()executeSuggestMatchesDates()executeUpdateMatrchContent()executeUpdateMatchResult()
adminCompetitionActions
basePadelclubActions
134
135
136
137
138
139
140
execute(filterChain)
initialize(options)
141
signIn()
signOut()
getAppUser()
render()
{ is_null: true,
content: <div>Contenido de la vista</div> }
142
var Match = function() {
return {
viewUserMatches: function(params) {
$.request({
url: '/event/viewUserMatches',
data: {filter: params.filter},
responseElement: 'user_matches',
responseAction: 'replace'
});
}
// Más métodos a continuación
}
}();
143
url
formId
hiddenId
searchOnFocus
onResultSelect
weekDays
minLength
144
url
groupSize
isEditable
year
month
day
weekDays
months
firstHour
lastHour
hourDivisions
divisionHeight
width
height
daySelections
maxHoursSelected
lightCurrentDay
hasNavigation
loadUrl
miniCalendarId
showSelectionInfo
toggleSelection
145
submenuElementId
width
height
acceptText
cancelText
previousText
acceptButton
cancelButton
previousButton
acceptAction
previousAction
afterLoad
overlay
auto
content
url
icon
closeOnAccept
autoClose
dataType
146
url
data
dataType
responseAction
responseElement
notifyAs
notifyElement
success
fail
147
Figura 58. Implementación – Proceso de pago de Reserva con Paypal
Selección reserva
Aplicación Pasarela de pago Paypal
Selección modo de pago Login
Confirmación inicio pago
1
2 3
45Procesamiento
respuesta
Inicia transacciónInserta reserva
Confirmación final pago6 7
8Procesamiento
respuesta
Actualiza reservaConfirma transacción9
Transacción BD
148
if (is_null($conn)) {
$conn = Doctrine_Manager::connection();
$conn->transaction->setIsolation('READ UNCOMMITTED');
$conn->beginTransaction();
}
if (is_null($this->identifier)) {
$query = "INSERT INTO " . $this->getTable()->getTableName() . "
(date_time, from_time, to_time, minutes, parent_identifier,
court_identifier, user_identifier, is_paid, payment_method, payment_code,
payment_amount, is_postponed, is_canceled, created_at, updated_at)
SELECT '$this->date_time', $this->from_time, $this->to_time,
$this->minutes, $parent_identifier, $this->court_identifier,
$this->user_identifier, '$this->is_paid', $this->payment_method,
'$this->payment_code', $this->payment_amount, '$this->is_postponed',
'$this->is_canceled', '$date', '$date' FROM DUAL WHERE";
$query .= ' EXISTS (' . $available_court_query->getSqlQuery() . ')';
if ($conn->exec($query, $available_court_params)) {
$this->assignIdentifier($conn->lastInsertId());
$this->saveWithTransaction($conn);
} else {
$this->saving_state = self::SAVING_STATE_TOO_LATE;
$conn->rollback();
$court = CourtTable::getOneAvailableCourtAt($this->date,
$this->from_time, $this->minutes);
if ($court) {
$conn->beginTransaction();
}
}
}
149
saveWithTransaction(conn)
else {
$this->payment_code = $this->getPaymentGateway()->doPayment();
$query = "UPDATE " . $this->getTable()->getTableName() .
" SET parent_identifier = $parent_identifier,
court_identifier = $this->court_identifier,
user_identifier = $this->user_identifier, is_paid = '$this->is_paid',
payment_method = $this->payment_method,
is_postponed = '$this->is_postponed', is_canceled = '$this->is_canceled',
payment_code = '$this->payment_code', updated_at = '$date'
WHERE identifier = $this->identifier";
if ($this->match->isValid()) {
$this->match->reservation_identifier = $this->identifier;
$this->match->save($conn);
}
$conn->exec($query);
$conn->commit();
$this->saving_state = self::SAVING_STATE_SUCCESS;
}
150
(
) (
)
s =
g =
S =
G =
W =
151
forward404 forward404If forward404Unless
$identifier = $request->getParameter('identifier');
$query = Doctrine_Query::create()
->from('User u')
->where('u.identifier = ?', array($identifier));
if (!$condition) {
if ($this->isJsonRequest()) {
throw new Padelclub404Exception();
}
parent::forward404Unless($condition, $message);
}
152
getFullName(length)
getPicture(size)
getExcludeMeQuery
getProfileCommentsQuery
getFriendRelationshipsQuery
getRequestRelationshipsQuery
getLockedRelationshipsQuery
153
getActiveReservationsQuery
getPastReservationsQuery
getActiveMatchesQuery
getPastMatchesQuery
getRelationshipWith(user)
isActive
isAdmin
isUserInTeam(user)
getAverageLevel
hasParentReservation
isMatch
isModifiable
isPostponable
getAmountToPay
getTotalAmountToPay
getTotalPaidAmount
getUnpaidAmount
hasChildReservations
getReservationList
154
isModifiable
isPostponable
getAmountToPay
getTotalAmountToPay
getTotalPaidAmount
getUnpaidAmount
getLastChild
getReservationList
hasParentReservation
isModifiable
isPostponable
getAmountToPay
getTotalAmountToPay
getTotalPaidAmount
cancel
isModifiable
155
getScope
exists
isValid
isLocked
isFriend
isFriendOfFriend
isAbleToViewProfile(user)
isAbleToSendMessage(user)
isAbleToInviteMatches(user)
isAbleToViewMatches(user)
getRelatedUserFor(user)
setAsLockedFor(user)
isLocked
isAbleToviewProfile(user)
isAbleToSendMessage(user)
isAbleToInviteMatches(user)
isAbleToViewMatches(user)
156
getSummary(length)
isConversation
getCOnversationlength
isReadedBy(user)
updateAsReadedBy(user)
isReadedBy(user)
isUserInConversation(user)
isUserInConversation(user)
isUserInConversation(user)
getConversationMessages
getCompetitors
isResultAvailable
getTeamFor(user)
getOpponentTeamFor(user)
157
getpartnerFor(user)
getReceivedCommentsQuery
isResultEditableFor(user)
areTeamsEditableFor(user)
isAutomatedSubscriptionEnabled
areSubsciptionsEnabled
addUserRequest(user)
addParticipant(user)
createTeam(user_a, user_b)
getNumberOfRounds
canMatchesBeDrawn
getReceivedCommentsQuery
getMatchesQuery
getRequestsQuery
getYear
158
getPoster(size)
getUserRequest(user)
isUserInCompetition(user)
isTeamInCompetition (user)
getRankingTeams
getParticipantsWithoutTeam
canTeamsBeDrawn
drawTeams
canMatchesBeDrawn
drawMatches
suggestMatchesDates
getUniqueId(param, to_num)
createNew
crypt(clear)
crypt(clear, crypted)
159
login
logout
register
requestPassword
viewUsers
viewFriends
suggestFriends
viewUsersForAdmin
viewReservationsForAdmin
viewCompetitionsForAdmin
160
suggestUsersForAdmin
viewUsersForAdmin
viewReservationsForAdmin
viewCompetitionsForAdmin
viewCompetitionsForAdmin
viewActive
viewPast
viewReservation
viewCreateReservation
findAvailability
viewReservationPayment
viewPostponeReservation
161
postponeReservation
cancelReservation
viewFriends
viewRequests
viewLocked
viewProfile
sendRequest
acceptRequest
cancelRequest
deleteRelation
162
updateLocking
viewInbox
viewSent
viewConversation
viewSendMessage
responseConversation
sendMessage
deleteConversation
163
index
viewActivity
viewUserMatches
viewUserCompetitions
viewMatchBoard
viewMatchDetails
viewCreateMatch
viewCompetitionBoard
viewCompetitionRanking
viewCompetitionMatches
viewUpdateMatch Participants
viewUpdateMatchResult
createMatch
164
updateMatchParticipants
updateMatchResult
competitionInscription Request
viewUserComments
viewMatchComments
viewCompetitionComments
postUserComment
postMatchComment
165
postCompetitionComment
index
updateStatus
viewPersonalInformation
updatePersonalData
updateAddress
viewAvailability
updateAvailability
viewPrivacy
updatePrivacy
viewPreferences
updateEmail
updatePassword
166
index
viewEditUser
createUser
updatePersonalData
updateAccountData
cleanPicture
index
viewEditCourt
createCourt
updateData
loadAvailability
167
updateAvailability
index
viewEditReservation
viewCreateReservation
viewPostponeReservation
createReservation
postponeReservation
chargeReservation
cancelReservation
index
viewEditCompetition
168
viewRequests
viewParticipants
viewMatches
viewEditMatch
viewPosterUpdater
createCompetition
updateData
acceptRequest
refuseRequest
addParticipant
createTeam
unpairTeam
169
drawTeams
drawMatches
suggestMatchesDates
170
171
172
Figura 59. Gestión del Proyecto – Diagrama de repartición de la carga de trabajo
173
Figura 60. Gestión del Proyecto – Diagrama de horas reales
Figura 61. Gestión del Proyecto – Diagrama de comparación de horas estimadas y reales
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217