view Agendas/trunk/src/Agendas.Domain/Evento.cs @ 94:db4b1e2cae49

Cambio del nombre de la clase Ponente a Persona Se agrega la clase Cuenta para identificar cada una de las cuentas con que se puede autenticar una persona Alta Automatica de cuentas de twitter creando la persona
author Nelo@Kenia.neluz.int
date Sat, 04 Jun 2011 12:11:17 -0300
parents 26d0513a8410
children 83d76f6e0a3c
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 Persona _persona;
		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 Persona
		{
			get { return _persona; }
			private set
			{
				if (value == null && _persona != null || value != _persona && _persona != null)
					_persona.RemoveEvento(this);
				if (value != null)
					value.AddEvento(this);
				_persona = 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="persona">Ponente para evento propuesto</param>
		/// <returns></returns>
		public static Evento Proponer(string titulo, Persona persona, string urlInvitacion)
		{
			var evento = new Evento {Titulo = titulo, Persona = persona, UrlInvitacion = urlInvitacion};
			evento.AddTrack(new Track(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>
		/// <returns></returns>
		public static Evento Agendar(string titulo, Persona persona, DateTime fecha, string urlInvitacion)
		{
			var evento = new Evento { Titulo = titulo };
			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)
		{
			Persona = persona;
			Fecha = fecha;
			UrlInvitacion = urlInvitacion;
			AddTrack(new Track(this, Accion.Agendar));
		}

		public virtual void Actualizar(Persona persona, DateTime? fecha, string urlInvitacion)
		{
			Persona = 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()
		{
			AddTrack(new Track(this, Accion.Confirmar));
		}

		public virtual void Publicar()
		{
			AddTrack(new Track(this, Accion.Publicar));
		}

		#endregion

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

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