public ActionResult EfetuarPgto(Debito PgtoDebito)
        {
            if (ModelState.IsValid)
            {
                using (var bd = new BibliotecaDatabase())
                {
                    if (PgtoDebito.DebitoId <= 0)
                    {
                        throw new Exception("Não é possível efetuar o pagamento deste empréstimo. Id desconhecido.");
                    }
                    else
                    {
                        var pgtoAux = RetornaInfoDebito(PgtoDebito.DebitoId);
                        PgtoDebito = pgtoAux;
                        PgtoDebito.DebitoAtivo = false;
                        bd.Entry(PgtoDebito).State = EntityState.Modified;
                    }

                    bd.SaveChanges();

                    return RedirectToAction("index");
                }
            }
            return RedirectToAction("index");
        }
 private void AdicionaLivro(Livro livro)
 {
     using (var ld = new BibliotecaDatabase())
     {
         Debug.WriteLine(ld.Database.Connection.ConnectionString);
         ld.Livros.Add(livro);
         ld.SaveChanges();
     }
 }
        public ActionResult Novo(UsuarioViewModel usuario)
        {
            if (ModelState.IsValid)
            {
                using (var bd = new BibliotecaDatabase())
                {

                    if (usuario.UsuarioId > 0)
                    {
                        bd.Entry(usuario.ParaEntidade()).State = EntityState.Modified;
                    }
                    else
                    {

                        if (!WebSecurity.UserExists(usuario.Login))
                        {
                            bd.Usuarios.Add(usuario.ParaEntidade());
                            WebSecurity.CreateUserAndAccount(usuario.Login, usuario.Senha);
                            if (usuario.TipoUsuario == TipoUsuario.Operador)
                            {
                                Roles.AddUserToRole(usuario.Login, "PodeAdicionarLivro");
                                Roles.AddUserToRole(usuario.Login, "PodeEmprestar");
                            }


                            Roles.AddUserToRole(usuario.Login, "PodeComentar");
                            Roles.AddUserToRole(usuario.Login, "PodeReservar");

                        }
                        else
                        {
                            return View("Erro");
                        }
                        
                    }
                       
                    bd.SaveChanges();
                    
                    return RedirectToAction("index");
                } 
            }
            return View(usuario);
        }
        public ActionResult AdicionarComentario(long livroId, string comentario)
        {
            using (var bd = new BibliotecaDatabase())
            {
                var livro = (from l in bd.Livros.Include(c => c.Comentarios)
                             where l.LivroId == livroId
                             select l).SingleOrDefault();

                livro.Comentarios.Add(new ComentarioLivro { Comentario = comentario });
                bd.SaveChanges();
               
                if (Request.IsAjaxRequest())
                {
                    ViewBag.Comentario = comentario;
                    return PartialView();
                }
                return RedirectToAction("Index");
            }

        }
        public void Devolver(int idEmprestimo)
        {
            using (var bd = new BibliotecaDatabase())
            {
                try
                {
                    var emprestimo = CarregarEmprestimo(idEmprestimo);

                    emprestimo.DevolvidoEm = DateTime.Now;
                    bd.Entry(emprestimo).State = EntityState.Modified;

                    var diasAtraso = CalcularDiasAtraso(emprestimo.DevolverAte, emprestimo.DevolvidoEm.Value);
                    //var diasAtraso = CalcularDiasAtrasoAlternativo(emprestimo.DevolverAte, emprestimo.DevolvidoEm);

                    if (diasAtraso > 0)
                    {
                        var debito = new Debito
                                            {
                                                DebitoAtivo = true,
                                                Emprestimo = emprestimo,
                                                UsuarioDeb = emprestimo.UsuarioEmprestimo,
                                                DiasAtraso = diasAtraso
                                            };

                        bd.Debitos.Add(debito);
                    }
                    bd.SaveChanges();
                }
                catch (Exception ex)
                {

                    throw ex;
                }
            }
        }
        public ActionResult Emprestar(int livroId, int usuarioId)
        {
            DateTime hoje = DateTime.Now;
            string msg = ("");
            bool reservado = false;

            try
            {
                // Se ocorrer qualquer erro, exibe a mensagem ao usuário, na tela de empréstimos.
                using (var bd = new BibliotecaDatabase())
                {
                    var livro = bd.Livros.Find(livroId);
                    if (livro == null)
                    {
                        msg = ("Não foi possível encontrar o livro: " + livroId);
                        throw new Exception(msg);
                    }

                    // Verifica se o livro está emprestado                    
                    if (ObterEmprestimoDoLivro(livroId) != null)
                    {
                        msg = ("O livro " + livro.Titulo + ", com código " + livroId +  ", já está emprestado");
                        throw new Exception(msg);
                    }

                    // Verifica se o livro está reservado
                    //Márcio Koch: Ajustada a verificação da reserva do livro.
                    ReservaLivro reserva = ReservaController.getReserva(livroId);
                    reservado = reserva != null && reserva.ReservaLivroId > 0;
                    if (reservado && !reserva.UsuarioDeb.UsuarioId.Equals(usuarioId))
                    {
                        msg = ("O livro " + livro.Titulo + " está reservado para outro usuário.");
                        throw new Exception(msg);
                    }                    

                    // Verifica se o usuário existe
                    var usuario = bd.Usuarios.Find(usuarioId);
                    if (usuario == null)
                    {
                        msg = ("Não foi possível encontrar o usuário: " + usuarioId);
                        throw new Exception(msg);
                    }

                    // Verifica a quantidade de livros emprestados para o Usuário e o tipo do usuário.
                    IEnumerable<Emprestimo> emprestimosAtivos = ObterEmprestimosDoUsuario(usuarioId);
                    int quantidadeEmprestada = emprestimosAtivos.Count();

                    if (PodeEmprestar(usuario, quantidadeEmprestada))
                    {
                        DateTime prazo = GetPrazo(usuario.TipoUsuario);
                        Emprestimo emprestimo = new Emprestimo { LivroEmprestimo = livro, UsuarioEmprestimo = usuario, RetiradoEm = hoje, DevolverAte = prazo };
                        bd.Emprestimos.Add(emprestimo);

                        //Márcio Koch - Libera a reserva do livro, caso ele esteja reservado.
                        if (reservado)
                        {                            
                            reserva = bd.Reservas.Find(reserva.ReservaLivroId);
                            reserva.Situacao = false;//Libera a reserva                            
                        }

                        bd.SaveChanges();
                        msg = ("Livro emprestado com sucesso, com prazo até " + prazo + " " + msg);
                    }
                    else
                    {
                        // Exibe mensagem de erro ao usuário.
                        msg = ("O empréstimo não foi efetuado, foi excedido o número de livros emprestados ao usuário. " + msg);
                        throw new Exception(msg);
                    }
                }
            }
            catch
            {
                ViewBag.Mensagem = msg;
                return View("Index", new EmprestimoViewModel());
            }
            ViewBag.Mensagem = msg;
            return View("Index", new EmprestimoViewModel() );
        }
 public ActionResult Excluir(long usuarioId)
 {
     using (var bd = new BibliotecaDatabase())
     {
         var usuario = bd.Usuarios.Find(usuarioId);
         bd.Entry(usuario).State = EntityState.Deleted;
         bd.SaveChanges();
         return RedirectToAction("index");
     }
 }
        public ActionResult Reservar(int livroId)
        {

            using (var bd = new BibliotecaDatabase())
            {
                var livro = bd.Livros.Find(livroId);

                //Busca o usuário logado na base
                var usuario = (from u in bd.Usuarios
                              where u.Login.Equals(User.Identity.Name) 
                              select u).FirstOrDefault();
                
                if(usuario == null)
                {
                    ErroReserva erro = new ErroReserva();
                    erro.mensagem = "Não foi possível encontrar o usuário '" + User.Identity.Name + "'. É possível que a base de usuários e o controle de login estejam desincronizados.";
                    return View("Erro", erro);                    
                }

                ReservaLivro reserva = new ReservaLivro();
                reserva.LivroRelacionado = livro;
                reserva.UsuarioDeb = usuario;
                reserva.Situacao = true;
                reserva.DtReserva = DateTime.Today;

                bd.Reservas.Add(reserva);
                bd.SaveChanges();
            }

            return View("ReservaEfetuadaComSucesso");
        }