Tp - Planificador de Horarios

Dominio

El problema que tenemos que resolver parece bastante simple, al final solo queremos saber: ¿Quién viene a trabajar mañana?

Pero esto no es tan simple.

Como pasa muchas veces las personas están ocupadas y tienen restricciones horarias y las personas que dependen de mucho personal quieren poner a la persona adecuada en el momento justo.

Particularmente vamos a pensar en una empresa que trabaja con horarios variables y flexibles con lo cual completar un turno con gente no es tan sencillo.

Empleados

Un empleado es la persona que cubre un horario en nuestro local, de los empleados nos interesan varias cosas:

    • Su nombre
    • Su legajo
    • Su disponibilidad

Nombre: Se compone con el nombre y apellido de la persona

Legajo: Son letras o numeros (sin caracteres especiales o espacios), nos sirve para identificar a nuestros empleados ademas, es obligatorio asignar un numero de legajo a cada persona que trabaja en el local

Disponibilidad: Esto es lo mas importante de un empleado, nos dice especificamente que días puede ir a trabajar en que horarios. La disponibilidad se define a nivel semanal y no particular por fecha.

Restricciones horarias

Para un empleado es indispensable saber la disponibilidad en la que puede concurrir a trabajar.

La disponibilidad de cada empleado se indica por dia, en un día puede trabajar durante un intervalo de tiempo. Por ejemplo los Lunes de 9 a 20:00 hs.

Una persona puede ser asignada en una fecha puntual para ir a trabajar a pesar de que no tenga disponibilidad, esto pasa porque hay veces que si bien no tendria disponibilidad generalmente ese dia, por una excepción el empleado si puede ir a trabajar en el momento planificado. Por ejemplo Roque Rodriguez puede trabajar los días Miércoles de 8 a 14 unicamente porque despues tiene que ir a cursar, pero el 2 de abril es miercoles y es feriado, entonces puede trabajar en cualquier momento para este dia particular.

De tanto en tanto a las personas le surgen compromisos que convierten sus disponibilidades en estrictas, es decir que para una fecha en particular bajo ningún punto el empleado puede cubrir un turno.

Una restricción es siempre para una fecha (por ejemplo el Viernes 04 de Abril de 2014 Roque no puede trabajar). Cuando un empleado plantea una restricción para una fecha esta DEBE respetarse y no puede ser asignado.

Planificación

La planificación es una proyección para una fecha puntual donde decimos quienes deberían venir a trabajar en qué horarios ese día.

Para armar la planificación se tienen en cuenta muchos factores: empleados, disponibilidades, restricciones, etcetera, para darle un orden podemos pensar que armar una planificación lleva varios pasos:

  • Primero pensamos en asignaciones con el fin de decir quien deberia ir a trabajar a que hora, por lo que por cada asignación
    1. Definimos el turno, es decir indicamos desde que hora hasta que hora debería de trabajar alguien.
    2. Asignamos el Empleado
  • Una vez que armamos todas las asignaciones que queriamos para esa fecha (es decir terminamos la planificacion), publicamos el horario porque una vez que terminamos el sudoku de horarios hay que informarle a los empleados que dia y horario deben de ir a trabajar, para eso lo unico que importa es por cada empleado indicar hora de entrada y hora de salida.

Validaciones

Algo muy importante son las restricciones y validaciones que el sistema nos ayudará a hacer:

  • No se pueden aceptar disponibilidades de menos de 4 horas consecutivas
  • No se pueden hacer turnos de menos de 4 horas o mas de 8
  • No se puede asignar a un empleado con una restricción horaria para esa fecha
  • En caso de asignar un empleado en un momento que no tenga disponibilidad se nos tiene que indicar una advertencia pero no imposibilitarnos de asignarlo
  • No se puede asignar un mismo empleado en varios turnos horarios por mas que no se superpongan.

TP1 - Entrega 1 - Modelar el Dominio del problema

Para esta entrega se debe modelar el dominio y hacer las primeras pantallas.

Es indispensable contar con tests unitarios que prueben el programa.

No es necesario (pero si recomendable) hacer tdd para esta parte, lo importante es que el dominio esté testeado.

No es necesario implementar todas las pantallas que pide el tp pero para la primer entrega deben estar implementadas:

Les recomendamos que implementen las pantallas en este orden
  • Crear disponibilidad
  • Crear Restricción
  • Ver Restricciones
  • Crear/Editar empleado
  • Ver empleados

Después el resto de las pantallas en un orden sugerido:

  • Elegir acción (Ver empleados / Ver Restricciones / Planificaciones)
  • Ver el estado de las planificaciones de los días
  • Ver el horario para un día
  • Crear Asignación
  • Planificar una fecha

Algunos casos para ayudarlos a implementar:

  • Agregar disponibilidad a un empleado
    • (tener en cuenta):
      • La hora de fin no puede ser anterior a la de inicio
      • La disponibilidad no puede tener un rango menor a 4 horas
      • Los días no pueden repetirse
  • Agregar restricción para una persona para una fecha
  • Saber si para un periodo de tiempo el empleado tiene disponibilidad
  • Saber si un empleado ya fue asignado en una planificación
  • Saber si una asignación sobrepasa las 8 horas o es menor a 4 horas
  • Asignar un empleado para en una planificación
    • (tener en cuenta):
      • No se puede asignar una persona que ya fue asignada
      • No se puede asignar una persona que tiene una restriccion
      • Se puede asignar a una persona que no tiene disponibilidad

TP 1 - Especificación de la interfaz con Arena

La idea acá es mostrar como se puede mostrar la información, ordenando un poco el enunciado de una manera mas visual.

La interfaz es una sugerencia y no una restricción, de todos modos (y particularmente en el primer tp) las pantallas sugeridas no son al azar. Si quieren cambiarlas (todas o alguna) háblenlo con alguno de los docentes antes de codificarlo para ver si en Arena se puede implementar y si siguen usando los conceptos que queremos evaluar en el tp.

Ver Listado Empleados

Objetivo de la pantalla

Visualizar la lista de empleados, acceder a crear un nuevo empleado y eliminar uno existente.

Validaciones

No debería permitir que se elimine un empleado que tiene asignaciones en los días futuros.

Posible vista

Crear/Editar Empleado

Objetivo de la pantalla

Ver los detalles de un empleado, crear uno nuevo, editar uno existente.

Validaciones

  • Nombre, apellido y legajo son requeridos.
  • Al menos una disponibilidad.

Posible vista

Agregar Disponibilidad a Empleado

Objetivo de la pantalla

Cargar un día y horario de disponibilidad a un empleado dado.

Validaciones

No debe permitir agregar más de una disponibildiad con el mismo día de semana. Ej: si ya tengo "lunes de 9 a 18" no puedo crear una nueva disponibilidad el día lunes, no importa a qué hora.

Posible vista

Ver Restricciones (de todos los empleados)

Objetivo de la pantalla

Visualizar las restricciones cargadas en el sistema de todos los empleados. Acceso a crear una nueva restricción.

Posible vista

Agregar Restricción

Objetivo de la pantalla

Agregar una restricción, que involucra elegir a un empleado y una fecha. En dicha fecha el empleado no asistirá al trabajo

Posible vista

Ver el estado de las planificaciones de los días de la semana

Objetivo de la pantalla

Muestra el estado por cada día de la semana de la planificación, si está hecha o no.

Permite ver los horarios de la planificación de un día o crear/editar una planificación.

Aclaraciones

La semana arranca el Lunes y termina el domingo.

Por ejemplo la semana que comprende el miércoles 26 de Marzo va desde el Lunes 24 al domingo 30.

Navegación

Desde esta pantalla se puede ir a la pantalla de Planificar una fecha o a la pantalla de Ver el horario publicado para un día.

Validaciones

  • No se puede planificar para un día que ya pasó. Por ejemplo si hoy es 26/03 no podemos ni crear ni editar la planificación del 25/03.

Posible vista

Ver el horario publicado para un día

Objetivo de la pantalla

Mostrar para una planificación las asignaciones inidicando por cada una cuando inicia, cuando termina y quien la cubre.

Aclaraciones

Las asignaciones se muestran ordenadas por horario de entrada

Posible vista

Planificar una fecha

Objetivo de la pantalla

Definir para una fecha las personas asignadas para operar el local.

Poder crear o eliminar una asignación.

Aclaraciones

El día arranca a las 0 horas y termina a las 23.

Las asignaciones son de bloques de una hora.

Navegación

Desde esta pantalla se puede ir a la pantalla de Crear Asignación.

Posible vista

Crear una asignación

Objetivo de la pantalla

Permite definir la hora de inicio y la hora de fin de una asignación y seleccionar a un empleado que cubra la asignación.

Informa el estado de cada empleado para cubrir esa asignación.

Aclaraciones

Los empleados se muestran:

  • Primero los que pueden cumplir el horario por su disponibilidad y no fueron asignados anteriormente
  • Luego los que no podrían cubrir el horario porque hay algun problema entre el rango horarios y la dispobilidad declarada
  • Luego los que NO pueden ser asignados porque ya fueron asignados
  • Luego los que NO pueden ser asignados porque tienen alguna restricción para la fecha

Navegación

Desde esta pantalla se vuelve a la vista de Planificar una fecha.

Validaciones

  • El horario de fin de la asignacion debe ser posterior al de inicio
  • No se pueden hacer turnos de menos de 4 horas o mas de 8
  • No se puede asignar a un empleado con una restricción horaria para esa fecha
  • En caso de asignar un empleado en un momento que no tenga disponibilidad se nos tiene que indicar una advertencia pero no imposibilitarnos de asignarlo
  • No se puede asignar un mismo empleado en varios turnos horarios por mas que no se superpongan.

Posible vista

Si al presionar Asignar surge algún error se abre una pantalla explicando el motivo.

TP 2 - Angular + Play

Este es un tp breve, la idea es mostrar una aplicación chica explorando y empezando a mostrar una interfaz Web.

El servidor hay que desarrollarlo usando Play. El cliente debe estar escrito en Angulas JS.

Debe de implementarse una pantalla donde:

  • Se listen todas las planificaciones realizadas
  • Poder filtrar por rango de fechas
  • Seleccionar una planificación y que al hacerlo se vea el detalle del horario para ese día

La aplicación debe ser una Single Page Application.

Les dejamos una vista posible a modo de ejemplo:

TP 3 -Web con Wicket

Este tp consiste en implementar la misma funcionalidad que tenían en el TP1 usando una herrmienta web, particularmente Wicket.

Pueden usar los mismos modelos de pantalla que les dimos en el tp1 pero hay que repensar la navegación.

No es necesario que la aplicación sea single page, pero tampoco se puede abusar de los pop ups, por lo tanto luego de terminada una accion siempre debemos poder volver a donde estabamos antes o terminar en alguna pagina con sentido.

Por ejemplo luego de crear satisfactoriamente una asignación deberíamos de volver a la página donde se visualiza la planificación hecha hasta ahora.

TP 4 - Android (+play)

Este tp consiste en implementar una aplicación mobile que nos permita consultar las planificaciones y las asignaciones ya hechas con alguna de nuestras interfaces!

La aplicación tiene que permitir:

  • Ingresar un rango de fechas (fecha desde - fecha hasta)
  • Consultar las planificaciones (en el rango de fechas ingresados)
  • Ingresar un legajo
  • Consultar las asignaciones que están hechas para el legajo en el rango de fechas (si no hay rango de fechas, todas las asignaciones)
  • En una pantalla ver todas las planificaciones (filtradas por fechas)
  • En una pantalla ver todas las asignaciones para una planificación
  • En una pantalla ver todas las asignaciones de un legajo (en un rango de fechas)

A modo de ejemplo (Y SOLO EJEMPLO) les dejamos mockups de posibles pantallas con una idea de navegación.

Para consultar las planificaciones:

Para Ver Las asignaciones:

NOTA: Para mostrar los datos deben usar el mismo backend que usaron para el TP 2 (Angular + Play) agregando lo que haga falta

TIP: Cuando estamos probando en un emulador tenemos que tener cuidado con las urls, porque http://localhost:8080/mi-backend tiene sentido si estamos ejecutando en la misma pc que corre el servidor, en cambio cuando ejecutamos en el emulador localhost es el telefono y en el telefono no tenemos corriendo nuestro backend. Entonces cuando queremos hacer consultas al server tenemos que poner la dirección IP de nuestra pc

Para poder comunicarse con el servidor necesitamos agregar permisos en el AndroidManifest.xml:

<uses-permission android:name="android.permission.INTERNET" />

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

También necesitamos registrar el servicio:

<service

android:name="com.octo.android.robospice.JacksonGoogleHttpClientSpiceService"

android:exported="false" />

Pueden ver un ejemplo de AndroidManifest.xml completo en el proyecto de ejemplo en: https://xp-dev.com/svn/uqbar/examples/ui/android/java/celulares-android-rest/AndroidManifest.xml