view Agendas/trunk/src/Agendas.Domain/Evento.cs @ 74:bc46e7426c80

Refactoring de acciones según la definición del diagrama de estados en assembla (https://www.assembla.com/spaces/altnet-hispano/wiki/Estados_de_un_evento)
author nelopauselli
date Mon, 23 May 2011 20:13:37 -0300
parents 76567a0d1e44
children 96d7609f2e08
line wrap: on
line source

using System;
using System.Collections.Generic;

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

		#region Propiedades del Evento

		private readonly IList<Track> _tracks;
		private Ponente _ponente;

		/// <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 Ponente Ponente
		{
			get { return _ponente; }
			private set
			{
				if (value == null && _ponente != null || value != _ponente && _ponente != null)
					_ponente.RemoveEvento(this);
				if (value != null)
					value.AddEvento(this);
				_ponente = value;
			}
		}

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

		#endregion

		#region Acciones sobre el evento

		/// <summary>
		/// Propone un evento
		/// </summary>
		/// <param name="titulo">Título del evento propuesto</param>
		/// <param name="ponente">Ponente para evento propuesto</param>
		/// <returns></returns>
		public static Evento Proponer(string titulo, Ponente ponente)
		{
			var evento = new Evento { Titulo = titulo, Ponente = ponente };
			evento.AddTracks(new Track(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="ponente">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>
		/// <returns></returns>
		public static Evento Agendar(string titulo, Ponente ponente, DateTime fecha, string urlInvitacion)
		{
			var evento = new Evento { Titulo = titulo };
			evento.Agendar(ponente, fecha, urlInvitacion);

			return evento;
		}

		/// <summary>
		/// Agenda el evento actual
		/// </summary>
		/// <param name="ponente">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(Ponente ponente, DateTime? fecha, string urlInvitacion)
		{
			Ponente = ponente;
			Fecha = fecha;
			UrlInvitacion = urlInvitacion;
			AddTracks(new Track(Accion.Agendar));
		}

		public virtual void Actualizar(Ponente ponente, DateTime? fecha)
		{
			Ponente = ponente;
			Fecha = fecha;

			AddTracks(new Track(Accion.Modificar));
		}

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

		#endregion

		private void AddTracks(Track track)
		{
			_tracks.Add(track);
		}
	}
}