view Agendas/trunk/src/Agendas.Domain/Evento.cs @ 106:80c22175c9b5

agregado de tipo de evento (van, cafe, grupoestudio) agregado de tipo de evento en el alta de evento y en el alta de propuestas desde la app web algunas correcciones en el publicador del blog agregado de textos para publicar en el blog eventos de tipo alt.net cafe
author jorge.rowies
date Mon, 06 Jun 2011 14:07:12 -0300
parents 1d820f17fc75
children 90ce239cfa6d
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 readonly 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
            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);
		}

		#endregion

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

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