view Agendas/trunk/src/Agendas.Web/Controllers/EventoController.cs @ 133:6f1041301797

Se agregan los estados Cancelado y Descartado con las acciones Cancelar, Reagendar, Descartar, Reproponer, según ticket 146. Falta solucionar problema con flujo, ver más información en el ticket de assembla. http://www.assembla.com/spaces/altnet-hispano/tickets/146-implementar-estado-descartar-y-cancelar-de-eventos
author alabra
date Sun, 10 Jul 2011 23:59:19 -0400
parents b74734a1a755
children 3639803112c6
line wrap: on
line source

using System;
using System.Linq;
using System.Web.Mvc;
using AltNetHispano.Agendas.Domain;
using AltNetHispano.Agendas.Factories;
using AltNetHispano.Agendas.Web.Models;

namespace AltNetHispano.Agendas.Web.Controllers
{
	public class EventoController : Controller
	{
		public ActionResult Index()
		{
			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,
			            		                         		PuedeAgendar = e.GetEstado().PuedePromover(Accion.Agendar),
			            		                         		PuedeModificar = e.GetEstado().PuedePromover(Accion.Modificar),
			            		                         		PuedeConfirmar = e.GetEstado().PuedePromover(Accion.Confirmar),
			            		                         		PuedePublicar = e.GetEstado().PuedePromover(Accion.Publicar),
                                                                PuedeCancelar = e.GetEstado().PuedePromover(Accion.Cancelar),
                                                                PuedeDescartar = e.GetEstado().PuedePromover(Accion.Descartar),
                                                                PuedeReAgendar = e.GetEstado().PuedePromover(Accion.ReAgendar),
                                                                PuedeReProponer = e.GetEstado().PuedePromover(Accion.ReProponer)
			            		                         	}
			            	};
			return View(model);
		}

		[Authorize]
		public ActionResult Nuevo()
		{
		    var eventoModel = new EventoNewModel {Fecha = DateTime.Now};
		    return View(eventoModel);
		}

		[HttpPost]
		[Authorize]
		public ActionResult Nuevo(EventoNewModel model)
		{
			if (ModelState.IsValid)
			{
				var agenda = AgendaFactory.GetAgenda();

				var r = agenda.Agendar(model.Titulo, model.Ponente, model.Fecha,
				  model.UrlInvitacion, (TipoEvento)model.Tipo);
				if (r.Succeful)
				{
					this.AddNotification("Datos guardados");
					return RedirectToAction("Index");
				}
				ModelState.AddModelError("error", r.ToString());
			}
			return View(model);
		}

		[Authorize]
		public ActionResult Confirmar(string id)
		{
			var agenda = AgendaFactory.GetAgenda();
			agenda.Confirmar(new Guid(id));

			this.AddNotification("Evento confirmado");
			return RedirectToAction("Index");
		}

		[Authorize]
		public ActionResult Publicar(string id)
		{
			var agenda = AgendaFactory.GetAgenda();
			agenda.Publicar(new Guid(id), 0, string.Empty);

			this.AddNotification("Evento publicado");
			return RedirectToAction("Index");
		}

		[Authorize]
		public ActionResult Modificar(string id)
		{
			var agenda = AgendaFactory.GetAgenda();
			var evento = agenda.GetEvento(new Guid(id));

			var model = new EventoEditModel
			{
				Id = id,
				Titulo = evento.Titulo,
				Ponente = evento.Ponente != null ? evento.Ponente.Nombre : string.Empty,
				Fecha = evento.Fecha,
				UrlInvitacion = evento.UrlInvitacion
			};
			return View(model);
		}
		
		[HttpPost]
		[Authorize]
		public ActionResult Modificar(EventoEditModel model)
		{
			if (ModelState.IsValid)
			{
				var agenda = AgendaFactory.GetAgenda();

				var r = agenda.ModificarEvento(new Guid(model.Id), model.Titulo, model.Ponente, model.Fecha.Value, model.UrlInvitacion);
				if (r.Succeful)
				{
					this.AddNotification("datos guardados");
					return RedirectToAction("Index");
				}
				ModelState.AddModelError("error", r.ToString());
			}
			return View(model);
		}

		[Authorize]
		public ActionResult Agendar(string id)
		{
			var agenda = AgendaFactory.GetAgenda();
			var evento = agenda.GetEvento(new Guid(id));

			var model = new EventoAgendarModel
			{
				Id = id,
				Titulo = evento.Titulo,
				Ponente = evento.Ponente != null ? evento.Ponente.Nombre : string.Empty,
				Fecha = evento.Fecha,
				UrlInvitacion = evento.UrlInvitacion
			};
			return View(model);
		}

		[HttpPost]
		[Authorize]
		public ActionResult Agendar(EventoAgendarModel model)
		{
			if (ModelState.IsValid)
			{
				var agenda = AgendaFactory.GetAgenda();

				var r = agenda.ModificarEvento(new Guid(model.Id), model.Titulo, model.Ponente, model.Fecha.Value, model.UrlInvitacion);
				if (r.Succeful)
				{
					this.AddNotification("evento agendado");
					return RedirectToAction("Index");
				}
				ModelState.AddModelError("error", r.ToString());
			}
			return View(model);
		}

		[Authorize]
		public ActionResult Proponer()
		{
			return View(new PropuestaNewModel());
		}

		[HttpPost]
		[Authorize]
		public ActionResult Proponer(PropuestaNewModel model)
		{
			if (ModelState.IsValid)
			{
				var agenda = AgendaFactory.GetAgenda();

				var r = agenda.Proponer(model.Titulo, model.Ponente, model.UrlInvitacion, (TipoEvento)model.Tipo);
				if (r.Succeful)
					return RedirectToAction("Index");
				ModelState.AddModelError("error", r.ToString());
			}
			return View(model);
		}
        
        [Authorize]
	    public ActionResult Cancelar(string id)
	    {
            var agenda = AgendaFactory.GetAgenda();
            agenda.Cancelar(new Guid(id));

            this.AddNotification("Evento cancelado");
            return RedirectToAction("Index");
	    }

        [Authorize]
	    public ActionResult Descartar(string id)
	    {
            var agenda = AgendaFactory.GetAgenda();
            agenda.Descartar(new Guid(id));

            this.AddNotification("Evento descartado");
            return RedirectToAction("Index");
	    }

        [Authorize]
	    public ActionResult ReAgendar(string id)
	    {
            var agenda = AgendaFactory.GetAgenda();
            agenda.ReAgendar(new Guid(id));

            this.AddNotification("Evento re-agendado");
            return RedirectToAction("Index");
	    }

        [Authorize]
	    public ActionResult ReProponer(string id)
	    {
            var agenda = AgendaFactory.GetAgenda();
            agenda.ReProponer(new Guid(id));

            this.AddNotification("Evento re-propuesto");
            return RedirectToAction("Index");
	    }
	}
}