view Agendas/trunk/src/Agendas.Domain/Evento.cs @ 133:6f1041301797

Se agregan los estados Cancelado y Descartado con las acciones Cancelar, Reagendar, Descartar, Reproponer, según ticket 146. Falta solucionar problema con flujo, ver más información en el ticket de assembla. http://www.assembla.com/spaces/altnet-hispano/tickets/146-implementar-estado-descartar-y-cancelar-de-eventos
author alabra
date Sun, 10 Jul 2011 23:59:19 -0400
parents 90ce239cfa6d
children 62791999ad01
line wrap: on
line source

using System;
using System.Collections.Generic;
using AltNetHispano.Agendas.Domain.Exceptions;

namespace AltNetHispano.Agendas.Domain
{
	public class Evento : Identificable
	{
		protected Evento()
		{
			_tracks = new List<Track>();
		}

		#region Propiedades del Evento

		private readonly IList<Track> _tracks;
		private ICollection<Track> _newTracks = new List<Track>();

		/// <summary>
		/// Título del evento
		/// </summary>
		public virtual string Titulo { get; private set; }

		/// <summary>
		/// Fecha para la que se encuentra agendado el evento
		/// </summary>
		public virtual DateTime? Fecha { get; private set; }

		/// <summary>
		/// Url con la invitacion realizada por el ponente (en la mayoria de los casos va a ser un link al thread de la lista de correo)
		/// </summary>
		public virtual string UrlInvitacion { get; private set; }

		/// <summary>
		/// Url a la pagina de la wiki con el video de la reunion virtual
		/// </summary>
		public virtual string UrlWiki { get; private set; }

		/// <summary>
		/// Numero de orden en el historico de reuniones virtuales
		/// </summary>
		public virtual short NumeroOrden { get; private set; }

		/// <summary>
		/// Ponente o responsable del evento
		/// </summary>
		public virtual Persona Ponente { get; private set; }

		/// <summary>
		/// Track de cambios que ha sufrido el evento
		/// </summary>
		public virtual IEnumerable<Track> Tracks
		{
			get { return _tracks; }
		}

	    /// <summary>
	    /// Estado del evento en formato string (para persistencia a DB)
	    /// </summary>
	    public virtual string Estado
	    {
	        get
	        {
	            if (_eventoState != null)
	                return _eventoState.GetDescripcion();

	            return string.Empty;
	        }
	        set
	        {
	            if (value != Estado)
	            {
                    if (EventoPropuestoState.GetInstance().GetDescripcion().Equals(value))
                        _eventoState = EventoPropuestoState.GetInstance();
                    else if (EventoAgendadoState.GetInstance().GetDescripcion().Equals(value))
                        _eventoState = EventoAgendadoState.GetInstance();
                    else if (EventoConfirmadoState.GetInstance().GetDescripcion().Equals(value))
                        _eventoState = EventoConfirmadoState.GetInstance();
                    else if (EventoPublicadoState.GetInstance().GetDescripcion().Equals(value))
                        _eventoState = EventoPublicadoState.GetInstance();
                    else if (EventoCanceladoState.GetInstance().GetDescripcion().Equals(value))
                        _eventoState = EventoCanceladoState.GetInstance();
                    else if (EventoDescartadoState.GetInstance().GetDescripcion().Equals(value))
                        _eventoState = EventoDescartadoState.GetInstance();
                    else
                        throw new InvalidStateException(value);
	            }
	        }
	    }

	    private EventoState _eventoState;

	  /// <summary>
    /// Obtiene una instancia de la clase que representa el estado del evento
    /// </summary>
    public virtual EventoState GetEstado()
	  {
      if (_eventoState == null)
        SetEstado(EventoNullState.GetInstance());

	    return _eventoState;
	  }

    /// <summary>
    /// Asigna la instancia de la clase que representa el estado del evento
    /// </summary>
    /// <param name="eventoState">Instancia que representa el estado</param>
    public virtual void SetEstado(EventoState eventoState)
    {
      _eventoState = eventoState;
    }

    public virtual TipoEvento Tipo { get; private set; }

	  #endregion

		#region Acciones sobre el evento

	    /// <summary>
	    /// Propone un evento
	    /// </summary>
	    /// <param name="titulo">Título del evento propuesto</param>
	    /// <param name="persona">Ponente para evento propuesto</param>
	    /// <param name="urlInvitacion">Url con la invitación realizada por el ponente</param>
	    /// <param name="tipo">Tipo del evento</param>
	    /// <returns></returns>
	    public static Evento Proponer(string titulo, Persona persona, string urlInvitacion, TipoEvento tipo)
		{
			var evento = new Evento {Titulo = titulo, Ponente = persona, UrlInvitacion = urlInvitacion, Tipo = tipo};
            evento.GetEstado().Promover(evento, Accion.Proponer);

			return evento;
		}

	    /// <summary>
	    /// Agenda un evento que no estaba propuesto
	    /// </summary>
	    /// <param name="titulo">Título del evento a agendar</param>
	    /// <param name="persona">Ponente para el evento</param>
	    /// <param name="fecha">Fecha de realización del evento</param>
	    /// <param name="urlInvitacion">Url con la invitación realizada por el ponente</param>
        /// <param name="tipo">Tipo del evento</param>
        /// <returns></returns>
        public static Evento Agendar(string titulo, Persona persona, DateTime fecha, string urlInvitacion, TipoEvento tipo)
        {
	        var evento = new Evento {Titulo = titulo, Tipo = tipo};
	        evento.Agendar(persona, fecha, urlInvitacion);

	        return evento;
        }

	    /// <summary>
		/// Agenda el evento actual
		/// </summary>
		/// <param name="persona">Ponente para el evento</param>
		/// <param name="fecha">Fecha de realización del evento</param>
		/// <param name="urlInvitacion">Url con la invitación realizada por el ponente</param>
		public virtual void Agendar(Persona persona, DateTime? fecha, string urlInvitacion)
		{
			Ponente = persona;
			Fecha = fecha;
			UrlInvitacion = urlInvitacion;
            this.GetEstado().Promover(this, Accion.Agendar);
		}

		public virtual void Actualizar(Persona persona, DateTime? fecha, string urlInvitacion)
		{
			Ponente = persona;
			Fecha = fecha;
			UrlInvitacion = urlInvitacion;

			AddTrack(new Track(this, Accion.Modificar));
		}

        public virtual void CambiarTitulo(string titulo)
        {
            Titulo = titulo;
            AddTrack(new Track(this, Accion.CambiarTitulo));
        }

	    public virtual void Confirmar()
		{
            this.GetEstado().Promover(this, Accion.Confirmar);
		}

        public virtual void Publicar(short numeroOrden, string urlWiki)
        {
            this.NumeroOrden = numeroOrden;
            this.UrlWiki = urlWiki;
            this.GetEstado().Promover(this, Accion.Publicar);
		}

        public virtual void Cancelar()
        {
            GetEstado().Promover(this, Accion.Cancelar);
        }

        public virtual void Descartar()
        {
            GetEstado().Promover(this, Accion.Descartar);
        }

        public virtual void ReProponer()
        {
            GetEstado().Promover(this, Accion.ReProponer);
        }

        public virtual void ReAgendar()
        {
            GetEstado().Promover(this, Accion.ReAgendar);
        }
	    #endregion

		protected internal virtual void AddTrack(Track track)
		{
			_newTracks.Add(track);
			_tracks.Add(track);
		}

        public virtual IEnumerable<Track> GetTrackNews()
        {
            return _newTracks;
        }
	}
}