changeset 235:c61954d24c8c

Quitando ponente principal y utilizando siempre la lista de ponentes
author nelopauselli
date Tue, 04 Oct 2011 20:42:35 -0300
parents e5959f3405e0
children 04d6b386afa7
files Agendas/trunk/db/v1.0/01 - Otros Ponentes.sql Agendas/trunk/db/v1.0/01 - Ponentes.sql Agendas/trunk/src/Agendas.Domain/Agenda.cs Agendas/trunk/src/Agendas.Domain/Evento.cs Agendas/trunk/src/Agendas.Google.Test/GCalendarTest.cs Agendas/trunk/src/Agendas.Google.Test/PublicadorTest.cs Agendas/trunk/src/Agendas.NHibernate/NhHelper.cs Agendas/trunk/src/Agendas.Repositories.Memory/EventoRepository.cs Agendas/trunk/src/Agendas.Repositories.NHibernate/EventoRepository.cs Agendas/trunk/src/Agendas.Repositories.Tests/EventoCrud.cs Agendas/trunk/src/Agendas.Repositories.Tests/Infraestructure/NhHelperTest.cs Agendas/trunk/src/Agendas.Repositories.Tests/TestsHelper.cs Agendas/trunk/src/Agendas.Repositories.Tests/Workflow.cs Agendas/trunk/src/Agendas.Tests/AgendarTests.cs Agendas/trunk/src/Agendas.Tests/PersonaServiceTests.cs Agendas/trunk/src/Agendas.Tests/PonentesTests.cs Agendas/trunk/src/Agendas.Tests/PropuestasTests.cs Agendas/trunk/src/Agendas.Tests/TrackTests.cs Agendas/trunk/src/Agendas.Twitter.Tests/Publicador_tests.cs Agendas/trunk/src/Agendas.Twitter.Tests/Recordatorios_tests.cs Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs Agendas/trunk/src/Agendas.Web/Models/EventoModel.cs Agendas/trunk/src/Agendas.Web/Models/PropuestaModel.cs Agendas/trunk/src/Agendas.Web/Views/Shared/EditorTemplates/OtrosPonentes.cshtml Agendas/trunk/src/Agendas.Web/Views/Shared/EditorTemplates/Ponentes.cshtml
diffstat 26 files changed, 317 insertions(+), 290 deletions(-) [+]
line wrap: on
line diff
--- a/Agendas/trunk/db/v1.0/01 - Otros Ponentes.sql	Wed Sep 28 20:02:44 2011 -0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,6 +0,0 @@
-create table OtrosPonentes (
-	evento_key uniqueidentifier not null,
-	elt uniqueidentifier not null,
-	constraint PK_Colaboradores primary key(evento_key, elt),
-	constraint FK_Colaboradores_Evento foreign key (evento_key) references Evento,
-	constraint FK_Colaboradores_Persona foreign key (elt) references Persona)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/db/v1.0/01 - Ponentes.sql	Tue Oct 04 20:42:35 2011 -0300
@@ -0,0 +1,13 @@
+if (OBJECT_ID('Ponentes') is null)
+begin
+	if (OBJECT_ID('OtrosPonentes') is not null)
+		EXEC sp_rename 'dbo.OtrosPonentes', 'Ponentes'
+	else
+		create table Ponentes (
+			evento_key uniqueidentifier not null,
+			elt uniqueidentifier not null,
+			constraint PK_Ponentes primary key(evento_key, elt),
+			constraint FK_Ponentes_Evento foreign key (evento_key) references Evento,
+			constraint FK_Ponentes_Persona foreign key (elt) references Persona)
+end
+go
--- a/Agendas/trunk/src/Agendas.Domain/Agenda.cs	Wed Sep 28 20:02:44 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Agenda.cs	Tue Oct 04 20:42:35 2011 -0300
@@ -46,29 +46,23 @@
             return _eventosRepository.GetByState(EventoPublicadoState.GetInstance()) ?? new List<Evento>();
         }
 
-        public EventoResultado ModificarEvento(Guid eventoId, string titulo, Guid ponenteId, DateTime? fechaInicio, DateTime? fechaTermino, string urlInvitacion)
+		public EventoResultado ModificarEvento(Guid eventoId, string titulo, IEnumerable<Guid> ponentesId, DateTime? fechaInicio, DateTime? fechaTermino, string urlInvitacion)
         {
 			Evento evento = GetEvento(eventoId);
 
-			if (evento.Tipo == TipoEvento.Van && ponenteId == Guid.Empty)
+			if (evento.Tipo == TipoEvento.Van && (ponentesId == null || !ponentesId.Any()))
 				return new EventoResultado(false, "Debe indicar el ponente para este tipo de evento", null);
 
-			Persona persona = null;
-			if (ponenteId != Guid.Empty)
-			{
-				persona = _personaRepository.Get(ponenteId);
-				if (persona == null)
-					return new EventoResultado(false, string.Format("No se encontró el ponente indicado ({0})", ponenteId), null);
-			} 
-			
             if (evento.Titulo != titulo)
                 evento.CambiarTitulo(titulo);
 
             if (evento.FechaInicio == null && fechaInicio != null && evento.FechaTermino == null && fechaTermino != null)
-                evento.Agendar(persona, fechaInicio, fechaTermino, urlInvitacion);
-            else if (evento.FechaInicio != fechaInicio || evento.Ponente != persona || evento.UrlInvitacion != urlInvitacion ||
-                    evento.FechaTermino != fechaTermino)
-                evento.Actualizar(persona, fechaInicio, fechaTermino, urlInvitacion);
+                evento.Agendar(fechaInicio, fechaTermino, urlInvitacion);
+            else if (evento.FechaInicio != fechaInicio || evento.UrlInvitacion != urlInvitacion || evento.FechaTermino != fechaTermino)
+                evento.Actualizar(fechaInicio, fechaTermino, urlInvitacion);
+
+			var r = ActualizarPonentes(evento, ponentesId);
+			if (!r.Succeful) return r;
 
             Notify(evento);
 
@@ -77,21 +71,20 @@
 			return new EventoResultado(true,"Evento modificado", warnings);
 		}
 
-		public EventoResultado ModificarPropuesta(Guid id, string titulo, Guid ponenteId, string urlInvitacion)
+		public EventoResultado ModificarPropuesta(Guid id, string titulo, IEnumerable<Guid> ponentesId, string urlInvitacion)
         {
-            return ModificarEvento(id, titulo, ponenteId, null, null, urlInvitacion);
+			return ModificarEvento(id, titulo, ponentesId, null, null, urlInvitacion);
         }
 
-		public EventoResultado Proponer(string titulo, Guid? ponenteId, string urlInvitacion, TipoEvento tipo)
+		public EventoResultado Proponer(string titulo, IEnumerable<Guid> ponentesId, string urlInvitacion, TipoEvento tipo)
         {
-            Persona persona = null;
-            if (ponenteId.HasValue)
-                persona = _personaRepository.Get(ponenteId.Value);
+            if (string.IsNullOrWhiteSpace(titulo))
+            	return new EventoResultado(false, "Debe indicar el título del evento", null);
 
-            var evento = Evento.Proponer(titulo, persona, urlInvitacion, tipo);
+            var evento = Evento.Proponer(titulo, urlInvitacion, tipo);
 
-            if (string.IsNullOrWhiteSpace(evento.Titulo))
-                return new EventoResultado(false,"Debe indicar el título del evento", null);
+			var r = ActualizarPonentes(evento, ponentesId);
+			if (!r.Succeful) return r;
 
             Notify(evento);
 
@@ -102,23 +95,15 @@
 			return new EventoResultado(true,"Evento propuesto", warnings);
 		}
 
-    	public EventoResultado Agendar(string titulo, Guid ponenteId, DateTime? fechaInicio, DateTime? fechaTermino, string urlInvitacion, TipoEvento tipo, IEnumerable<Guid> colaboradoresId = null)
+    	public EventoResultado Agendar(string titulo, IEnumerable<Guid> ponentesId, DateTime? fechaInicio, DateTime? fechaTermino, string urlInvitacion, TipoEvento tipo)
         {
             if (!fechaInicio.HasValue)
                 return new EventoResultado(false, "Debe indicar la fecha", null);
             if (!fechaTermino.HasValue)
                 return new EventoResultado(false, "Debe indicar la hora y duración", null);
-			if (tipo==TipoEvento.Van && ponenteId == Guid.Empty)
+			if (tipo==TipoEvento.Van && (ponentesId == null || !ponentesId.Any()))
 				return new EventoResultado(false, "Debe indicar el ponente para este tipo de evento", null);
 
-    		Persona persona = null;
-			if (ponenteId != Guid.Empty)
-    		{
-    			persona = _personaRepository.Get(ponenteId);
-    			if (persona == null)
-    				return new EventoResultado(false, string.Format("No se encontró el ponente indicado ({0})", ponenteId), null);
-    		}
-
     		var existeOtroEvento = _eventosRepository.GetNoPropuestoByTitulo(titulo);
             if (existeOtroEvento != null)
                 return new EventoResultado(false,
@@ -137,23 +122,12 @@
 			}
 
 			if (evento == null)
-                evento = Evento.Agendar(titulo, persona, fechaInicio.Value, fechaTermino.Value, urlInvitacion, tipo);
+                evento = Evento.Agendar(titulo, fechaInicio.Value, fechaTermino.Value, urlInvitacion, tipo);
             else
-                evento.Agendar(persona, fechaInicio, fechaTermino, urlInvitacion);
+                evento.Agendar(fechaInicio, fechaTermino, urlInvitacion);
 
-    		var colaboradores = new List<Persona>();
-			if (colaboradoresId!=null)
-			{
-				foreach (var colaboradorId in colaboradoresId)
-				{
-					var colaborador = _personaRepository.Get(colaboradorId);
-					if (colaborador == null)
-						return new EventoResultado(false, string.Format("No se encontró el colaborador indicado ({0})", colaboradorId),
-						                           null);
-					colaboradores.Add(colaborador);
-				}
-				evento.ActualizarOtrosPonentes(colaboradores);
-			}
+    		var r = ActualizarPonentes(evento, ponentesId);
+			if (!r.Succeful) return r;
 
     		Notify(evento);
 
@@ -164,7 +138,25 @@
 			return new EventoResultado(true, "Evento creado", warnings);
 		}
 
-		public EventoResultado Confirmar(Guid eventoId)
+    	private EventoResultado ActualizarPonentes(Evento evento, IEnumerable<Guid> ponentesId)
+    	{
+    		var ponentes = new List<Persona>();
+    		if (ponentesId != null)
+    		{
+    			foreach (var ponenteId in ponentesId.Where(id=>id!=Guid.Empty))
+    			{
+    				var colaborador = _personaRepository.Get(ponenteId);
+    				if (colaborador == null)
+    					return new EventoResultado(false, string.Format("No se encontró el colaborador indicado ({0})", ponenteId),
+    					                           null);
+    				ponentes.Add(colaborador);
+    			}
+    			evento.ActualizarOtrosPonentes(ponentes);
+    		}
+    		return new EventoResultado(true, "Ponentes actualizados", null);
+    	}
+
+    	public EventoResultado Confirmar(Guid eventoId)
         {
             Evento evento = GetEvento(eventoId);
 
--- a/Agendas/trunk/src/Agendas.Domain/Evento.cs	Wed Sep 28 20:02:44 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Evento.cs	Tue Oct 04 20:42:35 2011 -0300
@@ -9,7 +9,7 @@
 		protected Evento()
 		{
 			_tracks = new List<Track>();
-			_otrosPonentes = new List<Persona>();
+			_ponentes = new List<Persona>();
 			//_patrocinadores = new List<Patrocinador>();
 		}
 
@@ -51,7 +51,7 @@
 		/// <summary>
 		/// Ponente o responsable del evento
 		/// </summary>
-		public virtual Persona Ponente { get; private set; }
+		/// public virtual Persona Ponente { get; private set; }
 
 		/// <summary>
 		/// Track de cambios que ha sufrido el evento
@@ -92,28 +92,23 @@
 			get; set;
 		}
 
-		private readonly IList<Persona> _otrosPonentes;
-		public virtual IEnumerable<Persona> OtrosPonentes
-		{
-			get { return _otrosPonentes; }
-		}
-
+		private readonly IList<Persona> _ponentes;
 		public virtual IEnumerable<Persona> Ponentes
 		{
-			get { return Ponente != null ? new List<Persona> {Ponente}.Union(OtrosPonentes) : OtrosPonentes; }
+			get { return _ponentes; }
 		}
 
 		public virtual void ActualizarOtrosPonentes(IEnumerable<Persona> otrosPonentes)
 		{
 			foreach (var otro in otrosPonentes)
 			{
-				if (!_otrosPonentes.Contains(otro))
-					_otrosPonentes.Add(otro);
+				if (!_ponentes.Contains(otro))
+					_ponentes.Add(otro);
 			}
-			var sobran = _otrosPonentes.Where(c => !otrosPonentes.Contains(c)).ToList();
+			var sobran = _ponentes.Where(c => !otrosPonentes.Contains(c)).ToList();
 
 			foreach (var sobra in sobran)
-				_otrosPonentes.Remove(sobra);
+				_ponentes.Remove(sobra);
 		}
 
 		//protected internal virtual void AddPatrocinador(Patrocinador patrocinador)
@@ -139,9 +134,9 @@
 		/// <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)
+		public static Evento Proponer(string titulo, string urlInvitacion, TipoEvento tipo)
 		{
-			var evento = new Evento { Titulo = titulo, Ponente = persona, UrlInvitacion = urlInvitacion, Tipo = tipo };
+			var evento = new Evento { Titulo = titulo, UrlInvitacion = urlInvitacion, Tipo = tipo };
 			evento.Estado.Promover(evento, Accion.Proponer);
 
 			return evento;
@@ -151,16 +146,15 @@
 	    /// 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="fechaInicio">Fecha de realización del evento</param>
 	    /// <param name="fechaTermino">Fecha de termino 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 fechaInicio, DateTime fechaTermino, string urlInvitacion, TipoEvento tipo)
+	    public static Evento Agendar(string titulo, DateTime fechaInicio, DateTime fechaTermino, string urlInvitacion, TipoEvento tipo)
 		{
 			var evento = new Evento { Titulo = titulo, Tipo = tipo };
-			evento.Agendar(persona, fechaInicio, fechaTermino, urlInvitacion);
+			evento.Agendar(fechaInicio, fechaTermino, urlInvitacion);
 
 			return evento;
 		}
@@ -168,22 +162,19 @@
 	    /// <summary>
 	    /// Agenda el evento actual
 	    /// </summary>
-	    /// <param name="persona">Ponente para el evento</param>
         /// <param name="fechaInicio">Fecha de realización del evento</param>
 	    /// <param name="fechaTermino">Fecha de termino del evento</param>
 	    /// <param name="urlInvitacion">Url con la invitación realizada por el ponente</param>
-	    public virtual void Agendar(Persona persona, DateTime? fechaInicio, DateTime? fechaTermino, string urlInvitacion)
+	    public virtual void Agendar(DateTime? fechaInicio, DateTime? fechaTermino, string urlInvitacion)
 		{
-			Ponente = persona;
             FechaInicio = fechaInicio;
 	        FechaTermino = fechaTermino;
 			UrlInvitacion = urlInvitacion;
 			Estado.Promover(this, Accion.Agendar);
 		}
 
-		public virtual void Actualizar(Persona persona, DateTime? fechaInicio, DateTime? fechaTermino, string urlInvitacion)
+		public virtual void Actualizar(DateTime? fechaInicio, DateTime? fechaTermino, string urlInvitacion)
 		{
-			Ponente = persona;
 			FechaInicio = fechaInicio;
 		    FechaTermino = fechaTermino;
 			UrlInvitacion = urlInvitacion;
--- a/Agendas/trunk/src/Agendas.Google.Test/GCalendarTest.cs	Wed Sep 28 20:02:44 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Google.Test/GCalendarTest.cs	Tue Oct 04 20:42:35 2011 -0300
@@ -17,7 +17,7 @@
         public void CrearEventoGoogleCalendar()
         {
             var gCalendar = new GCalendarAdapter("VAN");
-            var ev = Evento.Agendar("Evento Test", null, _fechaEvento, _fechaTermino, "url", TipoEvento.Cafe);
+            var ev = Evento.Agendar("Evento Test", _fechaEvento, _fechaTermino, "url", TipoEvento.Cafe);
             string message;
             var detail = new CafeGEventDetail();
             detail.Generate(ev);
--- a/Agendas/trunk/src/Agendas.Google.Test/PublicadorTest.cs	Wed Sep 28 20:02:44 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Google.Test/PublicadorTest.cs	Tue Oct 04 20:42:35 2011 -0300
@@ -28,7 +28,7 @@
             adapter.Verify(ad => ad.CreateEvent(It.IsAny<IGEventDetail>(), out message), Times.Never());
 
 
-            agenda.Agendar("Agile Patterns", TestsHelper.GetOrCreatePonente("Alejandro Labra"), fechaInicio,
+            agenda.Agendar("Agile Patterns",new[]{ TestsHelper.GetOrCreatePonente("Alejandro Labra")}, fechaInicio,
                            fechaTermino, "https://groups.google.com/d/topic/altnet-hispano/arYEMsPiAtY/discussion",
                            TipoEvento.Van);
             adapter.Verify(ad => ad.CreateEvent(It.IsAny<IGEventDetail>(), out message), Times.Once());
@@ -45,7 +45,7 @@
             var publicador = new GooglePublicador(adapter.Object);
 			var agenda = new Agenda(publicador, DefaultEventoRepository, DefaultPersonaRepository);
             agenda.Proponer("Agile Patterns", null, null, TipoEvento.Van);
-            agenda.Agendar("Agile Patterns", TestsHelper.GetOrCreatePonente("Alejandro Labra"), fechaInicio,
+            agenda.Agendar("Agile Patterns", new[]{ TestsHelper.GetOrCreatePonente("Alejandro Labra")}, fechaInicio,
                            fechaTermino, "https://groups.google.com/d/topic/altnet-hispano/arYEMsPiAtY/discussion",
                            TipoEvento.Van);
 
@@ -85,7 +85,7 @@
             var publicador = new GooglePublicador(adapter.Object);
 			var agenda = new Agenda(publicador, DefaultEventoRepository, DefaultPersonaRepository);
             agenda.Proponer("Agile Patterns", null, null, TipoEvento.Cafe);
-            agenda.Agendar("Agile Patterns", TestsHelper.GetOrCreatePonente("Alejandro Labra"), fechaInicio,
+            agenda.Agendar("Agile Patterns", new[]{ TestsHelper.GetOrCreatePonente("Alejandro Labra")}, fechaInicio,
                            fechaTermino, "https://groups.google.com/d/topic/altnet-hispano/arYEMsPiAtY/discussion",
                            TipoEvento.Cafe);
 
@@ -125,7 +125,7 @@
             var publicador = new GooglePublicador(adapter.Object);
 			var agenda = new Agenda(publicador, DefaultEventoRepository, DefaultPersonaRepository);
             agenda.Proponer("Agile Patterns", null, null, TipoEvento.GrupoEstudio);
-            agenda.Agendar("Agile Patterns", TestsHelper.GetOrCreatePonente("Alejandro Labra"), fechaInicio,
+            agenda.Agendar("Agile Patterns", new[]{ TestsHelper.GetOrCreatePonente("Alejandro Labra")}, fechaInicio,
                            fechaTermino, "https://groups.google.com/d/topic/altnet-hispano/arYEMsPiAtY/discussion",
                            TipoEvento.GrupoEstudio);
 
@@ -169,7 +169,7 @@
             agenda.Proponer("Agile Patterns", null, null, TipoEvento.Van);
             adapter.Verify(ad => ad.DeleteEvent(It.IsAny<DateTime>(), It.IsAny<DateTime>(), out message), Times.Never());
 
-            agenda.Agendar("Agile Patterns", TestsHelper.GetOrCreatePonente("Alejandro Labra"), fechaInicio,
+            agenda.Agendar("Agile Patterns", new[]{ TestsHelper.GetOrCreatePonente("Alejandro Labra")}, fechaInicio,
                            fechaTermino, "https://groups.google.com/d/topic/altnet-hispano/arYEMsPiAtY/discussion",
                            TipoEvento.Van);
             adapter.Verify(ad => ad.DeleteEvent(It.IsAny<DateTime>(), It.IsAny<DateTime>(), out message), Times.Never());
@@ -190,9 +190,9 @@
 
 			var publicador = new GooglePublicador(adapter.Object);
 			var agenda = new Agenda(publicador, DefaultEventoRepository, DefaultPersonaRepository);
-			agenda.Agendar("Identity Providers Públicos y Empresariales", TestsHelper.GetOrCreatePonente("Carlos Peix"), fechaInicio,
+			agenda.Agendar("Identity Providers Públicos y Empresariales", new[]{ TestsHelper.GetOrCreatePonente("Carlos Peix"),TestsHelper.GetOrCreatePonente("Nelo Pauselli")}, fechaInicio,
 						   fechaTermino, "https://groups.google.com/d/topic/altnet-hispano/arYEMsPiAtY/discussion",
-						   TipoEvento.Van, new[] { TestsHelper.GetOrCreatePonente("Nelo Pauselli") });
+						   TipoEvento.Van);
 
 			var ev = DefaultEventoRepository.GetActivos()[0];
 			detail.Generate(ev);
@@ -210,7 +210,7 @@
 
 			var publicador = new GooglePublicador(adapter.Object);
 			var agenda = new Agenda(publicador, DefaultEventoRepository, DefaultPersonaRepository);
-			agenda.Agendar("Identity Providers Públicos y Empresariales", Guid.Empty, fechaInicio,
+			agenda.Agendar("Identity Providers Públicos y Empresariales", null, fechaInicio,
 						   fechaTermino, "https://groups.google.com/d/topic/altnet-hispano/arYEMsPiAtY/discussion",
 						   TipoEvento.Cafe);
 
--- a/Agendas/trunk/src/Agendas.NHibernate/NhHelper.cs	Wed Sep 28 20:02:44 2011 -0300
+++ b/Agendas/trunk/src/Agendas.NHibernate/NhHelper.cs	Tue Oct 04 20:42:35 2011 -0300
@@ -35,7 +35,7 @@
 
 			orm.Complex<Evento>(e => e.Estado);
 			
-			orm.Bag<Evento>(e=>e.OtrosPonentes);
+			orm.Bag<Evento>(e=>e.Ponentes);
 			orm.ManyToMany<Evento, Persona>();
 			
 			orm.TablePerClass<Track>();
--- a/Agendas/trunk/src/Agendas.Repositories.Memory/EventoRepository.cs	Wed Sep 28 20:02:44 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Repositories.Memory/EventoRepository.cs	Tue Oct 04 20:42:35 2011 -0300
@@ -1,5 +1,4 @@
-using System;
-using System.Collections.Generic;
+using System.Collections.Generic;
 using System.Linq;
 using AltNetHispano.Agendas.Domain;
 using AltNetHispano.Agendas.Domain.Repositories;
@@ -15,7 +14,7 @@
 
 	    public bool ExistePonente(Persona ponente)
 	    {
-	        return Objects.Values.Any(ev => ev.Ponente == ponente);
+	        return Objects.Values.Any(ev => ev.Ponentes.Contains(ponente));
 	    }
 
 	    public IList<Evento> GetByState(EventoState state)
--- a/Agendas/trunk/src/Agendas.Repositories.NHibernate/EventoRepository.cs	Wed Sep 28 20:02:44 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Repositories.NHibernate/EventoRepository.cs	Tue Oct 04 20:42:35 2011 -0300
@@ -1,5 +1,6 @@
 using System;
 using System.Collections.Generic;
+using System.Linq;
 using AltNetHispano.Agendas.Domain;
 using AltNetHispano.Agendas.Domain.Repositories;
 using NHibernate;
@@ -49,7 +50,7 @@
 
 	    public bool ExistePonente(Persona ponente)
 	    {
-            return Session.QueryOver<Evento>().Where(ev => ev.Ponente == ponente).RowCount() > 0;
+            return Session.QueryOver<Evento>().Where(ev => ev.Ponentes.Contains(ponente)).RowCount() > 0;
 	    }
 
 	    public IList<Evento> GetByState(EventoState state)
--- a/Agendas/trunk/src/Agendas.Repositories.Tests/EventoCrud.cs	Wed Sep 28 20:02:44 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Repositories.Tests/EventoCrud.cs	Tue Oct 04 20:42:35 2011 -0300
@@ -1,4 +1,5 @@
 using System;
+using System.Collections.Generic;
 using System.Linq;
 using Agendas.Repositories.Tests.Infraestructure;
 using AltNetHispano.Agendas.Domain;
@@ -41,11 +42,9 @@
 		{
 			using (_requestEmulator.Invoke())
 			{
-			    var ponente = new Persona("Carlos Blé") {Twitter = "carlosble"};
-				_personaRepository.Save(ponente);
-
 				var colaboradores = new[]
 				                    	{
+											new Persona("Carlos Blé") {Twitter = "carlosble"},
 				                    		new Persona("Alejandro Labra") {Twitter = "alejandrolabra"},
 				                    		new Persona("Carlos Peix") {Twitter = "carlospeix"}
 				                    	};
@@ -56,7 +55,7 @@
 			    var usuario = new Persona("Nelo") {Twitter = "nelopauselli"};
 				_personaRepository.Save(usuario);
 
-				var evento = Evento.Proponer("TDD - Diseño Basado en Ejemplos", ponente, string.Empty, TipoEvento.Van);
+				var evento = Evento.Proponer("TDD - Diseño Basado en Ejemplos", string.Empty, TipoEvento.Van);
 				evento.ActualizarOtrosPonentes(colaboradores);
 
 				evento.Tracks.First().LogAdd(new TrackLog(TrackLogPropietario.Twitter, "Mensaje", usuario, true));
@@ -77,16 +76,17 @@
 				Evento van = _eventoRepository.Get(eventoId);
 
 				Assert.IsNotNull(van);
-				Assert.IsNotNull(van.Ponente);
-				Assert.AreEqual("Carlos Blé", van.Ponente.Nombre);
-
+				Assert.IsNotNull(van.Ponentes);
+				Assert.IsTrue(van.Ponentes.Any(p => p.Nombre == "Carlos Blé"));
+				Assert.IsTrue(van.Ponentes.Any(p => p.Nombre == "Alejandro Labra"));
+				Assert.IsTrue(van.Ponentes.Any(p => p.Nombre == "Carlos Peix"));
 				var track1 = van.Tracks.Where(t => t.Accion == Accion.Proponer).FirstOrDefault();
 				Assert.IsNotNull(track1);
 				Assert.AreEqual(van, track1.Evento);
 				
 				Assert.AreEqual("TDD - Diseño Basado en Ejemplos", van.Titulo);
 
-				Assert.AreEqual(2, van.OtrosPonentes.Count());
+				Assert.AreEqual(3, van.Ponentes.Count());
 			}
 		}
 
@@ -108,7 +108,13 @@
 				var otroPonente = new Persona("José");
 				_personaRepository.Save(otroPonente);
 
-				van.Actualizar(otroPonente, fechaInicio, fechaTermino, null);
+				van.Actualizar(fechaInicio, fechaTermino, null);
+				
+				var ponentes = new List<Persona>(van.Ponentes);
+				ponentes.RemoveAll(p => p.Nombre == "Carlos Blé");
+				ponentes.Add(otroPonente);
+
+				van.ActualizarOtrosPonentes(ponentes);
 
 				_eventoRepository.Update(van);
 			}
@@ -118,8 +124,12 @@
 				Evento van = _eventoRepository.Get(eventoId);
 
 				Assert.IsNotNull(van);
-				Assert.IsNotNull(van.Ponente);
-				Assert.AreEqual("José", van.Ponente.Nombre);
+				
+				Assert.IsFalse(van.Ponentes.Any(p => p.Nombre == "Carlos Blé"));
+				Assert.IsTrue(van.Ponentes.Any(p => p.Nombre == "Alejandro Labra"));
+				Assert.IsTrue(van.Ponentes.Any(p => p.Nombre == "Carlos Peix"));
+				Assert.IsTrue(van.Ponentes.Any(p => p.Nombre == "José")); 
+				
 				Assert.AreEqual("TDD & Ejemplos", van.Titulo);
 				Assert.AreEqual(new DateTime(2010, 04, 17).ToUniversalTime(), van.FechaInicio);
                 Assert.AreEqual(fechaTermino, van.FechaTermino);
@@ -170,7 +180,7 @@
 				Evento evento = _eventoRepository.Get(eventoId);
 				Assert.AreEqual(EventoPropuestoState.GetInstance(), evento.Estado);
 
-				evento.Agendar(evento.Ponente, evento.FechaInicio, evento.FechaTermino, null);
+				evento.Agendar(evento.FechaInicio, evento.FechaTermino, null);
 			}
 
 			using (_requestEmulator.Invoke())
--- a/Agendas/trunk/src/Agendas.Repositories.Tests/Infraestructure/NhHelperTest.cs	Wed Sep 28 20:02:44 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Repositories.Tests/Infraestructure/NhHelperTest.cs	Tue Oct 04 20:42:35 2011 -0300
@@ -9,7 +9,7 @@
 			var sf = NhHelper.GetSessionFactory();
 
 			var session = sf.OpenStatelessSession();
-			session.CreateSQLQuery("DELETE FROM OtrosPonentes").ExecuteUpdate();
+			session.CreateSQLQuery("DELETE FROM Ponentes").ExecuteUpdate();
 			session.CreateSQLQuery("DELETE FROM Evento").ExecuteUpdate();
 			session.CreateSQLQuery("DELETE FROM Persona").ExecuteUpdate();
 		}
--- a/Agendas/trunk/src/Agendas.Repositories.Tests/TestsHelper.cs	Wed Sep 28 20:02:44 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Repositories.Tests/TestsHelper.cs	Tue Oct 04 20:42:35 2011 -0300
@@ -1,4 +1,5 @@
 using System;
+using Agendas.NHibernate;
 using AltNetHispano.Agendas.Domain;
 using AltNetHispano.Agendas.Domain.Repositories;
 
@@ -20,6 +21,8 @@
 			{
 				persona = new Persona(nombre) { Twitter = nombre.Replace(" ", string.Empty).ToLower() };
 				_repository.Save(persona);
+
+				NhHelper.GetSessionFactory().GetCurrentSession().Flush();
 			}
 			return persona.Id;
 		}
--- a/Agendas/trunk/src/Agendas.Repositories.Tests/Workflow.cs	Wed Sep 28 20:02:44 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Repositories.Tests/Workflow.cs	Tue Oct 04 20:42:35 2011 -0300
@@ -28,10 +28,11 @@
 		{
 			using (_requestEmulator.Invoke())
 			{
-				var resultado = _agenda.Proponer("SOLID", _testsHelper.GetOrCreatePonente("Jorge"), null, TipoEvento.Van);
+				var resultado = _agenda.Proponer("SOLID", new[] {_testsHelper.GetOrCreatePonente("Jorge")}, null, TipoEvento.Van);
+				Console.WriteLine(resultado.Message);
 				Assert.IsTrue(resultado.Succeful);
 			}
-			
+
 			GetId();
 		}
 
@@ -42,7 +43,7 @@
 			{
 			    var fechaInicio = DateTime.Today.AddDays(5).ToUniversalTime();
 			    var fechaTermino = fechaInicio.AddHours(2);
-			    var resultado = _agenda.Agendar("SOLID", _testsHelper.GetOrCreatePonente("Jorge"), fechaInicio, fechaTermino, null,
+			    var resultado = _agenda.Agendar("SOLID", new[]{ _testsHelper.GetOrCreatePonente("Jorge")}, fechaInicio, fechaTermino, null,
 			                                    TipoEvento.Van);
 				Assert.IsTrue(resultado.Succeful);
 			}
--- a/Agendas/trunk/src/Agendas.Tests/AgendarTests.cs	Wed Sep 28 20:02:44 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/AgendarTests.cs	Tue Oct 04 20:42:35 2011 -0300
@@ -35,7 +35,7 @@
 		    var fechaTermino = fechaInicio.AddHours(2);
 		    Assert.Throws<Exception>(
 		        () =>
-		        agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino,
+		        agenda.Agendar("Van para publicar", new[]{ TestsHelper.GetOrCreatePonente("jjmontes")}, fechaInicio, fechaTermino,
 		                       urlInvitacion, TipoEvento.Van));
 			Assert.AreEqual(0, agenda.GetEventosActivos().Count);
 
@@ -57,7 +57,7 @@
 		    var fechaTermino = fechaInicio.AddHours(2);
 		    Assert.Throws<IdentityContextNotConfiguredException>(
 		        () =>
-		        agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino,
+		        agenda.Agendar("Van para publicar", new[]{ TestsHelper.GetOrCreatePonente("jjmontes")}, fechaInicio, fechaTermino,
 		                       urlInvitacion, TipoEvento.Van));
 			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0));
 		}
@@ -76,7 +76,7 @@
 		    var fechaTermino = fechaInicio.AddHours(2);
 		    Assert.Throws<UsuarioNoAutenticadoException>(
 		        () =>
-		        agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino,
+		        agenda.Agendar("Van para publicar", new[]{ TestsHelper.GetOrCreatePonente("jjmontes")}, fechaInicio, fechaTermino,
 		                       urlInvitacion, TipoEvento.Van));
 
 			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(0));
@@ -84,13 +84,26 @@
 		}
 
 		[Test]
-		public void Intentar_agendar_van_sin_ponente()
+		public void Intentar_agendar_van_sin_ponentes_null()
 		{
 			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository);
 
 		    var fechaInicio = DateTime.Now.ToUniversalTime();
 		    var fechaTermino = fechaInicio.AddHours(2);
-		    var r = agenda.Agendar("Van para publicar", Guid.Empty, fechaInicio, fechaTermino, urlInvitacion, TipoEvento.Van);
+		    var r = agenda.Agendar("Van para publicar", null, fechaInicio, fechaTermino, urlInvitacion, TipoEvento.Van);
+
+			Assert.IsFalse(r.Succeful);
+		}
+
+		[Test]
+		public void Intentar_agendar_van_sin_ponentes_empty()
+		{
+			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository);
+
+			var fechaInicio = DateTime.Now.ToUniversalTime();
+			var fechaTermino = fechaInicio.AddHours(2);
+			var r = agenda.Agendar("Van para publicar", new[] {Guid.Empty}, fechaInicio, fechaTermino, urlInvitacion,
+			                       TipoEvento.Van);
 
 			Assert.IsFalse(r.Succeful);
 		}
@@ -102,8 +115,9 @@
 
 			var fechaInicio = DateTime.Now.ToUniversalTime();
 			var fechaTermino = fechaInicio.AddHours(2);
-			var r = agenda.Agendar("Cafe para publicar", Guid.Empty, fechaInicio, fechaTermino, urlInvitacion, TipoEvento.Cafe);
+			var r = agenda.Agendar("Cafe para publicar", new[] { Guid.Empty }, fechaInicio, fechaTermino, urlInvitacion, TipoEvento.Cafe);
 
+			Console.WriteLine(r.Message);
 			Assert.IsTrue(r.Succeful);
 		}
 
@@ -114,7 +128,7 @@
 
 			var fechaInicio = DateTime.Now.ToUniversalTime();
 			var fechaTermino = fechaInicio.AddHours(2);
-			var r = agenda.Agendar("GrupoEstudio para publicar", Guid.Empty, fechaInicio, fechaTermino, urlInvitacion, TipoEvento.GrupoEstudio);
+			var r = agenda.Agendar("GrupoEstudio para publicar", new[] { Guid.Empty }, fechaInicio, fechaTermino, urlInvitacion, TipoEvento.GrupoEstudio);
 
 			Assert.IsTrue(r.Succeful);
 		}
@@ -132,7 +146,7 @@
 
 		    var fechaInicio = DateTime.Now.ToUniversalTime();
 		    var fechaTermino = fechaInicio.AddHours(2);
-		    agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino,
+		    agenda.Agendar("Van para publicar", new[]{TestsHelper.GetOrCreatePonente("jjmontes")}, fechaInicio, fechaTermino,
 		                   urlInvitacion, TipoEvento.Van);
 
 			publicador1.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
@@ -149,7 +163,7 @@
 
 		    var fechaInicio = DateTime.Now.ToUniversalTime();
 		    var fechaTermino = fechaInicio.AddHours(2);
-		    agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino,
+		    agenda.Agendar("Van para publicar",new[]{ TestsHelper.GetOrCreatePonente("jjmontes")}, fechaInicio, fechaTermino,
 		                   urlInvitacion, TipoEvento.Van);
 
 			Assert.AreEqual(0, agenda.GetEventosActivos(EventoPropuestoState.GetInstance()).Count);
@@ -171,7 +185,9 @@
 			var fechaInicio = DateTime.Now.ToUniversalTime();
 			var fechaTermino = fechaInicio.AddHours(2);
 
-			agenda.Agendar("Identity Providers, oAuth y Autenticaciones on-line", TestsHelper.GetOrCreatePonente("carlospeix"), fechaInicio, fechaTermino, urlInvitacion, TipoEvento.Van, new[] {TestsHelper.GetOrCreatePonente("nelopauselli")});
+			agenda.Agendar("Identity Providers, oAuth y Autenticaciones on-line",
+			               new[] {TestsHelper.GetOrCreatePonente("Carlos Peix"), TestsHelper.GetOrCreatePonente("Nelo Pauselli")},
+			               fechaInicio, fechaTermino, urlInvitacion, TipoEvento.Van);
 
 			Assert.AreEqual(0, agenda.GetEventosActivos(EventoPropuestoState.GetInstance()).Count);
 
@@ -180,13 +196,11 @@
 
 			var evento = eventos[0];
 
-			Assert.IsNotNull(evento.Ponente);
-			Assert.AreEqual("carlospeix", evento.Ponente.Twitter);
+			var carlos = evento.Ponentes.Single(p => p.Twitter == "carlospeix");
+			Assert.AreEqual("Carlos Peix", carlos.Nombre);
 
-			Assert.IsNotNull(evento.OtrosPonentes);
-			Assert.AreEqual(1, evento.OtrosPonentes.Count());
-			var colaborador = evento.OtrosPonentes.First();
-			Assert.AreEqual("nelopauselli", colaborador.Twitter);
+			var nelo = evento.Ponentes.Single(p => p.Twitter == "nelopauselli");
+			Assert.AreEqual("Nelo Pauselli", nelo.Nombre);
 		}
 
 		[Test]
@@ -199,9 +213,7 @@
 		    var fechaInicioVanPublicar = DateTime.Now.ToUniversalTime();
 		    var fechaTerminoVanPublicar = fechaInicioVanPublicar.AddHours(2);
 
-		    agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicioVanPublicar,
-		                   fechaTerminoVanPublicar,
-		                   urlInvitacion, TipoEvento.Van);
+			agenda.Agendar("Van para publicar", new[] {TestsHelper.GetOrCreatePonente("jjmontes")}, fechaInicioVanPublicar, fechaTerminoVanPublicar, urlInvitacion, TipoEvento.Van);
 
 			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
 
@@ -211,20 +223,20 @@
 
 			var fechaInicio = evento.FechaInicio.Value.AddDays(7);
 		    var fechaTermino = fechaInicio.AddHours(2);
-		    agenda.ModificarEvento(evento.Id, "otro titulo", TestsHelper.GetOrCreatePonente("otro ponente"), fechaInicio,
+		    agenda.ModificarEvento(evento.Id, "otro titulo", new[]{TestsHelper.GetOrCreatePonente("otro ponente")}, fechaInicio,
 		                           fechaTermino, urlInvitacion);
 
 			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(2));
 
 			evento = repository.GetActivos().First();
 			Assert.AreEqual("otro titulo", evento.Titulo);
-			Assert.AreEqual("otro ponente", evento.Ponente.Nombre);
+			Assert.IsTrue(evento.Ponentes.Any(p=>p.Nombre=="otro ponente"));
 			Assert.AreEqual(fechaInicio, evento.FechaInicio);
 
 			var idEventoNoExistente = new Guid("99999999999999999999999999999999");
 		    Assert.Throws<EventoNotFoundException>(
 		        () =>
-		        agenda.ModificarEvento(idEventoNoExistente, "algún título", TestsHelper.GetOrCreatePonente("un ponente"),
+		        agenda.ModificarEvento(idEventoNoExistente, "algún título",new[]{ TestsHelper.GetOrCreatePonente("un ponente")},
 		                               DateTime.Now, DateTime.Now.AddHours(2), urlInvitacion));
 		}
 
@@ -239,7 +251,7 @@
 
 		    var fechaInicio = DateTime.Now.ToUniversalTime();
 		    var fechaTermino = fechaInicio.AddHours(2);
-		    agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino,
+		    agenda.Agendar("Van para publicar", new[]{TestsHelper.GetOrCreatePonente("jjmontes")}, fechaInicio, fechaTermino,
 		                   urlInvitacion, TipoEvento.Van);
 
 			var van = agenda.GetEventosActivos().Single(v => v.Titulo == "Van para publicar");
@@ -259,7 +271,7 @@
 			var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }),
 															DefaultEventoRepository, DefaultPersonaRepository);
 
-			agenda.Proponer("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), urlInvitacion, TipoEvento.Van);
+			agenda.Proponer("Html 5", new[]{TestsHelper.GetOrCreatePonente("jjmontes")},  urlInvitacion, TipoEvento.Van);
 			Assert.AreEqual(1, agenda.GetEventosActivos(EventoPropuestoState.GetInstance()).Count);
 			Assert.AreEqual(1, agenda.GetEventosActivos().Count);
 
@@ -268,7 +280,7 @@
 
 		    var fechaInicio = DateTime.Today.AddDays(5).ToUniversalTime();
 		    var fechaTermino = fechaInicio.AddHours(2);
-		    agenda.ModificarEvento(publicado.Id, "Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio,
+		    agenda.ModificarEvento(publicado.Id, "Html 5", new[]{TestsHelper.GetOrCreatePonente("jjmontes")}, fechaInicio,
 		                           fechaTermino, urlInvitacion);
 			Assert.AreEqual(0, agenda.GetEventosActivos(EventoPropuestoState.GetInstance()).Count);
 			Assert.AreEqual(1, agenda.GetEventosActivos(EventoAgendadoState.GetInstance()).Count);
@@ -288,7 +300,7 @@
 			var publicador1 = new Mock<IPublicador>();
 
 			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
-			agenda.Proponer("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), urlInvitacion, TipoEvento.Van);
+			agenda.Proponer("Html 5", new[]{TestsHelper.GetOrCreatePonente("jjmontes")},  urlInvitacion, TipoEvento.Van);
 
 			var evento =
 				DefaultEventoRepository.GetByState(EventoPropuestoState.GetInstance()).Single(e => e.Titulo == "Html 5");
@@ -305,7 +317,7 @@
 			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
 		    var fechaInicio = DateTime.MinValue.ToUniversalTime();
 		    var fechatermino = fechaInicio.AddHours(2);
-		    agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechatermino, urlInvitacion,
+		    agenda.Agendar("Html 5", new[]{TestsHelper.GetOrCreatePonente("jjmontes")},  fechaInicio, fechatermino, urlInvitacion,
 		                   TipoEvento.Van);
 
 			var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
@@ -322,7 +334,7 @@
 			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
             var fechaInicio = DateTime.MinValue.ToUniversalTime();
             var fechaTermino = fechaInicio.AddHours(2);
-            agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino,
+            agenda.Agendar("Html 5", new[]{TestsHelper.GetOrCreatePonente("jjmontes")},  fechaInicio, fechaTermino,
                            urlInvitacion, TipoEvento.Van);
 
             var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
@@ -342,7 +354,7 @@
 			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
             var fechaInicio = DateTime.MinValue.ToUniversalTime();
             var fechaTermino = fechaInicio.AddHours(2);
-            agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino,
+            agenda.Agendar("Html 5", new[]{TestsHelper.GetOrCreatePonente("jjmontes")},  fechaInicio, fechaTermino,
                            urlInvitacion, TipoEvento.Van);
 
             var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
@@ -363,7 +375,7 @@
 			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
             var fechaInicio = DateTime.MinValue.ToUniversalTime();
             var fechaTermino = fechaInicio.AddHours(2);
-            agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino,
+            agenda.Agendar("Html 5", new[]{TestsHelper.GetOrCreatePonente("jjmontes")},  fechaInicio, fechaTermino,
                            urlInvitacion, TipoEvento.Van);
 
 			var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
@@ -384,7 +396,7 @@
 			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
 		    var fechaInicio = DateTime.MinValue.ToUniversalTime();
 		    var fechaTermino = fechaInicio.AddHours(2);
-		    agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino, urlInvitacion,
+		    agenda.Agendar("Html 5", new[]{TestsHelper.GetOrCreatePonente("jjmontes")},  fechaInicio, fechaTermino, urlInvitacion,
 		                   TipoEvento.Van);
 
 			var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
@@ -406,7 +418,7 @@
 			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
 		    var fechaInicio = DateTime.MinValue.ToUniversalTime();
 		    var fechaTermino = fechaInicio.AddHours(2);
-		    agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino, urlInvitacion,
+		    agenda.Agendar("Html 5", new[]{TestsHelper.GetOrCreatePonente("jjmontes")},  fechaInicio, fechaTermino, urlInvitacion,
 		                   TipoEvento.Van);
 
 			var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
@@ -426,7 +438,7 @@
 			var publicador1 = new Mock<IPublicador>();
 
 			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
-			agenda.Proponer("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), urlInvitacion, TipoEvento.Van);
+			agenda.Proponer("Html 5", new[]{TestsHelper.GetOrCreatePonente("jjmontes")},  urlInvitacion, TipoEvento.Van);
 
 			var evento =
 				DefaultEventoRepository.GetByState(EventoPropuestoState.GetInstance()).Single(e => e.Titulo == "Html 5");
@@ -445,7 +457,7 @@
 			var publicador1 = new Mock<IPublicador>();
 
 			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
-			agenda.Proponer("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), urlInvitacion, TipoEvento.Van);
+			agenda.Proponer("Html 5", new[]{TestsHelper.GetOrCreatePonente("jjmontes")},  urlInvitacion, TipoEvento.Van);
 
 			var evento =
 				DefaultEventoRepository.GetByState(EventoPropuestoState.GetInstance()).Single(e => e.Titulo == "Html 5");
@@ -463,7 +475,7 @@
             var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
             var fechaInicio = DateTime.MinValue.ToUniversalTime();
             var fechaTermino = fechaInicio.AddHours(2);
-            agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino,
+            agenda.Agendar("Html 5", new[]{TestsHelper.GetOrCreatePonente("jjmontes")},  fechaInicio, fechaTermino,
                            urlInvitacion, TipoEvento.Van);
 
             var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
@@ -484,7 +496,7 @@
             var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
             var fechaInicio = DateTime.MinValue.ToUniversalTime();
             var fechaTermino = fechaInicio.AddHours(2);
-            agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino,
+            agenda.Agendar("Html 5", new[]{TestsHelper.GetOrCreatePonente("jjmontes")},  fechaInicio, fechaTermino,
                            urlInvitacion, TipoEvento.Van);
 
             var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
@@ -503,7 +515,7 @@
 			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository);
 		    var fechaInicio = DateTime.MinValue.ToUniversalTime();
 		    var fechaTermino = fechaInicio.AddHours(2);
-		    agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino, urlInvitacion,
+		    agenda.Agendar("Html 5", new[]{TestsHelper.GetOrCreatePonente("jjmontes")},  fechaInicio, fechaTermino, urlInvitacion,
 		                   TipoEvento.Van);
 
 			var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
@@ -521,20 +533,20 @@
 			var fechaInicio = new DateTime(2011, 7, 1, 18, 00, 00);
 			var fechaTermino = fechaInicio.AddHours(2);
 
-			var r = agenda.Agendar("Conceptos de HTTP y Fiddler web debugger", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio,
+			var r = agenda.Agendar("Conceptos de HTTP y Fiddler web debugger", new[]{TestsHelper.GetOrCreatePonente("jjmontes")},  fechaInicio,
 						   fechaTermino, string.Empty, TipoEvento.Van);
 			Assert.IsTrue(r.Succeful);
 
 			fechaInicio = new DateTime(2011, 7, 1, 05, 00, 00);
 			fechaTermino = fechaInicio.AddHours(2);
 			r = agenda.Agendar("Una primer van que NO se superpone",
-						   TestsHelper.GetOrCreatePonente("jjmontes"),
+						   new[]{TestsHelper.GetOrCreatePonente("jjmontes")},
 						   fechaInicio,
 						   fechaTermino, string.Empty, TipoEvento.Van);
 			Assert.IsTrue(r.Succeful);
 			
 			r = agenda.Agendar("Otra van que se superpone",
-			                       TestsHelper.GetOrCreatePonente("jjmontes"),
+			                       new[]{TestsHelper.GetOrCreatePonente("jjmontes")},
 			                       fechaInicio,
 			                       fechaTermino, string.Empty, TipoEvento.Van);
 			Assert.IsFalse(r.Succeful);
@@ -542,7 +554,7 @@
 			fechaInicio = new DateTime(2011, 7, 1, 17, 00, 00);
 			fechaTermino = fechaInicio.AddHours(2);
 			r = agenda.Agendar("Otra van que se superpone",
-			                   TestsHelper.GetOrCreatePonente("jjmontes"),
+			                   new[]{TestsHelper.GetOrCreatePonente("jjmontes")},
 			                   fechaInicio,
 			                   fechaTermino, string.Empty, TipoEvento.Van);
 			Assert.IsFalse(r.Succeful);
@@ -550,7 +562,7 @@
 			fechaInicio = new DateTime(2011, 7, 1, 19, 00, 00);
 			fechaTermino = fechaInicio.AddHours(2);
 			r = agenda.Agendar("Otra van que se superpone",
-			                   TestsHelper.GetOrCreatePonente("jjmontes"),
+			                   new[]{TestsHelper.GetOrCreatePonente("jjmontes")},
 			                   fechaInicio,
 			                   fechaTermino, string.Empty, TipoEvento.Van);
 			Assert.IsFalse(r.Succeful);
@@ -558,7 +570,7 @@
 			fechaInicio = new DateTime(2011, 7, 1, 21, 00, 00);
 			fechaTermino = fechaInicio.AddHours(2);
 			r = agenda.Agendar("Una segunda van que NO se superpone",
-			                   TestsHelper.GetOrCreatePonente("jjmontes"),
+			                   new[]{TestsHelper.GetOrCreatePonente("jjmontes")},
 			                   fechaInicio,
 			                   fechaTermino, string.Empty, TipoEvento.Van);
 			Assert.IsTrue(r.Succeful);
@@ -572,16 +584,16 @@
 			var fechaInicio = new DateTime(2011, 7, 1, 18, 00, 00);
 			var fechaTermino = fechaInicio.AddHours(2);
 
-			agenda.Agendar("Conceptos de HTTP y Fiddler web debugger", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio,
+			agenda.Agendar("Conceptos de HTTP y Fiddler web debugger", new[]{TestsHelper.GetOrCreatePonente("jjmontes")},  fechaInicio,
 						   fechaTermino, string.Empty, TipoEvento.Van);
 
-			agenda.Proponer("Otra van que se superpone", TestsHelper.GetOrCreatePonente("jjmontes"), string.Empty, TipoEvento.Van);
+			agenda.Proponer("Otra van que se superpone", new[]{TestsHelper.GetOrCreatePonente("jjmontes")},  string.Empty, TipoEvento.Van);
 			var eventoPropuesto = DefaultEventoRepository.GetPropuestaByTitulo("Otra van que se superpone");
 			Assert.IsNotNull(eventoPropuesto);
 			Assert.IsNull(eventoPropuesto.FechaInicio);
 			Assert.IsNull(eventoPropuesto.FechaTermino);
 			var r = agenda.Agendar("Otra van que se superpone",
-								   TestsHelper.GetOrCreatePonente("jjmontes"),
+								   new[]{TestsHelper.GetOrCreatePonente("jjmontes")},
 								   fechaInicio,
 								   fechaTermino, string.Empty, TipoEvento.Van);
 			Assert.IsFalse(r.Succeful);
@@ -599,14 +611,14 @@
             var fechaInicio = new DateTime(2011, 8, 20, 18, 00, 00);
             var fechaTermino = fechaInicio.AddHours(2);
 
-            var r = agenda.Agendar("Conceptos de HTTP y Fiddler web debugger", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio,
+            var r = agenda.Agendar("Conceptos de HTTP y Fiddler web debugger", new[]{TestsHelper.GetOrCreatePonente("jjmontes")},  fechaInicio,
                            fechaTermino, string.Empty, TipoEvento.Van);
             Assert.IsTrue(r.Succeful);
 
             fechaInicio = new DateTime(2011, 8, 27, 05, 00, 00);
             fechaTermino = fechaInicio.AddHours(2);
             r = agenda.Agendar("Conceptos de HTTP y Fiddler web debugger",
-                           TestsHelper.GetOrCreatePonente("alabra"),
+                           new[]{TestsHelper.GetOrCreatePonente("alabra")},
                            fechaInicio,
                            fechaTermino, string.Empty, TipoEvento.Van);
             
--- a/Agendas/trunk/src/Agendas.Tests/PersonaServiceTests.cs	Wed Sep 28 20:02:44 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/PersonaServiceTests.cs	Tue Oct 04 20:42:35 2011 -0300
@@ -200,7 +200,7 @@
 
             var fechaInicio = DateTime.Now.ToUniversalTime();
             var fechaTermino = fechaInicio.AddHours(2);
-            agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("alabra"), fechaInicio, fechaTermino,
+            agenda.Agendar("Van para publicar", new[]{TestsHelper.GetOrCreatePonente("alabra")}, fechaInicio, fechaTermino,
                            "http://groups.google.com/group/altnet-hispano/browse_thread/thread/65d6d26eb381386e", TipoEvento.Van);
 
             Assert.AreEqual(0, agenda.GetEventosActivos(EventoPropuestoState.GetInstance()).Count);
@@ -209,9 +209,11 @@
             Assert.AreEqual(1, eventos.Count);
 
             var evento = eventos[0];
-            Assert.IsNotNull(evento.Ponente);
 
-            var delete = personaService.Delete(evento.Ponente.Id);
+        	var ponente = evento.Ponentes.FirstOrDefault();
+            Assert.IsNotNull(ponente);
+
+            var delete = personaService.Delete(ponente.Id);
             Assert.IsFalse(delete.Succeful);
         }
 	}
--- a/Agendas/trunk/src/Agendas.Tests/PonentesTests.cs	Wed Sep 28 20:02:44 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/PonentesTests.cs	Tue Oct 04 20:42:35 2011 -0300
@@ -22,12 +22,12 @@
             var fechaInicioNHibernate = new DateTime(2011, 2, 26, 18, 0, 0, DateTimeKind.Utc);
             var fechaTerminoNHibernate = fechaInicioNHibernate.AddHours(2);
 
-            agenda.Agendar("Audit (parallel model) con NHibernate 3", TestsHelper.GetOrCreatePonente("Fabio Maulo"),
+            agenda.Agendar("Audit (parallel model) con NHibernate 3", new[]{TestsHelper.GetOrCreatePonente("Fabio Maulo")}, 
                            fechaInicioNHibernate, fechaTerminoNHibernate, urlInvitacion, TipoEvento.Van);
             
             var fechaInicioConform = new DateTime(2011, 3, 5, 18, 0, 0, DateTimeKind.Utc);
             var fechaTerminoConform = fechaInicioNHibernate.AddHours(2);
-            agenda.Agendar("Conform - Parte 2", TestsHelper.GetOrCreatePonente("Fabio Maulo"), fechaInicioConform,
+            agenda.Agendar("Conform - Parte 2", new[]{TestsHelper.GetOrCreatePonente("Fabio Maulo")},  fechaInicioConform,
                            fechaTerminoConform, urlInvitacion, TipoEvento.Van);
 
             var eventos = agenda.GetEventosActivos();
@@ -39,7 +39,8 @@
 
             var evento = eventos[0];
 
-            Assert.IsNotNull(evento.Ponente);
+			Assert.IsNotNull(evento.Ponentes);
+			Assert.AreEqual(1, evento.Ponentes.Count());
         }
 
         [Test]
@@ -55,7 +56,7 @@
             agenda.RegistrarPonente("Fabio Maulo", "fabiomaulo@gmail.com", "@fabiomaulo", "http://fabiomaulo.blogspot.com");
             var fechaInicio = new DateTime(2011, 2, 26, 18, 0, 0, DateTimeKind.Utc);
             var fechaTermino = fechaInicio.AddHours(2);
-            agenda.Agendar("Audit (parallel model) con NHibernate 3", TestsHelper.GetOrCreatePonente("Fabio Maulo"),
+            agenda.Agendar("Audit (parallel model) con NHibernate 3", new[]{TestsHelper.GetOrCreatePonente("Fabio Maulo")}, 
                            fechaInicio, fechaTermino, urlInvitacion, TipoEvento.Van);
 
             Assert.AreEqual(1, agenda.GetEventosActivos().Count);
@@ -63,10 +64,11 @@
             publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
 
             Assert.IsNotNull(evento);
-            Assert.AreEqual("Fabio Maulo", evento.Ponente.Nombre);
-            Assert.AreEqual("fabiomaulo@gmail.com", evento.Ponente.Mail);
-            Assert.AreEqual("@fabiomaulo", evento.Ponente.Twitter);
-            Assert.AreEqual("http://fabiomaulo.blogspot.com", evento.Ponente.Blog);
+        	var ponente = evento.Ponentes.First();
+            Assert.AreEqual("Fabio Maulo", ponente.Nombre);
+            Assert.AreEqual("fabiomaulo@gmail.com", ponente.Mail);
+            Assert.AreEqual("@fabiomaulo", ponente.Twitter);
+            Assert.AreEqual("http://fabiomaulo.blogspot.com", ponente.Blog);
         }
 
         [Test]
@@ -81,7 +83,7 @@
 
             var fechaInicio = new DateTime(2011, 2, 26, 18, 0, 0, DateTimeKind.Utc);
             var fechaTermino = fechaInicio.AddHours(2);
-            agenda.Agendar("Audit (parallel model) con NHibernate 3", TestsHelper.GetOrCreatePonente("Fabio Maulo"),
+            agenda.Agendar("Audit (parallel model) con NHibernate 3", new[]{TestsHelper.GetOrCreatePonente("Fabio Maulo")}, 
                            fechaInicio, fechaTermino, urlInvitacion, TipoEvento.Van);
 
             Assert.AreEqual(1, agenda.GetEventosActivos().Count);
@@ -89,8 +91,9 @@
             publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
 
             Assert.IsNotNull(evento);
-            Assert.AreEqual("Fabio Maulo", evento.Ponente.Nombre);
-            Assert.AreEqual("fabiomaulo", evento.Ponente.Twitter);
+			var ponente = evento.Ponentes.First();
+            Assert.AreEqual("Fabio Maulo", ponente.Nombre);
+            Assert.AreEqual("fabiomaulo", ponente.Twitter);
         }
 
         [Test]
@@ -103,7 +106,7 @@
 
         	DateTime fechaInicio=DateTime.Now;
 
-        	var r = agenda.Agendar(titulo, TestsHelper.GetOrCreatePonente("Fabio"), fechaInicio, fechaInicio.AddHours(2), urlInvitacion, TipoEvento.Van);
+        	var r = agenda.Agendar(titulo, new[]{TestsHelper.GetOrCreatePonente("Fabio")}, fechaInicio, fechaInicio.AddHours(2), urlInvitacion, TipoEvento.Van);
         	{
 				Assert.IsTrue(r.Succeful);
 
@@ -111,12 +114,13 @@
                 Assert.AreEqual(1, eventos.Count);
 
                 Evento evento = eventos[0];
-                Assert.AreEqual("Fabio", evento.Ponente.Nombre);
+				var ponente = evento.Ponentes.First();
+				Assert.AreEqual("Fabio", ponente.Nombre);
 
                 eventoId = evento.Id;
             }
 
-        	r = agenda.ModificarEvento(eventoId, titulo, Guid.Empty, fechaInicio, fechaInicio.AddHours(2), urlInvitacion);
+        	r = agenda.ModificarEvento(eventoId, titulo, new[]{Guid.Empty}, fechaInicio, fechaInicio.AddHours(2), urlInvitacion);
 			Assert.IsFalse(r.Succeful);
 
         }
@@ -131,7 +135,7 @@
 
 			DateTime fechaInicio = DateTime.Now;
 
-			var r = agenda.Agendar(titulo, TestsHelper.GetOrCreatePonente("Fabio"), fechaInicio, fechaInicio.AddHours(2), urlInvitacion, TipoEvento.Cafe);
+			var r = agenda.Agendar(titulo, new[]{TestsHelper.GetOrCreatePonente("Fabio")}, fechaInicio, fechaInicio.AddHours(2), urlInvitacion, TipoEvento.Cafe);
 			{
 				Assert.IsTrue(r.Succeful);
 
@@ -139,12 +143,13 @@
 				Assert.AreEqual(1, eventos.Count);
 
 				Evento evento = eventos[0];
-				Assert.AreEqual("Fabio", evento.Ponente.Nombre);
+				var ponente = evento.Ponentes.First();
+				Assert.AreEqual("Fabio", ponente.Nombre);
 
 				eventoId = evento.Id;
 			}
 
-			r = agenda.ModificarEvento(eventoId, titulo, Guid.Empty, fechaInicio, fechaInicio.AddHours(2), urlInvitacion);
+			r = agenda.ModificarEvento(eventoId, titulo, new[]{Guid.Empty}, fechaInicio, fechaInicio.AddHours(2), urlInvitacion);
 			{
 				Console.WriteLine(r.Message);
 				Assert.IsTrue(r.Succeful);
@@ -153,7 +158,7 @@
 				Assert.AreEqual(1, eventos.Count);
 
 				Evento evento = eventos[0];
-				Assert.IsNull(evento.Ponente);
+				Assert.AreEqual(0, evento.Ponentes.Count());
 			}
 		}
 
@@ -165,25 +170,25 @@
             const string titulo = "Audit (parallel model) con NHibernate 3";
             Guid eventoId;
 
-            agenda.Proponer(titulo, TestsHelper.GetOrCreatePonente("Fabio"), urlInvitacion, TipoEvento.Van);
+            agenda.Proponer(titulo, new[]{TestsHelper.GetOrCreatePonente("Fabio")}, urlInvitacion, TipoEvento.Van);
             {
                 var eventos = agenda.GetEventosActivos(EventoPropuestoState.GetInstance());
                 Assert.AreEqual(1, eventos.Count);
 
                 Evento evento = eventos[0];
-                Assert.AreEqual("Fabio", evento.Ponente.Nombre);
+				Assert.IsTrue(evento.Ponentes.Any(p => p.Nombre == "Fabio"));
 
                 eventoId = evento.Id;
             }
 
-            agenda.ModificarPropuesta(eventoId, titulo, TestsHelper.GetOrCreatePonente("José"), urlInvitacion);
+            agenda.ModificarPropuesta(eventoId, titulo, new[]{TestsHelper.GetOrCreatePonente("José")}, urlInvitacion);
             {
                 var eventos = agenda.GetEventosActivos(EventoPropuestoState.GetInstance());
                 Assert.AreEqual(1, eventos.Count);
 
                 Evento evento = eventos[0];
-                Assert.IsNotNull(evento.Ponente);
-            }
+				Assert.IsTrue(evento.Ponentes.Any(p => p.Nombre == "José"));
+			}
         }
     }
 }
\ No newline at end of file
--- a/Agendas/trunk/src/Agendas.Tests/PropuestasTests.cs	Wed Sep 28 20:02:44 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/PropuestasTests.cs	Tue Oct 04 20:42:35 2011 -0300
@@ -28,19 +28,21 @@
 				Assert.AreEqual(0, eventosAgendados.Count);
 
 				var evento = eventosPropuestos.FirstOrDefault();
-                agenda.ModificarPropuesta(evento.Id, "Van 2", TestsHelper.GetOrCreatePonente("otro ponente"), urlInvitacion);
+                agenda.ModificarPropuesta(evento.Id, "Van 2", new[]{TestsHelper.GetOrCreatePonente("otro ponente")}, urlInvitacion);
 
 				eventosPropuestos = agenda.GetEventosActivos(EventoPropuestoState.GetInstance());
 				Assert.AreEqual(1, eventosPropuestos.Count);
 
 				evento = eventosPropuestos.FirstOrDefault();
 				Assert.AreEqual("Van 2", evento.Titulo);
-				Assert.AreEqual("otro ponente", evento.Ponente.Nombre);
+
+				var ponente = evento.Ponentes.First();
+				Assert.AreEqual("otro ponente", ponente.Nombre);
 			}
 
 		    var fechaInicio = DateTime.Now.ToUniversalTime();
 		    var fechaTermino = fechaInicio.AddHours(2);
-		    var r = agenda.Agendar("Van 2", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino,
+		    var r = agenda.Agendar("Van 2", new[]{TestsHelper.GetOrCreatePonente("jjmontes")}, fechaInicio, fechaTermino,
 		                           urlInvitacion, TipoEvento.Van);
 			Assert.IsTrue(r.Succeful);
 			{
@@ -64,11 +66,11 @@
 			{
 				var van = agenda.GetEventosActivos(EventoPropuestoState.GetInstance()).FirstOrDefault();
 				Assert.IsNotNull(van);
-			    var r = agenda.Agendar(van.Titulo, TestsHelper.GetOrCreatePonente("Ponente"), null, null,
+			    var r = agenda.Agendar(van.Titulo,new[]{ TestsHelper.GetOrCreatePonente("Ponente")}, null, null,
 			                           urlInvitacion, TipoEvento.Van);
 				Assert.IsFalse(r.Succeful);
 				
-				r = agenda.Agendar(van.Titulo, TestsHelper.GetOrCreatePonente("Ponente"), DateTime.MinValue, null,
+				r = agenda.Agendar(van.Titulo, new[]{TestsHelper.GetOrCreatePonente("Ponente")}, DateTime.MinValue, null,
 									   urlInvitacion, TipoEvento.Van);
 				Assert.IsFalse(r.Succeful);
 			}
@@ -89,8 +91,8 @@
 
 			    var fechaInicio = DateTime.Today.AddDays(5).ToUniversalTime();
 			    var fechaTermino = fechaInicio.AddHours(2);
-			    van.Actualizar(null, fechaInicio, fechaTermino, urlInvitacion);
-			    var r = agenda.Agendar(van.Titulo, Guid.Empty, van.FechaInicio, van.FechaTermino,
+			    van.Actualizar(fechaInicio, fechaTermino, urlInvitacion);
+			    var r = agenda.Agendar(van.Titulo, new[]{Guid.Empty}, van.FechaInicio, van.FechaTermino,
 			                           urlInvitacion, TipoEvento.Van);
 				Assert.IsFalse(r.Succeful);
 			}
@@ -149,7 +151,7 @@
 			agenda.Proponer("Van propuesta", null, urlInvitacion, TipoEvento.Van);
 		    var fechaInicio = DateTime.Now.ToUniversalTime();
 		    var fechaTermino = fechaInicio.AddHours(2);
-		    var r = agenda.Agendar("Van publicada", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino,
+		    var r = agenda.Agendar("Van publicada", new[]{TestsHelper.GetOrCreatePonente("jjmontes")}, fechaInicio, fechaTermino,
 		                           urlInvitacion, TipoEvento.Van);
 			Assert.IsTrue(r.Succeful);
 
--- a/Agendas/trunk/src/Agendas.Tests/TrackTests.cs	Wed Sep 28 20:02:44 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/TrackTests.cs	Tue Oct 04 20:42:35 2011 -0300
@@ -19,7 +19,7 @@
 
             var fechaInicio = DateTime.Now.AddDays(5).ToUniversalTime();
             var fechaTermino = fechaInicio.AddHours(2);
-            agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino, urlInvitacion, TipoEvento.Van);
+            agenda.Agendar("Html 5", new[]{TestsHelper.GetOrCreatePonente("jjmontes")}, fechaInicio, fechaTermino, urlInvitacion, TipoEvento.Van);
             var evento = repository.GetActivos().First();
 
             Assert.AreEqual(1, evento.Tracks.Count());
@@ -29,7 +29,10 @@
             Assert.IsNotNull(ultimo.Usuario);
             Assert.AreEqual("Nelo Pauselli", ultimo.Usuario.Nombre);
 
-            agenda.ModificarEvento(evento.Id, "Html 5", TestsHelper.GetOrCreatePonente("otro ponente"), fechaInicio, fechaTermino, urlInvitacion);
+            var r = agenda.ModificarEvento(evento.Id, "Html 5", new[]{TestsHelper.GetOrCreatePonente("otro ponente")}, fechaInicio, fechaTermino, urlInvitacion);
+			Console.WriteLine(r.Message);
+			Assert.IsTrue(r.Succeful);
+
             Assert.AreEqual(2, evento.Tracks.Count());
             ultimo = evento.Tracks.Last();
             Assert.AreEqual(evento, ultimo.Evento);
@@ -37,7 +40,7 @@
             Assert.IsNotNull(ultimo.Usuario);
             Assert.AreEqual("Nelo Pauselli", ultimo.Usuario.Nombre);
 
-            agenda.ModificarEvento(evento.Id, "Html 5 y Css 3", TestsHelper.GetOrCreatePonente("otro ponente"), fechaInicio, fechaTermino, urlInvitacion);
+            agenda.ModificarEvento(evento.Id, "Html 5 y Css 3", new[]{TestsHelper.GetOrCreatePonente("otro ponente")}, fechaInicio, fechaTermino, urlInvitacion);
             Assert.AreEqual(3, evento.Tracks.Count());
             ultimo = evento.Tracks.Last();
             Assert.AreEqual(evento, ultimo.Evento);
@@ -55,7 +58,7 @@
             var fechaInicio = DateTime.Now.ToUniversalTime();
             var fechaTermino = fechaInicio.AddHours(2);
 
-			agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino,
+			agenda.Agendar("Html 5",new[]{ TestsHelper.GetOrCreatePonente("jjmontes")}, fechaInicio, fechaTermino,
                            urlInvitacion, TipoEvento.Van);
             var evento = repository.GetActivos().First();
 
--- a/Agendas/trunk/src/Agendas.Twitter.Tests/Publicador_tests.cs	Wed Sep 28 20:02:44 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Twitter.Tests/Publicador_tests.cs	Tue Oct 04 20:42:35 2011 -0300
@@ -50,7 +50,7 @@
 
 			adapter.Verify(a => a.Update(It.IsAny<string>(), out message), Times.Once());
 
-		    agenda.Agendar("Identity Providers", TestsHelper.GetOrCreatePonente("Nelo Pauselli"), fechaInicio, fechaTermino,
+		    agenda.Agendar("Identity Providers", new[]{TestsHelper.GetOrCreatePonente("Nelo Pauselli")}, fechaInicio, fechaTermino,
 		                   null, TipoEvento.GrupoEstudio);
 
 			adapter.Verify(a => a.Update(It.IsAny<string>(), out message), Times.Exactly(2));
@@ -71,17 +71,19 @@
 			var publicador = new TwitterPublicador(adapter.Object);
 			var agenda = new Agenda(publicador, DefaultEventoRepository, DefaultPersonaRepository);
 
-			var ponente = new Persona("Carlos Peix", "carlospeix@gmail.com", "carlospeix", "http://www.carlospeix.com.ar");
-			DefaultPersonaRepository.Save(ponente);
+			var ponentes = new[]
+			               	{
+			               		new Persona("Carlos Peix", "carlospeix@gmail.com", "carlospeix", "http://www.carlospeix.com.ar"),
+			               		new Persona("Nelo Pauselli", "nelopauselli@gmail.com", "nelopauselli",
+			               		            "http://nelopauselli.blogspot.com/")
+			               	};
 
-			var otrosPonentes = new Persona("Nelo Pauselli", "nelopauselli@gmail.com", "nelopauselli",
-			                                "http://nelopauselli.blogspot.com/");
-			DefaultPersonaRepository.Save(otrosPonentes);
+			foreach (var ponente in ponentes)
+				DefaultPersonaRepository.Save(ponente);
 
 			var inicio = DateTime.Now.AddDays(3);
 
-			agenda.Agendar("Identity Providers Públicos y Empresariales", ponente.Id, inicio, inicio.AddHours(2), null, TipoEvento.Van,
-			               new[] {otrosPonentes.Id});
+			agenda.Agendar("Identity Providers Públicos y Empresariales", ponentes.Select(p=>p.Id), inicio, inicio.AddHours(2), null, TipoEvento.Van);
 
 			Assert.IsTrue(twitters.Any());
 			var joined = string.Empty;
@@ -117,7 +119,7 @@
 
 			var inicio = DateTime.Now.AddDays(3);
 
-			agenda.Agendar("Identity Providers Públicos y Empresariales", Guid.Empty, inicio, inicio.AddHours(2), null, TipoEvento.Cafe);
+			agenda.Agendar("Identity Providers Públicos y Empresariales",new[]{ Guid.Empty}, inicio, inicio.AddHours(2), null, TipoEvento.Cafe);
 
 			Assert.IsTrue(twitters.Any());
 			var joined = string.Empty;
--- a/Agendas/trunk/src/Agendas.Twitter.Tests/Recordatorios_tests.cs	Wed Sep 28 20:02:44 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Twitter.Tests/Recordatorios_tests.cs	Tue Oct 04 20:42:35 2011 -0300
@@ -20,7 +20,7 @@
 			DefaultPersonaRepository.Save(ponente);
 
 			DateTime inicio=DateTime.Today.AddDays(7).AddHours(18);
-			var resultado = agenda.Agendar("Node.js", ponente.Id, inicio, inicio.AddHours(2), string.Empty, TipoEvento.Van);
+			var resultado = agenda.Agendar("Node.js", new[]{ponente.Id}, inicio, inicio.AddHours(2), string.Empty, TipoEvento.Van);
 
 			Assert.IsTrue(resultado.Succeful);
 
--- a/Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj	Wed Sep 28 20:02:44 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Agendas.Web.csproj	Tue Oct 04 20:42:35 2011 -0300
@@ -247,7 +247,7 @@
     <Content Include="Views\PersonaApi\Nueva.cshtml" />
   </ItemGroup>
   <ItemGroup>
-    <Content Include="Views\Shared\EditorTemplates\OtrosPonentes.cshtml" />
+    <Content Include="Views\Shared\EditorTemplates\Ponentes.cshtml" />
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v10.0\WebApplications\Microsoft.WebApplication.targets" />
--- a/Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs	Wed Sep 28 20:02:44 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs	Tue Oct 04 20:42:35 2011 -0300
@@ -59,9 +59,9 @@
 		{
 		    return
 		        GenericAction(
-		            (agenda, m) => agenda.Agendar(m.Titulo, m.Ponente, GenerarFechaInicio(m.Fecha, m.Hora),
+					(agenda, m) => agenda.Agendar(m.Titulo, model.Ponentes, GenerarFechaInicio(m.Fecha, m.Hora),
 		                                          GenerarFechaTermino(m.Fecha, m.Hora, m.Duracion), m.UrlInvitacion,
-		                                          (TipoEvento) m.TipoEvento, model.OtrosPonentes),
+		                                          (TipoEvento) m.TipoEvento),
 		            m => View("Defaulteditor", m),
 		            model);
 		}
@@ -130,7 +130,7 @@
 			{
 				Id = id,
 				Titulo = evento.Titulo,
-				Ponente = evento.Ponente != null ? evento.Ponente.Id : Guid.Empty,
+				Ponentes = evento.Ponentes.Select(p=>p.Id),
 				Fecha = evento.FechaInicio,
                 Hora = evento.FechaInicio != null ? evento.FechaInicio.Value.TimeOfDay : (TimeSpan?)null,
                 Duracion = evento.FechaInicio!=null && evento.FechaTermino!=null ? evento.FechaTermino.Value.Subtract(evento.FechaInicio.Value) : (TimeSpan?) null,
@@ -146,7 +146,7 @@
 		    return
 		        GenericAction(
 		            (agenda, m) =>
-		            agenda.ModificarEvento(new Guid(m.Id), m.Titulo, m.Ponente, GenerarFechaInicio(m.Fecha, m.Hora),
+		            agenda.ModificarEvento(new Guid(m.Id), m.Titulo, m.Ponentes, GenerarFechaInicio(m.Fecha, m.Hora),
 		                                   GenerarFechaTermino(m.Fecha, m.Hora, m.Duracion), m.UrlInvitacion),
 		            m => View("Defaulteditor", m),
 		            model);
@@ -162,7 +162,7 @@
 			{
 				Id = id,
 				Titulo = evento.Titulo,
-				Ponente = evento.Ponente != null ? evento.Ponente.Id : Guid.Empty,
+				Ponentes = evento.Ponentes.Select(p=>p.Id),
 				Fecha = evento.FechaInicio,
                 Hora = evento.FechaInicio != null ? evento.FechaInicio.Value.TimeOfDay : (TimeSpan?)null,
                 Duracion = evento.FechaInicio != null && evento.FechaTermino != null ? evento.FechaTermino.Value.Subtract(evento.FechaInicio.Value) : (TimeSpan?)null,
@@ -178,7 +178,7 @@
 		    return
 		        GenericAction(
 		            (agenda, m) =>
-		            agenda.ModificarEvento(new Guid(m.Id), m.Titulo, m.Ponente, GenerarFechaInicio(m.Fecha, m.Hora),
+		            agenda.ModificarEvento(new Guid(m.Id), m.Titulo, m.Ponentes, GenerarFechaInicio(m.Fecha, m.Hora),
 		                                   GenerarFechaTermino(m.Fecha, m.Hora, m.Duracion), m.UrlInvitacion),
 		            m => View("Defaulteditor", m),
 		            model);
@@ -197,7 +197,7 @@
 		{
 			return
 				GenericAction(
-					(agenda, m) => agenda.Proponer(m.Titulo, m.Ponente, m.UrlInvitacion, (TipoEvento)m.TipoEvento),
+					(agenda, m) => agenda.Proponer(m.Titulo, m.Ponentes, m.UrlInvitacion, (TipoEvento)m.TipoEvento),
 					m => View("Defaulteditor", m),
 					model);
 		}
--- a/Agendas/trunk/src/Agendas.Web/Models/EventoModel.cs	Wed Sep 28 20:02:44 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Models/EventoModel.cs	Tue Oct 04 20:42:35 2011 -0300
@@ -20,9 +20,7 @@
 		[Required]
 		public string Titulo { get; set; }
 
-        public Guid Ponente { get; set; }
-
-		public Guid[] OtrosPonentes { get; set; }
+		public IEnumerable<Guid> Ponentes { get; set; }
 
 		[Required]
 		public DateTime Fecha { get; set; }
@@ -45,8 +43,6 @@
 		[Required]
 		public string Titulo { get; set; }
 
-        public Guid Ponente { get; set; }
-
 		[Required]
 		public DateTime? Fecha { get; set; }
 
@@ -58,6 +54,8 @@
 
 		[Url]
 		public string UrlInvitacion { get; set; }
+
+		public IEnumerable<Guid> Ponentes { get; set; }
 	}
 
 	public class EventoAgendarModel
@@ -68,7 +66,7 @@
 		[Required]
 		public string Titulo { get; set; }
 
-        public Guid Ponente { get; set; }
+		public IEnumerable<Guid> Ponentes { get; set; }
 
 		[Required]
 		public DateTime? Fecha { get; set; }
--- a/Agendas/trunk/src/Agendas.Web/Models/PropuestaModel.cs	Wed Sep 28 20:02:44 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Models/PropuestaModel.cs	Tue Oct 04 20:42:35 2011 -0300
@@ -1,7 +1,6 @@
 using System;
 using System.Collections.Generic;
 using System.ComponentModel.DataAnnotations;
-using System.Web.Mvc;
 using DataAnnotationsExtensions;
 
 namespace AltNetHispano.Agendas.Web.Models
@@ -14,7 +13,7 @@
 		[Required]
 		public string Titulo { get; set; }
 
-        public Guid Ponente { get; set; }
+		public IEnumerable<Guid> Ponentes { get; set; }
 
 		[Url]
 		public string UrlInvitacion { get; set; }
--- a/Agendas/trunk/src/Agendas.Web/Views/Shared/EditorTemplates/OtrosPonentes.cshtml	Wed Sep 28 20:02:44 2011 -0300
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,70 +0,0 @@
-@model IEnumerable<Guid>
-<script type="text/javascript">
-	$(document).ready(function () {
-		$("#agregarOtroPonente").subpanel({ success: add_new_otro_ponente, url: '/PersonaApi/Nueva' });
-		$("#add").click(select_otro_ponente);
-		$("#remove").click(remove_otro_ponente);
-
-		var width = $("#posiblesOtrosPonentes").width();
-		$("#OtrosPonentes").width(width);
-	});
-
-	function add_new_otro_ponente(data) {
-		if (data.Succeful) {
-			var opcion = $("<option></option>").attr("value", data.Id).attr("selected", "selected").html(data.Nombre);
-			add_otro_ponente(opcion);
-		}
-		else {
-			alert(data.Message);
-			return false;
-		}
-	}
-
-	function select_otro_ponente(event) {
-		event.preventDefault();
-		var personas = $("#posiblesOtrosPonentes");
-		var current = $("option:selected", personas);
-		add_otro_ponente(current);
-	}
-
-	function add_otro_ponente(option) {
-		var OtrosPonentes = $("#OtrosPonentes");
-		option.appendTo(OtrosPonentes);
-	}
-
-	function remove_otro_ponente(event) {
-		event.preventDefault();
-
-		$("option:selected", $("#OtrosPonentes")).each(function () {
-			var current = $(this);
-			var posiblesOtrosPonentes = $("#posiblesOtrosPonentes");
-			current.appendTo(posiblesOtrosPonentes);
-
-			// ordenamos los ponentes
-			var options = $("option", posiblesOtrosPonentes);
-
-			options.sort(function (a, b) {
-				if (a.text > b.text) return 1;
-				else if (a.text < b.text) return -1;
-				else return 0
-			});
-
-			posiblesOtrosPonentes.empty().append(options);
-
-			posiblesOtrosPonentes.attr("value", current.val());
-		});
-	}
-</script>
-@Html.ListBox(string.Empty, Html.GetOtrosPonentes(Model), new { style = "vertical-align: top;" })
-<div style="display: inline-block">
-	<div>
-		<a class="ajax-button ui-state-default ui-corner-all" id="add"><span class="ui-icon ui-icon-triangle-1-w"></span></a>
-		@Html.DropDownList("posiblesOtrosPonentes", Html.GetOtrosPonentesExcepto(Model), new { style = "vertical-align: top;", id = "posiblesOtrosPonentes" })
-	</div>
-	<div>
-		<a class="ajax-button ui-state-default ui-corner-all" id="remove"><span class="ui-icon ui-icon-triangle-1-e"></span></a>
-	</div>
-	<div>
-		<div id="agregarOtroPonente"></div>
-	</div>
-</div>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/Agendas/trunk/src/Agendas.Web/Views/Shared/EditorTemplates/Ponentes.cshtml	Tue Oct 04 20:42:35 2011 -0300
@@ -0,0 +1,70 @@
+@model IEnumerable<Guid>
+<script type="text/javascript">
+	$(document).ready(function () {
+		$("#agregarOtroPonente").subpanel({ success: add_new_otro_ponente, url: '/PersonaApi/Nueva' });
+		$("#add").click(select_otro_ponente);
+		$("#remove").click(remove_otro_ponente);
+
+		var width = $("#posiblesOtrosPonentes").width();
+		$("#OtrosPonentes").width(width);
+	});
+
+	function add_new_otro_ponente(data) {
+		if (data.Succeful) {
+			var opcion = $("<option></option>").attr("value", data.Id).attr("selected", "selected").html(data.Nombre);
+			add_otro_ponente(opcion);
+		}
+		else {
+			alert(data.Message);
+			return false;
+		}
+	}
+
+	function select_otro_ponente(event) {
+		event.preventDefault();
+		var personas = $("#posiblesOtrosPonentes");
+		var current = $("option:selected", personas);
+		add_otro_ponente(current);
+	}
+
+	function add_otro_ponente(option) {
+		var OtrosPonentes = $("#OtrosPonentes");
+		option.appendTo(OtrosPonentes);
+	}
+
+	function remove_otro_ponente(event) {
+		event.preventDefault();
+
+		$("option:selected", $("#OtrosPonentes")).each(function () {
+			var current = $(this);
+			var posiblesOtrosPonentes = $("#posiblesOtrosPonentes");
+			current.appendTo(posiblesOtrosPonentes);
+
+			// ordenamos los ponentes
+			var options = $("option", posiblesOtrosPonentes);
+
+			options.sort(function (a, b) {
+				if (a.text > b.text) return 1;
+				else if (a.text < b.text) return -1;
+				else return 0
+			});
+
+			posiblesOtrosPonentes.empty().append(options);
+
+			posiblesOtrosPonentes.attr("value", current.val());
+		});
+	}
+</script>
+@Html.ListBox(string.Empty, Html.GetOtrosPonentes(Model), new { style = "vertical-align: top;" })
+<div style="display: inline-block">
+	<div>
+		<a class="ajax-button ui-state-default ui-corner-all" id="add"><span class="ui-icon ui-icon-triangle-1-w"></span></a>
+		@Html.DropDownList("posiblesOtrosPonentes", Html.GetOtrosPonentesExcepto(Model), new { style = "vertical-align: top;", id = "posiblesOtrosPonentes" })
+	</div>
+	<div>
+		<a class="ajax-button ui-state-default ui-corner-all" id="remove"><span class="ui-icon ui-icon-triangle-1-e"></span></a>
+	</div>
+	<div>
+		<div id="agregarOtroPonente"></div>
+	</div>
+</div>
\ No newline at end of file