Tp - El Cumpleañero

Condiciones del TP //esto ya lo dijimos en clase pero siempre viene bien recordarlo

Terminos y Condiciones

El trabajo práctico se resuelve en grupos de 2 o 3 personas y se divide en 4 entregas (Arena, Angular, Wicket, Android) y cada una puede tener una o mas pre-entregas.Cada pre-entrega cuenta su nota de forma conceptual, esto ayuda a redondear sus notas a fin de cuatrimestre.

La entrega del trabajo práctico se realiza durante la clase: deben estar presentes todos los integrantes del grupo y contar con una pc (pueden usar las computadoras del laboratorio o bien usar sus maquinas personales) con el entorno instalado y el programa en estado ejecutable el día de la entrega.

Es obligatorio usar una herramienta de versionado de código, donde debe estar el desarrollo de todo el tp accesible tanto para los miembros del grupo como para los docentes de la materia. El grupo puede elegir que herramienta de versionado va a usar para resolver el trabajo práctico.

Les recomendamos que realicen el tp de forma incremental y desde la primer clase, no traten de dejarlo para ultimo momento porque lo mas probable es que no logren codificarlo siguiendo los conceptos de la materia y por ser interfaces una materia rodeada de "complejidades accidentales" derivadas de las tecnologías que usamos mientras antes nos encontremos con todos los inconvenientes que les pueden llegar a pasar mejor

Dominio del problema

Nos contaron hace tiempo de un problema que parece repetirse con frecuencia... llega el cumpleaños de alguien y todos tienen intenciones de regalarle algo y nadie lo regala o en el mejor de los casos... siempre se hace cargo la misma persona con lo que termina por aburrirse y es muy probable que no reciba regalo para su propio cumpleaños!

Entonces... para resolver todos esos gravísimos problemas es que vamos a ocuparnos de organizar todo con una única idea: Que cada uno reciba su regalo.

La idea en la que nos vamos a basar para resolver la situación es la de que cada uno le regala únicamente a una sola persona en todo el año, de esta forma es mas sencillo de planificar los regalos.

Para hacer la asignación de la forma mas equitativa (y menos problemática) posible nos vamos a basar en un sorteo, luego los resultados del sorteo van a estar disponibles de distintas formas.

Hacer el sorteo

El sorteo tiene reglas, algunas son configurables y otras son obligarias:

  • No te podés regalar a vos mismo (obligatoria)
  • No podés regalarle a alguien que cumple el mismo día que vos (configurable)
  • Evitar regalos cruzados (configurable). Esto sería por ejemplo, en un grupo donde están Adrián y Javier que Javier sea el encargado de regalarle a Adrián y Adrián a Javier. Indirectamente esto hace que no sea posible realizar un sorteo si solamente tenemos dos participantes del mismo.

Asimismo no todas las personas que están inscriptas en el sorteo participan del juego, con lo que si alguien no participa NO hay que asignarle alguien para reglar (ni es regalado por nadie).

Notificar participantes

Parte de la gracia del juego es que sea anónimo para casi todos (menos el encargado de verificar que todo marche sobre rieles), por lo que para facilitarle la vida vamos a necesitar poder ver la información de los resultados del sorteo de distintas formas.

Aplicación Desktop: con Arena

Dominio

Para este tp es necesario codificar todo aquello que sea necesario para realizar las acciones que se muestran en las vistas siguiendo con las reglas del sorteo.

Es necesario que se cuenten con tests unitarios de la aplicación.

Las pantallas que codifiquen DEBEN de ser representaciones de los mockups que se muestran en la sección pantallas. CUALQUIER modificación (que no sea de layouts) debe de ser consultada con los docentes.

Aclaración: Cuando hablamos de tests unitarios no hablamos de un porcentaje de cobertura específico, pero SI es necesario testear las principales funcionalidades del sistema: la realización del sorteo principalmente con sus variantes. Si tienen dudas consulten en clase sobre qué testear y de que forma, NO es recomendable abusar de los frameworks de mockeo de objetos (de hecho, por ser un dominio simple que no posee interacciones fuera del ambiente es muy poco probable que se requiera de estas herramientas en absoluto).

Sugerencia para resolver el tp

Les recomendamos codificar las pantallas en el siguiente orden:

  1. Resultados del sorteo (sin validaciones): pantalla 5
  2. Pantalla de inicio: pantalla 1
  3. Próximos cumples: pantalla 4
  4. Agregar validaciones a los resultados del sorteo (y a todo lo que sea necesario)
  5. Calendario de cumpleaños: pantalla 2
  6. Editar cumpleaños: pantalla 3

No les recomendamos dividirse las pantallas por integrante de grupo, si realizar mucho pair programing, especialmente en este tp donde cada pantalla tiene distinto grado de complejidad y muestra distintos conceptos de la materia.

Pantallas

Pantalla de inicio

El objetivo de esta pantalla es poder realizar las distintas acciones y navegar entre ellas.

En esta pantalla básicamente podemos ir hacia tres pantallas clickeando cada uno de los botones:

  • El botón Ver Calendario (2) nos lleva a la segunda pantalla: Calendario de Cumpleaños
  • El botón Editar Cumples (3) a la tercer pantalla: Editar
  • El botón Próximos (4) a la cuarta pantalla: Próximos

Esta ventana nunca debe cerrarse ya que sirve para navegar entre las distintas vistas.

Calendario de Cumpleaños

El objetivo de esta vista es la de poder tener un panorama general de los cumpleaños del año, acá se muestra toda la información agrupada mes a mes de las personas que cumplen años, no nos da información de quien es el responsable de realizar el regalo.

Editar

Desde esta vista podemos modificar (agregar, quitar, editar) la información de los participantes del sorteo.

De cada participante se sabe su nombre, su fecha de nacimiento y si participa o no en el juego.

A su vez y para que sea mas facil de controlar tambien se puede ver por cada persona a quien le toca realizarle el regalo el día de su cumpleaños y quien le debería de regalar. estos ultimos dos datos NO son editables y solo estan disponibles una vez que se realizó el sorteo, antes aparecen en blanco.

Desde esta pantalla se puede:

  • Navegar a la quinta pantalla (para realizar el sorteo) esta acción solo es posible si hay al menos 3 personas que quieran participar
  • Borrar una persona del juego, esto es posible una vez seleccionado un elemento de la tabla
  • Agregar un nuevo participante, que inmediatamente agrega una fila en la tabla y pueden ser completados los datos de las personas como una edición normal.

Próximos Cumpleaños

En esta vista podemos ver los cumpleaños que se vienen en el mes actual, es decir los cumpleaños del mes actual posteriores a la fecha actual.

También es posible preguntar por los cumpleaños de cualquier mes y año futuros.

Se espera que al seleccionar el año o el mes se modifiquen los datos que se ven en la grilla.

Sorteo

Desde esta vista se lleva a cabo el sorteo, al abrirse (si ya hay un resultado) se puede ver por cada participante (que decidió jugar) quien le regala y a quien le regala.

Desde esta vista también se puede "Volver a sortear".

Para realizar el sorteo se tienen en cuenta las personas que indicaron que participaban y aun no han cumplido años.

Si alguien ya cumplió sus años (y no había un resultado previo) no participa, en cambio si sí lo había ese resultado no cambia.Por ejemplo: Leila cumple los años el 17/01 si realizamos el sorteo el primero de marzo por primera vez Leila no participa del juego este año. En cambio si realizamos el sorteo el 5 de enero Leila si participa y si lo volvemos a realizar el 1 de marzo, entonces leila si participa pero no cambia ni quien le regala ni a quien le regala.

Desde esta vista tambien se pueden configurar los parametros del sorteo:

  • Si el cumpleañero puede o no regalarle a alguien el día de su cumpleaños
  • Si se permiten regalos cruzados

Aplicación Web: con Angular + XRest

Como tenemos una aplicación de escritorio que resuelve la totalidad de nuestros problemas, ahora nos comentaron que a los usuarios les resulta incomodo tener que instalarse el programa.

Pero como no saben si esto realmente va a funcionar, lo que nos pidieron es que hagamos una prueba para que se puedan tomar métricas e ir adicionando funcionalidad.

Por lo que tenemos que diseñar e implementar una single application moderna que permita:

  • Visualizar todos los participantes del juego
  • Crear un participante
  • Buscar participantes por nombre
  • Ver un calendario resumido que indique para cada mes quienes cumplen en ese mes
    • Permitir seleccionar una persona que cumple años en cualquier mes
  • Ver la información detallada de la persona seleccionada (en el calendario resumido):
    • Nombre de la persona
    • Fecha de Nacimiento
    • Día de cumpleaños
    • Persona que debe le regalala
    • Persona a la que le regala
    • Día y Mes de cumpleaños de la persona a la que le regalan
    • Cantidad de días que faltan para que cumpla años la persona a la que le regala
  • Ver un encabezado que indique el nombre de la aplicación
  • Tener un footer con los datos del equipo de desarrollo

Servicios a implementar

Se deben implementar los servicios que se detallan a continuación:

  • Conocer a los participantes, una lista con:
    • Identificador
    • Nombre del participante
  • Conocer el calendario de cumpleaños, una lista donde cada elemento es:
    • Mes
      • Lista con las personas que cumplen años, cada una tiene:
        • Nombre
        • Id
  • Conocer la información detallada de una persona
  • Crear un participante

No se pueden hacer modificaciones en los datos explicitados en los servicios (enviar mas información que la pedida, etc) sin consultar antes con los docentes de la materia.

Para implementar los servicios vamos a usar como tecnología XRest.

Pantalla

Para la vista es recomendable usar Bootstrap.

Aplicación Web server centered: con Wicket

Pantallas

Editar Cumpleaños - pantalla de inicio

Realizar Sorteo

Aplicación Mobile: con Android

Se deben usar los mismos servicios que creamos para la aplicación en Angular:

  • Obtener los nombres de los participantes
  • Obtener los detalles de un participante
  • Editar los datos de un participante

Pantallas

Recuperatorio

Angular

Se debe realizar usando como xRest como servicios y angular como vista la siguiente pantalla:

NOTA: Pueden reutilizarse los mismos servicios usados para la aplicación Android.