TRABAJO FIN DE ESTUDIOS - Biblioteca de la Universidad de ... · PDF fileIdentificación...

Post on 05-Feb-2018

219 views 3 download

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: publicaciones@unirioja.es

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 marcos.alguacil@gmail.com

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 Chapmanmpalin@uk.com gchapman@uk.com

John Cleese Terry Gilliamjcleese@uk.com tgilliam@uk.com

Er ic Idle Terry Joneseidle@uk.com t jones@uk.com

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

*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

*

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

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