changeset 185:2d02adb79322

Se agrega fecha de termino de un Evento y se incluye la hora a la fecha de inicio. Se modifica la propiedad Fecha del Evento, renombrandola FechaInicio. En el ModelView se agrega propiedades Duración y Hora del Evento cuando es Modificado, Nuevo y Agendado. Las fechas ingresadas son creadas en sistema UTC Queda pendiente Agregar duración a Google Calendar.
author alabra
date Tue, 09 Aug 2011 01:04:27 -0400
parents 2a336a6a76b5
children 49125b681709
files Agendas/trunk/src/Agendas.Blog/Impl/AgendarReunionPostWriter.cs 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.Google/DetailsEvents/CafeGEventDetail.cs Agendas/trunk/src/Agendas.Google/DetailsEvents/EstudioGEventDetail.cs Agendas/trunk/src/Agendas.Google/DetailsEvents/VanGEventDetail.cs Agendas/trunk/src/Agendas.Google/GooglePublicador.cs Agendas/trunk/src/Agendas.Resources/Properties/DataAnnotationResources.Designer.cs Agendas/trunk/src/Agendas.Resources/Properties/DataAnnotationResources.resx Agendas/trunk/src/Agendas.Tests/AgendarTests.cs Agendas/trunk/src/Agendas.Tests/Cruds/EventoCrud.cs Agendas/trunk/src/Agendas.Tests/Eventos_y_patrocinadores_tests.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.Tests/Workflows/Workflow.cs Agendas/trunk/src/Agendas.Twitter.Tests/Publicador_tests.cs Agendas/trunk/src/Agendas.Twitter/Writers/AgendarTwitterWriter.cs Agendas/trunk/src/Agendas.Twitter/Writers/ConfirmarTwitterWriter.cs Agendas/trunk/src/Agendas.Web/Controllers/CustomAuthorizeAttribute.cs Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs Agendas/trunk/src/Agendas.Web/Controllers/HistoricoController.cs Agendas/trunk/src/Agendas.Web/Models/EventoModel.cs Agendas/trunk/src/Agendas.Web/Views/Evento/Index.cshtml
diffstat 26 files changed, 414 insertions(+), 221 deletions(-) [+]
line wrap: on
line diff
--- a/Agendas/trunk/src/Agendas.Blog/Impl/AgendarReunionPostWriter.cs	Mon Aug 08 22:32:12 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Blog/Impl/AgendarReunionPostWriter.cs	Tue Aug 09 01:04:27 2011 -0400
@@ -40,7 +40,7 @@
 		{
       string resourceName = getBodyResourceName(track);
 
-			var fecha = getFechaFormateada(track.Evento.Fecha);
+			var fecha = getFechaFormateada(track.Evento.FechaInicio);
       return string.Format(CultureInfo.InvariantCulture, resourceName,
 													 fecha, //Fecha y hora en GMT+0
 													 track.Evento.Ponente.Nombre, //Nombre y apellido del ponente
--- a/Agendas/trunk/src/Agendas.Domain/Agenda.cs	Mon Aug 08 22:32:12 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Agenda.cs	Tue Aug 09 01:04:27 2011 -0400
@@ -46,7 +46,7 @@
             return _eventosRepository.GetByState(EventoPublicadoState.GetInstance()) ?? new List<Evento>();
         }
 
-		public EventoResultado ModificarEvento(Guid eventoId, string titulo, Guid ponenteId, DateTime? fecha, string urlInvitacion)
+        public EventoResultado ModificarEvento(Guid eventoId, string titulo, Guid ponenteId, DateTime? fechaInicio, DateTime? fechaTermino, string urlInvitacion)
         {
             Evento evento = GetEvento(eventoId);
             Persona persona = _personaRepository.Get(ponenteId);
@@ -54,10 +54,11 @@
             if (evento.Titulo != titulo)
                 evento.CambiarTitulo(titulo);
 
-            if (evento.Fecha == null && fecha != null)
-                evento.Agendar(persona, fecha, urlInvitacion);
-            else if (evento.Fecha != fecha || evento.Ponente != persona || evento.UrlInvitacion != urlInvitacion)
-                evento.Actualizar(persona, fecha, urlInvitacion);
+            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);
 
             Notify(evento);
 
@@ -68,7 +69,7 @@
 
 		public EventoResultado ModificarPropuesta(Guid id, string titulo, Guid ponenteId, string urlInvitacion)
         {
-            return ModificarEvento(id, titulo, ponenteId, null, urlInvitacion);
+            return ModificarEvento(id, titulo, ponenteId, null, null, urlInvitacion);
         }
 
 		public EventoResultado Proponer(string titulo, Guid? ponenteId, string urlInvitacion, TipoEvento tipo)
@@ -91,20 +92,22 @@
 			return new EventoResultado(true,"Evento propuesto", warnings);
 		}
 
-		public EventoResultado Agendar(string titulo, Guid ponenteId, DateTime? fecha, string urlInvitacion, TipoEvento tipo)
+		public EventoResultado Agendar(string titulo, Guid ponenteId, DateTime? fechaInicio, DateTime? fechaTermino, string urlInvitacion, TipoEvento tipo)
         {
-            if (!fecha.HasValue)
+            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);
 
             Persona persona = _personaRepository.Get(ponenteId);
             if (persona == null)
-				return new EventoResultado(false, string.Format("No se encontró el ponente indicado ({0})", ponenteId), null);
+                return new EventoResultado(false, string.Format("No se encontró el ponente indicado ({0})", ponenteId), null);
 
             Evento evento = _eventosRepository.GetPropuestaByTitulo(titulo);
             if (evento == null)
-                evento = Evento.Agendar(titulo, persona, fecha.Value, urlInvitacion, tipo);
+                evento = Evento.Agendar(titulo, persona, fechaInicio.Value, fechaTermino.Value, urlInvitacion, tipo);
             else
-                evento.Agendar(persona, fecha, urlInvitacion);
+                evento.Agendar(persona, fechaInicio, fechaTermino, urlInvitacion);
 
             Notify(evento);
 
--- a/Agendas/trunk/src/Agendas.Domain/Evento.cs	Mon Aug 08 22:32:12 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Domain/Evento.cs	Tue Aug 09 01:04:27 2011 -0400
@@ -25,9 +25,14 @@
 		/// <summary>
 		/// Fecha para la que se encuentra agendado el evento
 		/// </summary>
-		public virtual DateTime? Fecha { get; private set; }
+		public virtual DateTime? FechaInicio { get; private set; }
 
-		/// <summary>
+        /// <summary>
+        /// Fecha de termino o finalización del evento.
+        /// </summary>
+        public virtual DateTime? FechaTermino { 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; }
@@ -118,41 +123,45 @@
 			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)
+	    /// <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="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)
 		{
 			var evento = new Evento { Titulo = titulo, Tipo = tipo };
-			evento.Agendar(persona, fecha, urlInvitacion);
+			evento.Agendar(persona, fechaInicio, fechaTermino, 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)
+	    /// <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)
 		{
 			Ponente = persona;
-			Fecha = fecha;
+            FechaInicio = fechaInicio;
+	        FechaTermino = fechaTermino;
 			UrlInvitacion = urlInvitacion;
 			Estado.Promover(this, Accion.Agendar);
 		}
 
-		public virtual void Actualizar(Persona persona, DateTime? fecha, string urlInvitacion)
+		public virtual void Actualizar(Persona persona, DateTime? fechaInicio, DateTime? fechaTermino, string urlInvitacion)
 		{
 			Ponente = persona;
-			Fecha = fecha;
+			FechaInicio = fechaInicio;
+		    FechaTermino = fechaTermino;
 			UrlInvitacion = urlInvitacion;
 
 			AddTrack(new Track(this, Accion.Modificar));
--- a/Agendas/trunk/src/Agendas.Google.Test/GCalendarTest.cs	Mon Aug 08 22:32:12 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Google.Test/GCalendarTest.cs	Tue Aug 09 01:04:27 2011 -0400
@@ -10,13 +10,14 @@
     [TestFixture]
     public class GCalendarTest : TestBase
     {
-        private readonly DateTime _fechaEvento = new DateTime(2011, 07, 16);
+        private readonly DateTime _fechaEvento = new DateTime(2011, 07, 16, 18, 0, 0, DateTimeKind.Utc);
+        private readonly DateTime _fechaTermino = new DateTime(2011, 07, 16, 20, 0, 0, DateTimeKind.Utc);
 
         [Test]
         public void CrearEventoGoogleCalendar()
         {
             var gCalendar = new GCalendarAdapter("VAN");
-            var ev = Evento.Agendar("Evento Test", null, _fechaEvento, "url", TipoEvento.Cafe);
+            var ev = Evento.Agendar("Evento Test", null, _fechaEvento, _fechaTermino, "url", TipoEvento.Cafe);
             string message;
             var detail = new CafeGEventDetail();
             detail.Generate(ev);
--- a/Agendas/trunk/src/Agendas.Google.Test/PublicadorTest.cs	Mon Aug 08 22:32:12 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Google.Test/PublicadorTest.cs	Tue Aug 09 01:04:27 2011 -0400
@@ -16,7 +16,9 @@
         public void CuandoPublicarEventoDadoAccionAgendarEntoncesEventoCreado()
         {
             var adapter = new Mock<IGCalendarAdapter>();
-            var message="";
+            string message;
+            var fechaInicio = new DateTime(2011, 07, 09, 18, 0, 0, DateTimeKind.Utc);
+            var fechaTermino = fechaInicio.AddHours(2);
             adapter.Setup(ad => ad.CreateEvent(It.IsAny<IGEventDetail>(), out message)).Returns(true);
 
             var publicador = new GooglePublicador(adapter.Object);
@@ -25,7 +27,10 @@
             agenda.Proponer("Agile Patterns", null, null, TipoEvento.Van);
             adapter.Verify(ad => ad.CreateEvent(It.IsAny<IGEventDetail>(), out message), Times.Never());
 
-            agenda.Agendar("Agile Patterns", TestsHelper.GetOrCreatePonente("Alejandro Labra"), new DateTime(2011, 07, 09), "https://groups.google.com/d/topic/altnet-hispano/arYEMsPiAtY/discussion", TipoEvento.Van);
+
+            agenda.Agendar("Agile Patterns", 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());
         }
 
@@ -34,11 +39,15 @@
         {
             var adapter = new Mock<IGCalendarAdapter>();
             var detail = new VanGEventDetail();
+            var fechaInicio = new DateTime(2011, 07, 09, 18, 0, 0, DateTimeKind.Utc);
+            var fechaTermino = fechaInicio.AddHours(2);
 
             var publicador = new GooglePublicador(adapter.Object);
 			var agenda = new Agenda(publicador, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
             agenda.Proponer("Agile Patterns", null, null, TipoEvento.Van);
-            agenda.Agendar("Agile Patterns", TestsHelper.GetOrCreatePonente("Alejandro Labra"), new DateTime(2011, 07, 09), "https://groups.google.com/d/topic/altnet-hispano/arYEMsPiAtY/discussion", TipoEvento.Van);
+            agenda.Agendar("Agile Patterns", TestsHelper.GetOrCreatePonente("Alejandro Labra"), fechaInicio,
+                           fechaTermino, "https://groups.google.com/d/topic/altnet-hispano/arYEMsPiAtY/discussion",
+                           TipoEvento.Van);
 
             var ev = DefaultEventoRepository.GetActivos()[0];
             detail.Generate(ev);
@@ -48,15 +57,15 @@
             
             Assert.AreEqual(DateTimeKind.Utc, detail.StartEvent.Kind);
             Assert.AreEqual(18, detail.StartEvent.Hour);
-            Assert.AreEqual(ev.Fecha.Value.Day, detail.StartEvent.Day);
-            Assert.AreEqual(ev.Fecha.Value.Month, detail.StartEvent.Month);
-            Assert.AreEqual(ev.Fecha.Value.Year, detail.StartEvent.Year);
+            Assert.AreEqual(ev.FechaInicio.Value.Day, detail.StartEvent.Day);
+            Assert.AreEqual(ev.FechaInicio.Value.Month, detail.StartEvent.Month);
+            Assert.AreEqual(ev.FechaInicio.Value.Year, detail.StartEvent.Year);
 
             Assert.AreEqual(DateTimeKind.Utc, detail.EndEvent.Kind);
             Assert.AreEqual(20, detail.EndEvent.Hour);
-            Assert.AreEqual(ev.Fecha.Value.Day, detail.EndEvent.Day);
-            Assert.AreEqual(ev.Fecha.Value.Month, detail.EndEvent.Month);
-            Assert.AreEqual(ev.Fecha.Value.Year, detail.EndEvent.Year);
+            Assert.AreEqual(ev.FechaInicio.Value.Day, detail.EndEvent.Day);
+            Assert.AreEqual(ev.FechaInicio.Value.Month, detail.EndEvent.Month);
+            Assert.AreEqual(ev.FechaInicio.Value.Year, detail.EndEvent.Year);
 
             Assert.AreEqual("La comunidad ALT.NET Hispano (http://altnethispano.org) realizará una VAN sobre Agile Patterns, con Alejandro Labra." +
                            "\n\rFecha: sábado, 09 de julio de 2011 a las 18:00 hrs. Hora Internacional (GMT/UTC), con una duración aproximada de 2 horas." +
@@ -70,11 +79,15 @@
         {
             var adapter = new Mock<IGCalendarAdapter>();
             var detail = new CafeGEventDetail();
+            var fechaInicio = new DateTime(2011, 07, 09, 18, 0, 0, DateTimeKind.Utc);
+            var fechaTermino = fechaInicio.AddHours(2);
 
             var publicador = new GooglePublicador(adapter.Object);
 			var agenda = new Agenda(publicador, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
             agenda.Proponer("Agile Patterns", null, null, TipoEvento.Cafe);
-            agenda.Agendar("Agile Patterns", TestsHelper.GetOrCreatePonente("Alejandro Labra"), new DateTime(2011, 07, 09), "https://groups.google.com/d/topic/altnet-hispano/arYEMsPiAtY/discussion", TipoEvento.Cafe);
+            agenda.Agendar("Agile Patterns", TestsHelper.GetOrCreatePonente("Alejandro Labra"), fechaInicio,
+                           fechaTermino, "https://groups.google.com/d/topic/altnet-hispano/arYEMsPiAtY/discussion",
+                           TipoEvento.Cafe);
 
             var ev = DefaultEventoRepository.GetActivos()[0];
             detail.Generate(ev);
@@ -84,15 +97,15 @@
 
             Assert.AreEqual(DateTimeKind.Utc, detail.StartEvent.Kind);
             Assert.AreEqual(18, detail.StartEvent.Hour);
-            Assert.AreEqual(ev.Fecha.Value.Day, detail.StartEvent.Day);
-            Assert.AreEqual(ev.Fecha.Value.Month, detail.StartEvent.Month);
-            Assert.AreEqual(ev.Fecha.Value.Year, detail.StartEvent.Year);
+            Assert.AreEqual(ev.FechaInicio.Value.Day, detail.StartEvent.Day);
+            Assert.AreEqual(ev.FechaInicio.Value.Month, detail.StartEvent.Month);
+            Assert.AreEqual(ev.FechaInicio.Value.Year, detail.StartEvent.Year);
 
             Assert.AreEqual(DateTimeKind.Utc, detail.EndEvent.Kind);
             Assert.AreEqual(20, detail.EndEvent.Hour);
-            Assert.AreEqual(ev.Fecha.Value.Day, detail.EndEvent.Day);
-            Assert.AreEqual(ev.Fecha.Value.Month, detail.EndEvent.Month);
-            Assert.AreEqual(ev.Fecha.Value.Year, detail.EndEvent.Year);
+            Assert.AreEqual(ev.FechaInicio.Value.Day, detail.EndEvent.Day);
+            Assert.AreEqual(ev.FechaInicio.Value.Month, detail.EndEvent.Month);
+            Assert.AreEqual(ev.FechaInicio.Value.Year, detail.EndEvent.Year);
 
             Assert.AreEqual("La comunidad ALT.NET Hispano (http://altnethispano.org) realizará un Alt.Net Cafe virtual con el tema Agile Patterns." +
                            "\n\rFecha: sábado, 09 de julio de 2011 a las 18:00 hrs. Hora Internacional (GMT/UTC), con una duración aproximada de 2 horas." +
@@ -106,11 +119,15 @@
         {
             var adapter = new Mock<IGCalendarAdapter>();
             var detail = new EstudioGEventDetail();
+            var fechaInicio = new DateTime(2011, 07, 09, 18, 0, 0, DateTimeKind.Utc);
+            var fechaTermino = fechaInicio.AddHours(2);
 
             var publicador = new GooglePublicador(adapter.Object);
 			var agenda = new Agenda(publicador, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
             agenda.Proponer("Agile Patterns", null, null, TipoEvento.GrupoEstudio);
-            agenda.Agendar("Agile Patterns", TestsHelper.GetOrCreatePonente("Alejandro Labra"), new DateTime(2011, 07, 09), "https://groups.google.com/d/topic/altnet-hispano/arYEMsPiAtY/discussion", TipoEvento.GrupoEstudio);
+            agenda.Agendar("Agile Patterns", TestsHelper.GetOrCreatePonente("Alejandro Labra"), fechaInicio,
+                           fechaTermino, "https://groups.google.com/d/topic/altnet-hispano/arYEMsPiAtY/discussion",
+                           TipoEvento.GrupoEstudio);
 
             var ev = DefaultEventoRepository.GetActivos()[0];
             detail.Generate(ev);
@@ -120,15 +137,15 @@
 
             Assert.AreEqual(DateTimeKind.Utc, detail.StartEvent.Kind);
             Assert.AreEqual(18, detail.StartEvent.Hour);
-            Assert.AreEqual(ev.Fecha.Value.Day, detail.StartEvent.Day);
-            Assert.AreEqual(ev.Fecha.Value.Month, detail.StartEvent.Month);
-            Assert.AreEqual(ev.Fecha.Value.Year, detail.StartEvent.Year);
+            Assert.AreEqual(ev.FechaInicio.Value.Day, detail.StartEvent.Day);
+            Assert.AreEqual(ev.FechaInicio.Value.Month, detail.StartEvent.Month);
+            Assert.AreEqual(ev.FechaInicio.Value.Year, detail.StartEvent.Year);
 
             Assert.AreEqual(DateTimeKind.Utc, detail.EndEvent.Kind);
             Assert.AreEqual(20, detail.EndEvent.Hour);
-            Assert.AreEqual(ev.Fecha.Value.Day, detail.EndEvent.Day);
-            Assert.AreEqual(ev.Fecha.Value.Month, detail.EndEvent.Month);
-            Assert.AreEqual(ev.Fecha.Value.Year, detail.EndEvent.Year);
+            Assert.AreEqual(ev.FechaInicio.Value.Day, detail.EndEvent.Day);
+            Assert.AreEqual(ev.FechaInicio.Value.Month, detail.EndEvent.Month);
+            Assert.AreEqual(ev.FechaInicio.Value.Year, detail.EndEvent.Year);
 
             Assert.AreEqual("La comunidad ALT.NET Hispano (http://altnethispano.org) realizará un grupo de estudio sobre Agile Patterns." +
                            "\n\rFecha: sábado, 09 de julio de 2011 a las 18:00 hrs. Hora Internacional (GMT/UTC), con una duración aproximada de 2 horas." +
@@ -141,7 +158,9 @@
         public void CuandoPublicarEventoDadoAccionCancelarEntoncesEventoEliminado()
         {
             var adapter = new Mock<IGCalendarAdapter>();
-            var message = "";
+            string message;
+            var fechaInicio = new DateTime(2011, 07, 09, 18, 0, 0, DateTimeKind.Utc);
+            var fechaTermino = fechaInicio.AddHours(2);
             adapter.Setup(ad => ad.DeleteEvent(It.IsAny<DateTime>(), It.IsAny<DateTime>(), out message)).Returns(true);
 
             var publicador = new GooglePublicador(adapter.Object);
@@ -150,7 +169,9 @@
             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"), new DateTime(2011, 07, 09), "https://groups.google.com/d/topic/altnet-hispano/arYEMsPiAtY/discussion", TipoEvento.Van);
+            agenda.Agendar("Agile Patterns", 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());
 
             var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Agile Patterns");
--- a/Agendas/trunk/src/Agendas.Google/DetailsEvents/CafeGEventDetail.cs	Mon Aug 08 22:32:12 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Google/DetailsEvents/CafeGEventDetail.cs	Tue Aug 09 01:04:27 2011 -0400
@@ -23,8 +23,8 @@
         {
             Title = "Alt.Net Café " + evento.Titulo;
             Location = "http://snipr.com/virtualaltnet";
-            if (evento.Fecha != null)
-                StartEvent = new DateTime(evento.Fecha.Value.Year, evento.Fecha.Value.Month, evento.Fecha.Value.Day,
+            if (evento.FechaInicio != null)
+                StartEvent = new DateTime(evento.FechaInicio.Value.Year, evento.FechaInicio.Value.Month, evento.FechaInicio.Value.Day,
                                           18, 0, 0, DateTimeKind.Utc);
             EndEvent = StartEvent.AddHours(2);
 
--- a/Agendas/trunk/src/Agendas.Google/DetailsEvents/EstudioGEventDetail.cs	Mon Aug 08 22:32:12 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Google/DetailsEvents/EstudioGEventDetail.cs	Tue Aug 09 01:04:27 2011 -0400
@@ -23,8 +23,8 @@
         {
             Title = "Grupo de Estudio " + evento.Titulo;
             Location = "http://snipr.com/virtualaltnet";
-            if (evento.Fecha != null)
-                StartEvent = new DateTime(evento.Fecha.Value.Year, evento.Fecha.Value.Month, evento.Fecha.Value.Day,
+            if (evento.FechaInicio != null)
+                StartEvent = new DateTime(evento.FechaInicio.Value.Year, evento.FechaInicio.Value.Month, evento.FechaInicio.Value.Day,
                                           18, 0, 0, DateTimeKind.Utc);
             EndEvent = StartEvent.AddHours(2);
 
--- a/Agendas/trunk/src/Agendas.Google/DetailsEvents/VanGEventDetail.cs	Mon Aug 08 22:32:12 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Google/DetailsEvents/VanGEventDetail.cs	Tue Aug 09 01:04:27 2011 -0400
@@ -24,8 +24,8 @@
         {
             Title = "VAN sobre " + evento.Titulo;
             Location = "http://snipr.com/virtualaltnet";
-            if (evento.Fecha != null)
-                StartEvent = new DateTime(evento.Fecha.Value.Year, evento.Fecha.Value.Month, evento.Fecha.Value.Day,
+            if (evento.FechaInicio != null)
+                StartEvent = new DateTime(evento.FechaInicio.Value.Year, evento.FechaInicio.Value.Month, evento.FechaInicio.Value.Day,
                                           18, 0, 0, DateTimeKind.Utc);
             EndEvent = StartEvent.AddHours(2);
 
--- a/Agendas/trunk/src/Agendas.Google/GooglePublicador.cs	Mon Aug 08 22:32:12 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Google/GooglePublicador.cs	Tue Aug 09 01:04:27 2011 -0400
@@ -53,11 +53,9 @@
 
 	    private void PublicarAccionCancelar(Track track)
 	    {
-	    		string message;
-	    		var result = _adapter.DeleteEvent(track.Evento.Fecha.Value, track.Evento.Fecha.Value.AddHours(2), out message);
-	    		track.LogAdd(new TrackLog(TrackLogPropietario.Calendario, message, track.Usuario, result));
-	    	
-
+            string message;
+	        var result= _adapter.DeleteEvent(track.Evento.FechaInicio.Value, track.Evento.FechaInicio.Value.AddHours(2), out message);
+            track.LogAdd(new TrackLog(TrackLogPropietario.Calendario, message, track.Usuario, result));
 	    }
 
 		private void PublicarAccionAgendar(Track track)
--- a/Agendas/trunk/src/Agendas.Resources/Properties/DataAnnotationResources.Designer.cs	Mon Aug 08 22:32:12 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Resources/Properties/DataAnnotationResources.Designer.cs	Tue Aug 09 01:04:27 2011 -0400
@@ -1,10 +1,10 @@
 //------------------------------------------------------------------------------
 // <auto-generated>
-//     Este código fue generado por una herramienta.
-//     Versión de runtime:4.0.30319.235
+//     This code was generated by a tool.
+//     Runtime Version:4.0.30319.235
 //
-//     Los cambios en este archivo podrían causar un comportamiento incorrecto y se perderán si
-//     se vuelve a generar el código.
+//     Changes to this file may cause incorrect behavior and will be lost if
+//     the code is regenerated.
 // </auto-generated>
 //------------------------------------------------------------------------------
 
@@ -13,12 +13,12 @@
     
     
     /// <summary>
-    ///   Clase de recurso con establecimiento inflexible de tipos, para buscar cadenas traducidas, etc.
+    ///   A strongly-typed resource class, for looking up localized strings, etc.
     /// </summary>
-    // StronglyTypedResourceBuilder generó automáticamente esta clase
-    // a través de una herramienta como ResGen o Visual Studio.
-    // Para agregar o quitar un miembro, edite el archivo .ResX y, a continuación, vuelva a ejecutar ResGen
-    // con la opción /str o vuelva a generar su proyecto de VS.
+    // This class was auto-generated by the StronglyTypedResourceBuilder
+    // class via a tool like ResGen or Visual Studio.
+    // To add or remove a member, edit your .ResX file then rerun ResGen
+    // with the /str option, or rebuild your VS project.
     [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
     [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
     [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
@@ -33,7 +33,7 @@
         }
         
         /// <summary>
-        ///   Devuelve la instancia de ResourceManager almacenada en caché utilizada por esta clase.
+        ///   Returns the cached ResourceManager instance used by this class.
         /// </summary>
         [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
         public static global::System.Resources.ResourceManager ResourceManager {
@@ -47,8 +47,8 @@
         }
         
         /// <summary>
-        ///   Reemplaza la propiedad CurrentUICulture del subproceso actual para todas las
-        ///   búsquedas de recursos mediante esta clase de recurso con establecimiento inflexible de tipos.
+        ///   Overrides the current thread's CurrentUICulture property for all
+        ///   resource lookups using this strongly typed resource class.
         /// </summary>
         [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
         public static global::System.Globalization.CultureInfo Culture {
@@ -61,7 +61,16 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Duración.
+        ///   Looks up a localized string similar to Duración.
+        /// </summary>
+        public static string Duracion {
+            get {
+                return ResourceManager.GetString("Duracion", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Duración.
         /// </summary>
         public static string DuracionReal {
             get {
@@ -70,7 +79,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Tiempo que duró la presentación..
+        ///   Looks up a localized string similar to Tiempo que duró la presentación..
         /// </summary>
         public static string DuracionRealDescription {
             get {
@@ -79,7 +88,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Correo electrónico.
+        ///   Looks up a localized string similar to Correo electrónico.
         /// </summary>
         public static string EMail {
             get {
@@ -88,7 +97,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Correo electrónico de la persona para contactarse con ella.
+        ///   Looks up a localized string similar to Correo electrónico de la persona para contactarse con ella.
         /// </summary>
         public static string EMailDescription {
             get {
@@ -97,7 +106,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a debe ingresar la fecha del evento.
+        ///   Looks up a localized string similar to debe ingresar la fecha del evento.
         /// </summary>
         public static string FechaRequired {
             get {
@@ -106,7 +115,16 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Nombre de la persona que identifica a esta persona entre todas.
+        ///   Looks up a localized string similar to Hora (GMT +0).
+        /// </summary>
+        public static string Hora {
+            get {
+                return ResourceManager.GetString("Hora", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Nombre de la persona que identifica a esta persona entre todas.
         /// </summary>
         public static string NombreDescription {
             get {
@@ -115,7 +133,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Nro. de Orden.
+        ///   Looks up a localized string similar to Nro. de Orden.
         /// </summary>
         public static string NroOrden {
             get {
@@ -124,7 +142,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Un número consecutivo que identifica al evento en el tiempo..
+        ///   Looks up a localized string similar to Un número consecutivo que identifica al evento en el tiempo..
         /// </summary>
         public static string NroOrdenDescription {
             get {
@@ -133,7 +151,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a El valor debe ser entre {1} y {2}.
+        ///   Looks up a localized string similar to El valor debe ser entre {1} y {2}.
         /// </summary>
         public static string NroOrdenRange {
             get {
@@ -142,7 +160,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Debe ingresar el número de orden del evento.
+        ///   Looks up a localized string similar to Debe ingresar el número de orden del evento.
         /// </summary>
         public static string NroOrdenRequired {
             get {
@@ -151,7 +169,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Seleccione el ponente o responsable del evento.
+        ///   Looks up a localized string similar to Seleccione el ponente o responsable del evento.
         /// </summary>
         public static string PonenteDescription {
             get {
@@ -160,7 +178,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a debe ingresar el nombre del ponente.
+        ///   Looks up a localized string similar to debe ingresar el nombre del ponente.
         /// </summary>
         public static string PonenteRequired {
             get {
@@ -169,7 +187,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Tipo de evento.
+        ///   Looks up a localized string similar to Tipo de evento.
         /// </summary>
         public static string TipoEvento {
             get {
@@ -178,7 +196,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Define las características que tendrá el evento como objetivo, dinámica del evento, etc..
+        ///   Looks up a localized string similar to Define las características que tendrá el evento como objetivo, dinámica del evento, etc..
         /// </summary>
         public static string TipoEventoDescription {
             get {
@@ -187,7 +205,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Título.
+        ///   Looks up a localized string similar to Título.
         /// </summary>
         public static string Titulo {
             get {
@@ -196,7 +214,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Título del evento, el mismo lo identifica entre todos los eventos.
+        ///   Looks up a localized string similar to Título del evento, el mismo lo identifica entre todos los eventos.
         /// </summary>
         public static string TituloDescription {
             get {
@@ -205,7 +223,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a debe ingresar el título.
+        ///   Looks up a localized string similar to debe ingresar el título.
         /// </summary>
         public static string TituloRequired {
             get {
@@ -214,7 +232,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Cuenta de Twitter de la persona, con esta cuenta podrá autenticarse.
+        ///   Looks up a localized string similar to Cuenta de Twitter de la persona, con esta cuenta podrá autenticarse.
         /// </summary>
         public static string TwitterDescription {
             get {
@@ -223,7 +241,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Url de la invitación.
+        ///   Looks up a localized string similar to Url de la invitación.
         /// </summary>
         public static string UrlInvitacion {
             get {
@@ -232,7 +250,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Ingrese la url de la cadena de mails donde se realizó la invitación para el evento.
+        ///   Looks up a localized string similar to Ingrese la url de la cadena de mails donde se realizó la invitación para el evento.
         /// </summary>
         public static string UrlInvitacionDescription {
             get {
@@ -241,7 +259,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a La url ingresada no es válida.
+        ///   Looks up a localized string similar to La url ingresada no es válida.
         /// </summary>
         public static string UrlInvitacionUrl {
             get {
@@ -250,7 +268,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a Url de la Wiki.
+        ///   Looks up a localized string similar to Url de la Wiki.
         /// </summary>
         public static string UrlWiki {
             get {
@@ -259,7 +277,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a La url donde se publica la presentación..
+        ///   Looks up a localized string similar to La url donde se publica la presentación..
         /// </summary>
         public static string UrlWikiDescription {
             get {
@@ -268,7 +286,7 @@
         }
         
         /// <summary>
-        ///   Busca una cadena traducida similar a La url ingresada no es válida.
+        ///   Looks up a localized string similar to La url ingresada no es válida.
         /// </summary>
         public static string UrlWikiUrl {
             get {
--- a/Agendas/trunk/src/Agendas.Resources/Properties/DataAnnotationResources.resx	Mon Aug 08 22:32:12 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Resources/Properties/DataAnnotationResources.resx	Tue Aug 09 01:04:27 2011 -0400
@@ -117,6 +117,9 @@
   <resheader name="writer">
     <value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
   </resheader>
+  <data name="Duracion" xml:space="preserve">
+    <value>Duración</value>
+  </data>
   <data name="DuracionReal" xml:space="preserve">
     <value>Duración</value>
   </data>
@@ -132,6 +135,9 @@
   <data name="FechaRequired" xml:space="preserve">
     <value>debe ingresar la fecha del evento</value>
   </data>
+  <data name="Hora" xml:space="preserve">
+    <value>Hora (GMT +0)</value>
+  </data>
   <data name="NombreDescription" xml:space="preserve">
     <value>Nombre de la persona que identifica a esta persona entre todas</value>
   </data>
--- a/Agendas/trunk/src/Agendas.Tests/AgendarTests.cs	Mon Aug 08 22:32:12 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/AgendarTests.cs	Tue Aug 09 01:04:27 2011 -0400
@@ -31,8 +31,12 @@
 
 			var agenda = new Agenda(publicador.Object, repository.Object, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
-			Assert.Throws<Exception>(
-                () => agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.Now, urlInvitacion, TipoEvento.Van));
+		    var fechaInicio = DateTime.Now.ToUniversalTime();
+		    var fechaTermino = fechaInicio.AddHours(2);
+		    Assert.Throws<Exception>(
+		        () =>
+		        agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino,
+		                       urlInvitacion, TipoEvento.Van));
 			Assert.AreEqual(0, agenda.GetEventosActivos().Count);
 
 			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
@@ -49,9 +53,12 @@
 
 			var agenda = new Agenda(publicador.Object, repository.Object, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
-			Assert.Throws<IdentityContextNotConfiguredException>(
-				() => agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.Now,
-		  urlInvitacion, TipoEvento.Van));
+		    var fechaInicio = DateTime.Now.ToUniversalTime();
+		    var fechaTermino = fechaInicio.AddHours(2);
+		    Assert.Throws<IdentityContextNotConfiguredException>(
+		        () =>
+		        agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino,
+		                       urlInvitacion, TipoEvento.Van));
 			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0));
 		}
 
@@ -65,8 +72,12 @@
 
 			var agenda = new Agenda(publicador.Object, repository.Object, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
-			Assert.Throws<UsuarioNoAutenticadoException>(() => agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.Now,
-		urlInvitacion, TipoEvento.Van));
+		    var fechaInicio = DateTime.Now.ToUniversalTime();
+		    var fechaTermino = fechaInicio.AddHours(2);
+		    Assert.Throws<UsuarioNoAutenticadoException>(
+		        () =>
+		        agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino,
+		                       urlInvitacion, TipoEvento.Van));
 
 			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(0));
 			repository.Verify(p => p.Save(It.IsAny<Evento>()), Times.Exactly(0));
@@ -77,8 +88,9 @@
 		{
 			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
-			var r = agenda.Agendar("Van para publicar", Guid.Empty, DateTime.Now,
-		urlInvitacion, TipoEvento.Van);
+		    var fechaInicio = DateTime.Now.ToUniversalTime();
+		    var fechaTermino = fechaInicio.AddHours(2);
+		    var r = agenda.Agendar("Van para publicar", Guid.Empty, fechaInicio, fechaTermino, urlInvitacion, TipoEvento.Van);
 
 			Assert.IsFalse(r.Succeful);
 		}
@@ -94,8 +106,10 @@
 			var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }),
 															repository.Object, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
-			agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.Now,
-		urlInvitacion, TipoEvento.Van);
+		    var fechaInicio = DateTime.Now.ToUniversalTime();
+		    var fechaTermino = fechaInicio.AddHours(2);
+		    agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino,
+		                   urlInvitacion, TipoEvento.Van);
 
 			publicador1.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
 			publicador2.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
@@ -109,8 +123,10 @@
 
 			var agenda = new Agenda(publicador.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
-			agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.Now,
-		urlInvitacion, TipoEvento.Van);
+		    var fechaInicio = DateTime.Now.ToUniversalTime();
+		    var fechaTermino = fechaInicio.AddHours(2);
+		    agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino,
+		                   urlInvitacion, TipoEvento.Van);
 
 			Assert.AreEqual(0, agenda.GetEventosActivos(EventoPropuestoState.GetInstance()).Count);
 
@@ -131,29 +147,36 @@
 			var publicador = new Mock<IPublicador>();
 
 			var agenda = new Agenda(publicador.Object, repository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
+		    var fechaInicioVanPublicar = DateTime.Now.ToUniversalTime();
+		    var fechaTerminoVanPublicar = fechaInicioVanPublicar.AddHours(2);
 
-			agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.Now,
-		urlInvitacion, TipoEvento.Van);
+		    agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicioVanPublicar,
+		                   fechaTerminoVanPublicar,
+		                   urlInvitacion, TipoEvento.Van);
 
 			publicador.Verify(p => p.Publicar(It.IsAny<IEnumerable<Track>>()), Times.Exactly(1));
 
 			var evento = repository.GetActivos().First();
 			Assert.AreNotEqual(Guid.Empty, evento.Id);
-			Assert.IsNotNull(evento.Fecha);
+			Assert.IsNotNull(evento.FechaInicio);
 
-			DateTime fecha = evento.Fecha.Value.AddDays(7);
-			agenda.ModificarEvento(evento.Id, "otro titulo", TestsHelper.GetOrCreatePonente("otro ponente"), fecha, urlInvitacion);
+			var fechaInicio = evento.FechaInicio.Value.AddDays(7);
+		    var fechaTermino = fechaInicio.AddHours(2);
+		    agenda.ModificarEvento(evento.Id, "otro titulo", 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.AreEqual(fecha, evento.Fecha);
+			Assert.AreEqual(fechaInicio, evento.FechaInicio);
 
 			var idEventoNoExistente = new Guid("99999999999999999999999999999999");
-			Assert.Throws<EventoNotFoundException>(
-				() => agenda.ModificarEvento(idEventoNoExistente, "algún título", TestsHelper.GetOrCreatePonente("un ponente"), DateTime.Now, urlInvitacion));
+		    Assert.Throws<EventoNotFoundException>(
+		        () =>
+		        agenda.ModificarEvento(idEventoNoExistente, "algún título", TestsHelper.GetOrCreatePonente("un ponente"),
+		                               DateTime.Now, DateTime.Now.AddHours(2), urlInvitacion));
 		}
 
 		[Test, Ignore("Por ahora no existe el concepto de recordar")]
@@ -165,8 +188,10 @@
 			var agenda = new Agenda(new CompositePublicador(new[] { publicador1.Object, publicador2.Object }),
 															DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
-			agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.Now,
-		urlInvitacion, TipoEvento.Van);
+		    var fechaInicio = DateTime.Now.ToUniversalTime();
+		    var fechaTermino = fechaInicio.AddHours(2);
+		    agenda.Agendar("Van para publicar", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino,
+		                   urlInvitacion, TipoEvento.Van);
 
 			var van = agenda.GetEventosActivos().Single(v => v.Titulo == "Van para publicar");
 			//agenda.Recordar(van.Id);
@@ -192,7 +217,10 @@
 			var publicado = agenda.GetEventosActivos(EventoPropuestoState.GetInstance()).First();
 			Assert.AreEqual(1, publicado.Tracks.Count());
 
-			agenda.ModificarEvento(publicado.Id, "Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.Today.AddDays(5), urlInvitacion);
+		    var fechaInicio = DateTime.Today.AddDays(5).ToUniversalTime();
+		    var fechaTermino = fechaInicio.AddHours(2);
+		    agenda.ModificarEvento(publicado.Id, "Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio,
+		                           fechaTermino, urlInvitacion);
 			Assert.AreEqual(0, agenda.GetEventosActivos(EventoPropuestoState.GetInstance()).Count);
 			Assert.AreEqual(1, agenda.GetEventosActivos(EventoAgendadoState.GetInstance()).Count);
 			Assert.AreEqual(1, agenda.GetEventosActivos().Count);
@@ -226,7 +254,10 @@
 			var publicador1 = new Mock<IPublicador>();
 
 			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
-			agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.MinValue, urlInvitacion, TipoEvento.Van);
+		    var fechaInicio = DateTime.MinValue.ToUniversalTime();
+		    var fechatermino = fechaInicio.AddHours(2);
+		    agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechatermino, urlInvitacion,
+		                   TipoEvento.Van);
 
 			var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
 
@@ -240,7 +271,10 @@
             var publicador1 = new Mock<IPublicador>();
 
 			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
-            agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.MinValue, urlInvitacion, TipoEvento.Van);
+            var fechaInicio = DateTime.MinValue.ToUniversalTime();
+            var fechaTermino = fechaInicio.AddHours(2);
+            agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino,
+                           urlInvitacion, TipoEvento.Van);
 
             var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
 
@@ -257,7 +291,10 @@
             var publicador1 = new Mock<IPublicador>();
 
 			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
-            agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.MinValue, urlInvitacion, TipoEvento.Van);
+            var fechaInicio = DateTime.MinValue.ToUniversalTime();
+            var fechaTermino = fechaInicio.AddHours(2);
+            agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino,
+                           urlInvitacion, TipoEvento.Van);
 
             var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
 
@@ -275,7 +312,10 @@
 			var publicador1 = new Mock<IPublicador>();
 
 			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
-			agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.MinValue, urlInvitacion, TipoEvento.Van);
+            var fechaInicio = DateTime.MinValue.ToUniversalTime();
+            var fechaTermino = fechaInicio.AddHours(2);
+            agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino,
+                           urlInvitacion, TipoEvento.Van);
 
 			var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
 
@@ -293,7 +333,10 @@
 			var publicador1 = new Mock<IPublicador>();
 
 			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
-			agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.MinValue, urlInvitacion, TipoEvento.Van);
+		    var fechaInicio = DateTime.MinValue.ToUniversalTime();
+		    var fechaTermino = fechaInicio.AddHours(2);
+		    agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino, urlInvitacion,
+		                   TipoEvento.Van);
 
 			var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
 
@@ -312,7 +355,10 @@
 			var publicador1 = new Mock<IPublicador>();
 
 			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
-			agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.MinValue, urlInvitacion, TipoEvento.Van);
+		    var fechaInicio = DateTime.MinValue.ToUniversalTime();
+		    var fechaTermino = fechaInicio.AddHours(2);
+		    agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino, urlInvitacion,
+		                   TipoEvento.Van);
 
 			var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
 			agenda.Confirmar(evento.Id);
@@ -366,7 +412,10 @@
             var publicador1 = new Mock<IPublicador>();
 
             var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
-            agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.MinValue, urlInvitacion, TipoEvento.Van);
+            var fechaInicio = DateTime.MinValue.ToUniversalTime();
+            var fechaTermino = fechaInicio.AddHours(2);
+            agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino,
+                           urlInvitacion, TipoEvento.Van);
 
             var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
             agenda.Confirmar(evento.Id);
@@ -384,7 +433,10 @@
             var publicador1 = new Mock<IPublicador>();
 
             var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
-            agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.MinValue, urlInvitacion, TipoEvento.Van);
+            var fechaInicio = DateTime.MinValue.ToUniversalTime();
+            var fechaTermino = fechaInicio.AddHours(2);
+            agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino,
+                           urlInvitacion, TipoEvento.Van);
 
             var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
             agenda.Confirmar(evento.Id);
@@ -400,7 +452,10 @@
 			var publicador1 = new Mock<IPublicador>();
 
 			var agenda = new Agenda(publicador1.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
-			agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.MinValue, urlInvitacion, TipoEvento.Van);
+		    var fechaInicio = DateTime.MinValue.ToUniversalTime();
+		    var fechaTermino = fechaInicio.AddHours(2);
+		    agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino, urlInvitacion,
+		                   TipoEvento.Van);
 
 			var evento = DefaultEventoRepository.GetActivos().Single(e => e.Titulo == "Html 5");
 			agenda.Confirmar(evento.Id);
--- a/Agendas/trunk/src/Agendas.Tests/Cruds/EventoCrud.cs	Mon Aug 08 22:32:12 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/Cruds/EventoCrud.cs	Tue Aug 09 01:04:27 2011 -0400
@@ -62,6 +62,8 @@
 		public void Update()
 		{
 			Guid eventoId = Create();
+		    var fechaInicio = new DateTime(2010, 04, 17).ToUniversalTime();
+		    var fechaTermino = fechaInicio.AddHours(2);
 
 			using (_requestEmulator.Invoke())
 			{
@@ -74,7 +76,7 @@
 				var otroPonente = new Persona("José");
 				_personaRepository.Save(otroPonente);
 
-				van.Actualizar(otroPonente, new DateTime(2010, 04, 17), null);
+				van.Actualizar(otroPonente, fechaInicio, fechaTermino, null);
 
 				_eventoRepository.Update(van);
 			}
@@ -87,7 +89,8 @@
 				Assert.IsNotNull(van.Ponente);
 				Assert.AreEqual("José", van.Ponente.Nombre);
 				Assert.AreEqual("TDD & Ejemplos", van.Titulo);
-				Assert.AreEqual(new DateTime(2010, 04, 17), van.Fecha);
+				Assert.AreEqual(new DateTime(2010, 04, 17).ToUniversalTime(), van.FechaInicio);
+                Assert.AreEqual(fechaTermino, van.FechaTermino);
 
 				var ponente1 = _personaRepository.GetByNombre("Carlos Blé");
 				Assert.IsNotNull(ponente1);
@@ -133,7 +136,7 @@
 				Evento evento = _eventoRepository.Get(eventoId);
 				Assert.AreEqual(EventoPropuestoState.GetInstance(), evento.Estado);
 
-				evento.Agendar(evento.Ponente, evento.Fecha, null);
+				evento.Agendar(evento.Ponente, evento.FechaInicio, evento.FechaTermino, null);
 			}
 
 			using (_requestEmulator.Invoke())
--- a/Agendas/trunk/src/Agendas.Tests/Eventos_y_patrocinadores_tests.cs	Mon Aug 08 22:32:12 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/Eventos_y_patrocinadores_tests.cs	Tue Aug 09 01:04:27 2011 -0400
@@ -31,7 +31,7 @@
 
 			var evento = DefaultEventoRepository.GetActivos().First();
 			Assert.AreNotEqual(Guid.Empty, evento.Id);
-			Assert.IsNotNull(evento.Fecha);
+			Assert.IsNotNull(evento.FechaInicio);
 			Assert.IsNotNull(evento.Patrocinadores);
 			Assert.IsTrue(evento.Patrocinadores.Any());
 			Assert.IsTrue(evento.Patrocinadores.Any(p => p.Nombre == "Apress"));
@@ -98,7 +98,9 @@
 
 		private Guid CrearEvento()
 		{
-            _agenda.Agendar("ADFS", TestsHelper.GetOrCreatePonente("Nelo Pauselli"), DateTime.Today.AddDays(7), null, TipoEvento.Van);
+		    var fechaInicio = DateTime.Today.AddDays(7).ToUniversalTime();
+		    var fechaTermino = fechaInicio.AddHours(2);
+            _agenda.Agendar("ADFS", TestsHelper.GetOrCreatePonente("Nelo Pauselli"), fechaInicio, fechaTermino, null, TipoEvento.Van);
 
 			var evento = DefaultEventoRepository.GetActivos().First();
 			return evento.Id;
--- a/Agendas/trunk/src/Agendas.Tests/PonentesTests.cs	Mon Aug 08 22:32:12 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/PonentesTests.cs	Tue Aug 09 01:04:27 2011 -0400
@@ -19,11 +19,16 @@
             Assert.AreEqual(1, DefaultPersonaRepository.GetAll().Count);
 
             var agenda = new Agenda(publicador.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
+            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"), new DateTime(2011, 2, 26),
-        urlInvitacion, TipoEvento.Van);
-            agenda.Agendar("Conform - Parte 2", TestsHelper.GetOrCreatePonente("Fabio Maulo"), new DateTime(2011, 3, 5),
-        urlInvitacion, TipoEvento.Van);
+            agenda.Agendar("Audit (parallel model) con NHibernate 3", 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,
+                           fechaTerminoConform, urlInvitacion, TipoEvento.Van);
 
             var eventos = agenda.GetEventosActivos();
             Assert.AreEqual(2, eventos.Count);
@@ -48,8 +53,10 @@
             var agenda = new Agenda(publicador.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
             agenda.RegistrarPonente("Fabio Maulo", "fabiomaulo@gmail.com", "@fabiomaulo", "http://fabiomaulo.blogspot.com");
-
-            agenda.Agendar("Audit (parallel model) con NHibernate 3", TestsHelper.GetOrCreatePonente("Fabio Maulo"), new DateTime(2011, 2, 26), urlInvitacion, TipoEvento.Van);
+            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"),
+                           fechaInicio, fechaTermino, urlInvitacion, TipoEvento.Van);
 
             Assert.AreEqual(1, agenda.GetEventosActivos().Count);
 
@@ -72,8 +79,10 @@
 
             var agenda = new Agenda(publicador.Object, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
-            agenda.Agendar("Audit (parallel model) con NHibernate 3", TestsHelper.GetOrCreatePonente("Fabio Maulo"), new DateTime(2011, 2, 26),
-        urlInvitacion, TipoEvento.Van);
+            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"),
+                           fechaInicio, fechaTermino, urlInvitacion, TipoEvento.Van);
 
             Assert.AreEqual(1, agenda.GetEventosActivos().Count);
 
--- a/Agendas/trunk/src/Agendas.Tests/PropuestasTests.cs	Mon Aug 08 22:32:12 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/PropuestasTests.cs	Tue Aug 09 01:04:27 2011 -0400
@@ -38,7 +38,10 @@
 				Assert.AreEqual("otro ponente", evento.Ponente.Nombre);
 			}
 
-			var r = agenda.Agendar("Van 2", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.Now, urlInvitacion, TipoEvento.Van);
+		    var fechaInicio = DateTime.Now.ToUniversalTime();
+		    var fechaTermino = fechaInicio.AddHours(2);
+		    var r = agenda.Agendar("Van 2", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino,
+		                           urlInvitacion, TipoEvento.Van);
 			Assert.IsTrue(r.Succeful);
 			{
 				IList<Evento> eventosPropuestos = agenda.GetEventosActivos(EventoPropuestoState.GetInstance());
@@ -61,8 +64,8 @@
 			{
 				var van = agenda.GetEventosActivos(EventoPropuestoState.GetInstance()).FirstOrDefault();
 				Assert.IsNotNull(van);
-				var r = agenda.Agendar(van.Titulo, TestsHelper.GetOrCreatePonente("Ponente"), null,
-		  urlInvitacion, TipoEvento.Van);
+			    var r = agenda.Agendar(van.Titulo, TestsHelper.GetOrCreatePonente("Ponente"), null, null,
+			                           urlInvitacion, TipoEvento.Van);
 				Assert.IsFalse(r.Succeful);
 			}
 		}
@@ -80,9 +83,11 @@
 				var van = agenda.GetEventosActivos(EventoPropuestoState.GetInstance()).FirstOrDefault();
 				Assert.IsNotNull(van);
 
-				van.Actualizar(null, DateTime.Today.AddDays(5), urlInvitacion);
-				var r = agenda.Agendar(van.Titulo, Guid.Empty, van.Fecha,
-		  urlInvitacion, TipoEvento.Van);
+			    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,
+			                           urlInvitacion, TipoEvento.Van);
 				Assert.IsFalse(r.Succeful);
 			}
 		}
@@ -138,8 +143,10 @@
 			var agenda = new Agenda(null, DefaultEventoRepository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
 			agenda.Proponer("Van propuesta", null, urlInvitacion, TipoEvento.Van);
-			var r = agenda.Agendar("Van publicada", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.Now,
-			                       urlInvitacion, TipoEvento.Van);
+		    var fechaInicio = DateTime.Now.ToUniversalTime();
+		    var fechaTermino = fechaInicio.AddHours(2);
+		    var r = agenda.Agendar("Van publicada", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino,
+		                           urlInvitacion, TipoEvento.Van);
 			Assert.IsTrue(r.Succeful);
 
 			IList<Evento> eventosPropuestos = agenda.GetEventosActivos(EventoPropuestoState.GetInstance());
--- a/Agendas/trunk/src/Agendas.Tests/TrackTests.cs	Mon Aug 08 22:32:12 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/TrackTests.cs	Tue Aug 09 01:04:27 2011 -0400
@@ -17,8 +17,9 @@
 
             var agenda = new Agenda(null, repository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
 
-            var fecha = DateTime.Now.AddDays(5);
-            agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), fecha, urlInvitacion, TipoEvento.Van);
+            var fechaInicio = DateTime.Now.AddDays(5).ToUniversalTime();
+            var fechaTermino = fechaInicio.AddHours(2);
+            agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), fechaInicio, fechaTermino, urlInvitacion, TipoEvento.Van);
             var evento = repository.GetActivos().First();
 
             Assert.AreEqual(1, evento.Tracks.Count());
@@ -28,7 +29,7 @@
             Assert.IsNotNull(ultimo.Usuario);
             Assert.AreEqual("Nelo Pauselli", ultimo.Usuario.Nombre);
 
-            agenda.ModificarEvento(evento.Id, "Html 5", TestsHelper.GetOrCreatePonente("otro ponente"), fecha, urlInvitacion);
+            agenda.ModificarEvento(evento.Id, "Html 5", TestsHelper.GetOrCreatePonente("otro ponente"), fechaInicio, fechaTermino, urlInvitacion);
             Assert.AreEqual(2, evento.Tracks.Count());
             ultimo = evento.Tracks.Last();
             Assert.AreEqual(evento, ultimo.Evento);
@@ -36,7 +37,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"), fecha, urlInvitacion);
+            agenda.ModificarEvento(evento.Id, "Html 5 y Css 3", TestsHelper.GetOrCreatePonente("otro ponente"), fechaInicio, fechaTermino, urlInvitacion);
             Assert.AreEqual(3, evento.Tracks.Count());
             ultimo = evento.Tracks.Last();
             Assert.AreEqual(evento, ultimo.Evento);
@@ -51,9 +52,11 @@
             var repository = DefaultEventoRepository;
 
             var agenda = new Agenda(null, repository, DefaultPersonaRepository, DefaultPatrocinadorRepository);
+            var fechaInicio = DateTime.Now.ToUniversalTime();
+            var fechaTermino = fechaInicio.AddHours(2);
 
-            agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.Now,
-        urlInvitacion, TipoEvento.Van);
+            agenda.Agendar("Html 5", TestsHelper.GetOrCreatePonente("jjmontes"), DateTime.Now, fechaTermino,
+                           urlInvitacion, TipoEvento.Van);
             var evento = repository.GetActivos().First();
 
             Assert.AreEqual(1, evento.Tracks.Count());
--- a/Agendas/trunk/src/Agendas.Tests/Workflows/Workflow.cs	Mon Aug 08 22:32:12 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Tests/Workflows/Workflow.cs	Tue Aug 09 01:04:27 2011 -0400
@@ -37,8 +37,10 @@
 		{
 			using (_requestEmulator.Invoke())
 			{
-				var resultado = _agenda.Agendar("SOLID", TestsHelper.GetOrCreatePonente("Jorge"), DateTime.Today.AddDays(5), null,
-				                                TipoEvento.Van);
+			    var fechaInicio = DateTime.Today.AddDays(5).ToUniversalTime();
+			    var fechaTermino = fechaInicio.AddHours(2);
+			    var resultado = _agenda.Agendar("SOLID", TestsHelper.GetOrCreatePonente("Jorge"), fechaInicio, fechaTermino, null,
+			                                    TipoEvento.Van);
 				Assert.IsTrue(resultado.Succeful);
 			}
 			
--- a/Agendas/trunk/src/Agendas.Twitter.Tests/Publicador_tests.cs	Mon Aug 08 22:32:12 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Twitter.Tests/Publicador_tests.cs	Tue Aug 09 01:04:27 2011 -0400
@@ -37,6 +37,8 @@
 
 			string message;
 			string twitt = null;
+            var fechaInicio = DateTime.Today.AddDays(7).ToUniversalTime();
+            var fechaTermino = fechaInicio.AddHours(2);
 			adapter.Setup(a => a.Update(It.IsAny<string>(), out message)).Returns(true).Callback<string, string>((status, m) => twitt = status);
 
 			var publicador = new TwitterPublicador(adapter.Object);
@@ -46,7 +48,8 @@
 
 			adapter.Verify(a => a.Update(It.IsAny<string>(), out message), Times.Once());
 
-			agenda.Agendar("Identity Providers", TestsHelper.GetOrCreatePonente("Nelo Pauselli"), DateTime.Today.AddDays(7), null, TipoEvento.GrupoEstudio);
+		    agenda.Agendar("Identity Providers", TestsHelper.GetOrCreatePonente("Nelo Pauselli"), fechaInicio, fechaTermino,
+		                   null, TipoEvento.GrupoEstudio);
 
 			adapter.Verify(a => a.Update(It.IsAny<string>(), out message), Times.Exactly(2));
 
--- a/Agendas/trunk/src/Agendas.Twitter/Writers/AgendarTwitterWriter.cs	Mon Aug 08 22:32:12 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Twitter/Writers/AgendarTwitterWriter.cs	Tue Aug 09 01:04:27 2011 -0400
@@ -11,8 +11,8 @@
 			
 			body += " con " + TwitterHelper.GetPonente(track.Evento.Ponente);
 
-			if (track.Evento.Fecha.HasValue)
-				body += " para el " + track.Evento.Fecha.Value.ToShortDateString();
+			if (track.Evento.FechaInicio.HasValue)
+				body += " para el " + track.Evento.FechaInicio.Value.ToShortDateString();
 			return body;
 		}
 	}
--- a/Agendas/trunk/src/Agendas.Twitter/Writers/ConfirmarTwitterWriter.cs	Mon Aug 08 22:32:12 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Twitter/Writers/ConfirmarTwitterWriter.cs	Tue Aug 09 01:04:27 2011 -0400
@@ -7,8 +7,8 @@
 		public string Write(Track track)
 		{
 			{
-				if (track.Evento.Fecha.HasValue)
-					return "Se confirma para el " + track.Evento.Fecha.Value.ToShortDateString() + " el evento " + track.Evento.Titulo +
+				if (track.Evento.FechaInicio.HasValue)
+					return "Se confirma para el " + track.Evento.FechaInicio.Value.ToShortDateString() + " el evento " + track.Evento.Titulo +
 						   " con " + TwitterHelper.GetPonente(track.Evento.Ponente);
 				return string.Empty;
 			}
--- a/Agendas/trunk/src/Agendas.Web/Controllers/CustomAuthorizeAttribute.cs	Mon Aug 08 22:32:12 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Controllers/CustomAuthorizeAttribute.cs	Tue Aug 09 01:04:27 2011 -0400
@@ -1,5 +1,4 @@
-using System.Net;
-using System.Web;
+using System.Web;
 using System.Web.Mvc;
 using AltNetHispano.Agendas.Domain;
 using AltNetHispano.Agendas.Factories;
--- a/Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs	Mon Aug 08 22:32:12 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs	Tue Aug 09 01:04:27 2011 -0400
@@ -13,33 +13,42 @@
 		{
 			var agenda = AgendaFactory.GetAgenda();
 
-			var model = new EventoIndexModel
-			            	{
-			            		ProximosEventos = from e in agenda.GetEventosActivos()
-			            		                  orderby e.Fecha
-			            		                  select new EventoDto
-			            		                         	{
-			            		                         		Id = e.Id.ToString(),
-			            		                         		Titulo = e.Titulo,
-			            		                         		Fecha = e.Fecha.HasValue ? e.Fecha.Value.ToShortDateString() : string.Empty,
-																Estado = e.Estado.Descripcion,
-			            		                         		PuedeAgendar = e.Estado.PuedePromover(Accion.Agendar),
-			            		                         		PuedeModificar = e.Estado.PuedePromover(Accion.Modificar),
-			            		                         		PuedeConfirmar = e.Estado.PuedePromover(Accion.Confirmar),
-			            		                         		PuedePublicar = e.Estado.PuedePromover(Accion.Publicar),
-                                                                PuedeCancelar = e.Estado.PuedePromover(Accion.Cancelar),
-                                                                PuedeDescartar = e.Estado.PuedePromover(Accion.Descartar),
-                                                                PuedeReAgendar = e.Estado.PuedePromover(Accion.ReAgendar),
-                                                                PuedeReProponer = e.Estado.PuedePromover(Accion.ReProponer)
-			            		                         	}
-			            	};
+		    var model = new EventoIndexModel
+		                    {
+		                        ProximosEventos = from e in agenda.GetEventosActivos()
+		                                          orderby e.FechaInicio
+		                                          select new EventoDto
+		                                                     {
+		                                                         Id = e.Id.ToString(),
+		                                                         Titulo = e.Titulo,
+		                                                         Fecha =
+		                                                             e.FechaInicio.HasValue
+		                                                                 ? e.FechaInicio.Value.ToShortDateString() + " " +
+                                                                           e.FechaInicio.Value.ToShortTimeString()
+		                                                                 : string.Empty,
+		                                                         Duracion =
+		                                                             e.FechaInicio.HasValue && e.FechaTermino.HasValue
+		                                                                 ? e.FechaTermino.Value.Subtract(e.FechaInicio.Value).
+		                                                                       ToString("c")
+		                                                                 : string.Empty,
+		                                                         Estado = e.Estado.Descripcion,
+		                                                         PuedeAgendar = e.Estado.PuedePromover(Accion.Agendar),
+		                                                         PuedeModificar = e.Estado.PuedePromover(Accion.Modificar),
+		                                                         PuedeConfirmar = e.Estado.PuedePromover(Accion.Confirmar),
+		                                                         PuedePublicar = e.Estado.PuedePromover(Accion.Publicar),
+		                                                         PuedeCancelar = e.Estado.PuedePromover(Accion.Cancelar),
+		                                                         PuedeDescartar = e.Estado.PuedePromover(Accion.Descartar),
+		                                                         PuedeReAgendar = e.Estado.PuedePromover(Accion.ReAgendar),
+		                                                         PuedeReProponer = e.Estado.PuedePromover(Accion.ReProponer)
+		                                                     }
+		                    };
 			return View(model);
 		}
 
 		[CustomAuthorize(Roles = Roles.Administrador)]
 		public ActionResult Nuevo()
 		{
-		    var model = new EventoNewModel {Fecha = DateTime.Now};
+            var model = new EventoNewModel { Fecha = DateTime.Now, Duracion = new TimeSpan(2, 0, 0), Hora = new TimeSpan(18, 0, 0) };
 		    return View("Defaulteditor", model);
 		}
 
@@ -47,11 +56,13 @@
 		[CustomAuthorize(Roles = Roles.Administrador)]
 		public ActionResult Nuevo(EventoNewModel model)
 		{
-			return
-				GenericAction(
-					(agenda, m) => agenda.Agendar(m.Titulo, m.Ponente, m.Fecha, m.UrlInvitacion, (TipoEvento) m.TipoEvento),
-					m => View("Defaulteditor", m),
-					model);
+		    return
+		        GenericAction(
+		            (agenda, m) => agenda.Agendar(m.Titulo, m.Ponente, GenerarFechaInicio(m.Fecha, m.Hora),
+		                                          GenerarFechaTermino(m.Fecha, m.Hora, m.Duracion), m.UrlInvitacion,
+		                                          (TipoEvento) m.TipoEvento),
+		            m => View("Defaulteditor", m),
+		            model);
 		}
 
     	[CustomAuthorize(Roles = Roles.Administrador)]
@@ -103,7 +114,9 @@
 				Id = id,
 				Titulo = evento.Titulo,
 				Ponente = evento.Ponente != null ? evento.Ponente.Id : Guid.Empty,
-				Fecha = evento.Fecha,
+				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,
 				UrlInvitacion = evento.UrlInvitacion
 			};
             return View("Defaulteditor", model);
@@ -113,11 +126,13 @@
 		[CustomAuthorize(Roles = Roles.Administrador)]
 		public ActionResult Modificar(EventoEditModel model)
 		{
-			return
-			GenericAction(
-				(agenda, m) => agenda.ModificarEvento(new Guid(m.Id), m.Titulo, m.Ponente, m.Fecha.Value, m.UrlInvitacion),
-				m => View("Defaulteditor", m),
-				model);
+		    return
+		        GenericAction(
+		            (agenda, m) =>
+		            agenda.ModificarEvento(new Guid(m.Id), m.Titulo, m.Ponente, GenerarFechaInicio(m.Fecha, m.Hora),
+		                                   GenerarFechaTermino(m.Fecha, m.Hora, m.Duracion), m.UrlInvitacion),
+		            m => View("Defaulteditor", m),
+		            model);
 		}
 
 		[CustomAuthorize(Roles = Roles.Administrador)]
@@ -131,7 +146,9 @@
 				Id = id,
 				Titulo = evento.Titulo,
 				Ponente = evento.Ponente != null ? evento.Ponente.Id : Guid.Empty,
-				Fecha = evento.Fecha,
+				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,
 				UrlInvitacion = evento.UrlInvitacion
 			};
             return View("Defaulteditor", model);
@@ -141,11 +158,13 @@
 		[CustomAuthorize(Roles = Roles.Administrador)]
 		public ActionResult Agendar(EventoAgendarModel model)
 		{
-			return
-				GenericAction(
-					(agenda, m) => agenda.ModificarEvento(new Guid(m.Id), m.Titulo, m.Ponente, m.Fecha.Value, m.UrlInvitacion),
-					m => View("Defaulteditor", m),
-					model);
+		    return
+		        GenericAction(
+		            (agenda, m) =>
+		            agenda.ModificarEvento(new Guid(m.Id), m.Titulo, m.Ponente, GenerarFechaInicio(m.Fecha, m.Hora),
+		                                   GenerarFechaTermino(m.Fecha, m.Hora, m.Duracion), m.UrlInvitacion),
+		            m => View("Defaulteditor", m),
+		            model);
 		}
 
 		[CustomAuthorize(Roles = Roles.Administrador)]
@@ -225,6 +244,20 @@
 			return actionresultOnFail.Invoke(model);
 		}
 
+        private DateTime? GenerarFechaInicio(DateTime? fecha, TimeSpan? hora)
+        {
+            return fecha.HasValue && hora.HasValue
+                       ? new DateTime(fecha.Value.Year, fecha.Value.Month, fecha.Value.Day, hora.Value.Hours,
+                                      hora.Value.Minutes, hora.Value.Seconds, DateTimeKind.Utc)
+                       : (DateTime?) null;
+        }
+        private DateTime? GenerarFechaTermino(DateTime? fecha, TimeSpan? hora, TimeSpan? duracion)
+        {
+            return fecha.HasValue && hora.HasValue && duracion.HasValue
+                       ? new DateTime(fecha.Value.Year, fecha.Value.Month, fecha.Value.Day, hora.Value.Hours,
+                                      hora.Value.Minutes, hora.Value.Seconds, DateTimeKind.Utc).Add(duracion.Value)
+                       : (DateTime?) null;
+        }
 
 	}
 }
--- a/Agendas/trunk/src/Agendas.Web/Controllers/HistoricoController.cs	Mon Aug 08 22:32:12 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Controllers/HistoricoController.cs	Tue Aug 09 01:04:27 2011 -0400
@@ -14,12 +14,12 @@
 			var model = new HistoricoIndexModel
 			            	{
 			            		Items = from e in agenda.GetHistorico()
-			            		        orderby e.Fecha
+			            		        orderby e.FechaInicio
 			            		        select new HistoricoDto
 			            		               	{
 			            		               		Id = e.Id.ToString(),
 			            		               		Titulo = e.Titulo,
-			            		               		Fecha = e.Fecha.HasValue ? e.Fecha.Value.ToShortDateString() : string.Empty,
+			            		               		Fecha = e.FechaInicio.HasValue ? e.FechaInicio.Value.ToShortDateString() : string.Empty,
 			            		               		Wiki = e.UrlWiki,
 													Ponente = e.Ponente.Nombre,
                                                     Numero = e.NumeroOrden.ToString(),
--- a/Agendas/trunk/src/Agendas.Web/Models/EventoModel.cs	Mon Aug 08 22:32:12 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Models/EventoModel.cs	Tue Aug 09 01:04:27 2011 -0400
@@ -25,7 +25,13 @@
 		[Required]
 		public DateTime Fecha { get; set; }
 
-		[Url]
+        [Required]
+	    public TimeSpan Hora { get; set; }
+
+        [Required]
+        public TimeSpan Duracion { get; set; }
+
+	    [Url]
 		public string UrlInvitacion { get; set; }
 	}
 
@@ -43,6 +49,12 @@
 		[Required]
 		public DateTime? Fecha { get; set; }
 
+        [Required]
+        public TimeSpan? Hora { get; set; }
+
+        [Required]
+        public TimeSpan? Duracion { get; set; }
+
 		[Url]
 		public string UrlInvitacion { get; set; }
 	}
@@ -61,6 +73,12 @@
 		[Required]
 		public DateTime? Fecha { get; set; }
 
+        [Required]
+        public TimeSpan? Hora { get; set; }
+
+        [Required]
+        public TimeSpan? Duracion { get; set; }
+
 		[Url]
 		public string UrlInvitacion { get; set; }
 	}
@@ -92,8 +110,9 @@
 		public string Titulo { get; set; }
 		public string Estado { get; set; }
 		public string Fecha { get; set; }
+        public string Duracion { get; set; }
 
-		public bool PuedeAgendar { get; set; }
+	    public bool PuedeAgendar { get; set; }
 		public bool PuedeModificar { get; set; }
 		public bool PuedeConfirmar { get; set; }
 		public bool PuedePublicar { get; set; }
--- a/Agendas/trunk/src/Agendas.Web/Views/Evento/Index.cshtml	Mon Aug 08 22:32:12 2011 -0300
+++ b/Agendas/trunk/src/Agendas.Web/Views/Evento/Index.cshtml	Tue Aug 09 01:04:27 2011 -0400
@@ -7,7 +7,8 @@
 	<table>
 		<thead>
 			<tr>
-				<th>Fecha</th>
+				<th>Fecha (GMT +0)</th>
+                <th>Duraci&oacute;n</th>
 				<th>Evento</th>
 				<th>Estado</th>
 				<th>Acciones</th>
@@ -18,6 +19,7 @@
 			{
 				<tr>
 					<td>@item.Fecha</td>
+                    <td>@item.Duracion</td>
 					<td>@item.Titulo</td>
 					<td>@item.Estado</td>
 					<td class="buttons">