public JsonResult Salvar(EventoViewModel input)
 {
     Evento evento;
     try
     {
         evento = GerarEvento(input);
         agenda.Agendar(evento);
     }
     catch (Exception ex)
     {
         if (ex is DbCException
             || ex is LocalReservadoException
             || ex is EventoParoquialExistenteException)
         {
             Response.StatusCode = (int)HttpStatusCode.InternalServerError;
             return Json(new { ErrorMessage = ex.Message.Replace(Environment.NewLine, "<br/>") });
         }
         else
         {
             throw;
         }
     }
     return Json(evento);
 }
        private Evento GerarEvento(EventoViewModel input)
        {
            Evento evento;

            if (!string.IsNullOrEmpty(input.Id))
            {
                evento = RavenSession.Load<Evento>(input.Id);
                evento.Alterar(input.Nome, input.Descricao, input.DataInicio.GetValueOrDefault(), input.DataFim.GetValueOrDefault(), GrupoLogado, ((TipoEventoEnum)input.Tipo));
                var reservas = new List<Reserva>();
                foreach (var reserva in input.Reservas)
                {
                    var local = RavenSession.ObterLocais().First(l => l.Id == reserva.LocalId);
                    reservas.Add(new Reserva(local, reserva.Data.GetValueOrDefault(), reserva.Hora));
                }
                evento.AlterarReservasDeLocais(reservas);
            }
            else
            {
                evento = new Evento(
                    input.Nome,
                    input.Descricao,
                    input.DataInicio.GetValueOrDefault(),
                    input.DataFim.GetValueOrDefault(),
                    GrupoLogado,
                    ((TipoEventoEnum)input.Tipo)
                );
                foreach (var reserva in input.Reservas)
                {
                    var local = RavenSession.ObterLocais().First(l => l.Id == reserva.LocalId);
                    evento.Reservar(local, reserva.Data.GetValueOrDefault(), reserva.Hora);
                }
            }
            return evento;
        }