public ActionResult Projeto(int idProjeto)
        {
            try
            {
                LogBLL.Insert(new LogDado("Projeto", "Orcamento", _idUsuario));
                using (var db = new Context())
                {
                    var _bll = new BLL.ProjetoBLL(db, _idUsuario);
                    var _produtoBLL = new BLL.ProdutoBLL(db, _idUsuario);

                    var _projeto = _bll.Find(e => e.idProjeto == idProjeto)
                        .Select(u => new Models.Orcamento.ProjetoVM
                        {
                            idProjeto = idProjeto,
                            descricao = u.descricao,                            
                        }).FirstOrDefault();
                    _projeto.Produtos = _produtoBLL.Find(u => u.idProjeto == idProjeto)
                        .Select(k => new
                             Models.Orcamento.ProjetoVM.ProdutoVM
                             {
                                 idProduto = k.idProduto,
                                 nome = k.nome,
                                 descricao = k.descricao
                             }).ToList();
                    return View(_projeto);
                }
            }
            catch (Exception ex)
            {
                RP.Util.Entity.ErroLog.Add(ex, Session.SessionID, _idUsuario);
                return RedirectToAction("Index", "Erro", new { area = string.Empty });
            }
        }
        public ActionResult Projeto()
        {
            try
            {
                LogBLL.Insert(new LogDado("Projeto", "Requisicao", _idUsuario));
                using (var db = new Context())
                {
                    var _bll = new BLL.ProjetoBLL(db, _idUsuario);

                    var _projetos = _bll.Find(e => e.status != RP.Sistema.Model.Entities.Projeto.CANCELADO && e.flConcluido != "Sim", u => u.Cliente).ToList();

                    return View(_projetos);
                }
            }
            catch (Exception ex)
            {
                RP.Util.Entity.ErroLog.Add(ex, Session.SessionID, _idUsuario);
                return RedirectToAction("Index", "Erro", new { area = string.Empty });
            }
        }
        public ActionResult Search(string filter, int? page, int? pagesize)
        {
            try
            {
                LogBLL.Insert(new LogDado("Search", "Orcamento", _idUsuario));
                using (var db = new Context())
                {
                    var _bll = new BLL.ProjetoBLL(db, _idUsuario);

                    var result = _bll.Search(filter, page, pagesize);

                    return View("Index", result);
                }
            }
            catch (Exception ex)
            {
                Util.Entity.ErroLog.Add(ex, Session.SessionID, _idUsuario);
                return RedirectToAction("Index", "Erro", new { area = string.Empty });
            }
        }
        public ActionResult Create(int idProjeto)
        {
            try
            {
                using (var db = new Context())
                {
                    var _bll = new BLL.ProjetoBLL(db, _idUsuario);

                    var _projeto = _bll.FindSingle(e => e.idProjeto == idProjeto, u => u.Produtos.Select(k => k.ProdutoMateriais.Select(j => j.Material)));
                    var _result = new RequisicaoVM
                    {
                        Projeto = RP.Sistema.Web.Models.Projeto.Consultar.GetModel(_projeto),
                        Itens = RequisicaoVM.RequisicaoItemVM.GetItens(_projeto.Produtos.ToList()),
                    };

                    return View(_result);
                }
            }
            catch (Exception ex)
            {
                RP.Util.Entity.ErroLog.Add(ex, Session.SessionID, _idUsuario);
                return RedirectToAction("Index", "Erro", new { area = string.Empty });
            }
        }
        public JsonResult JsCreate(Projeto model)
        {
            try
            {
                LogBLL.Insert(new LogDado("JsCreate", "Projeto", _idUsuario));
                using (var db = new Context())
                {
                    using (var trans = new RP.DataAccess.RPTransactionScope(db))
                    {
                        var _bll = new BLL.ProjetoBLL(db, _idUsuario);

                        _bll.Insert(model);
                        _bll.SaveChanges();

                        trans.Complete();

                        return Json(new { model = model }, JsonRequestBehavior.AllowGet);
                    }
                }
            }

            catch (Exception ex)
            {
                Response.StatusCode = 500;
                return Json(RP.Util.Exception.Message.Get(ex), JsonRequestBehavior.AllowGet);
            }
        }
        public JsonResult JsSearch(string filter, int? page, int? pagesize)
        {
            try
            {
                using (var db = new Context())
                {
                    var _bll = new BLL.ProjetoBLL(db, _idUsuario);

                    var result = _bll.Search(filter, page, pagesize, true);

                    var list = result.Select(s => new
                    {
                        s.idProjeto,
                        s.descricao,
                        s.status,
                        s.Cliente.nome
                    });

                    return Json(new Util.Class.JsonCollection { result = list, count = result.TotalCount }, JsonRequestBehavior.AllowGet);
                }
            }
            catch (Exception ex)
            {
                Response.StatusCode = 500;
                return Json(RP.Util.Exception.Message.Get(ex), JsonRequestBehavior.AllowGet);
            }
        }
        public ActionResult Create(AprovarVM model)
        {
            if (string.IsNullOrEmpty(model.Vendedor.nome))
            {
                ModelState.AddModelError("Vendedor.nome", "Selecione um vendedor");
            }
            if (string.IsNullOrEmpty(model.Cliente.nome))
            {
                ModelState.AddModelError("Cliente.nome", "Selecione um cliente");
            }
            if (ModelState.IsValid)
            {
                try
                {
                    LogBLL.Insert(new LogDado("Create", "Projeto", _idUsuario));
                    using (var db = new Context())
                    {
                        using (var trans = new RP.DataAccess.RPTransactionScope(db))
                        {
                            var _projeto = model.GetProjeto();

                            var _bll = new BLL.ProjetoBLL(db, _idUsuario);

                            _bll.Insert(_projeto);
                            _bll.SaveChanges();
                            trans.Complete();

                            model.idProjeto = _projeto.idProjeto;

                            this.AddFlashMessage(RP.Util.Resource.Message.INSERT_SUCCESS, FlashMessage.SUCCESS);
                            return RedirectToAction("Index");
                        }
                    }
                }
                catch (Exception ex)
                {
                    RP.Util.Entity.ErroLog.Add(ex, Session.SessionID, _idUsuario);
                    return RedirectToAction("Index", "Erro", new { area = string.Empty });
                }
            }
            return View(model);
        }
        public ActionResult Orcamento(int idProjeto, string dsObservacao, string dsCondicao, string dsGarantia, string dsPrevisao, string dsIncluso, string dsValidade)
        {
            try
            {
                LogBLL.Insert(new LogDado("Orcamento", "Projeto", _idUsuario));
                using (var db = new Context())
                {

                    using (var trans = new RP.DataAccess.RPTransactionScope(db))
                    {
                        var _bll = new BLL.ProjetoBLL(db, _idUsuario);

                        var _projeto = _bll.FindSingle(u => u.idProjeto == idProjeto);

                        _projeto.dsCondicao = dsCondicao;
                        _projeto.dsGarantia = dsGarantia;
                        _projeto.dsIncluso = dsIncluso;
                        _projeto.dsObservacao = dsObservacao;
                        _projeto.dsPrevisao = dsPrevisao;
                        _projeto.dsValidade = dsValidade;
                        _bll.SaveChanges();

                        trans.Complete();
                    }
                    return new Report.Class.OrcamentoCliente().GetReport(db, idProjeto, dsObservacao, dsCondicao, dsGarantia, dsPrevisao, dsIncluso, dsValidade, _idUsuario);
                }
            }
            catch (Exception ex)
            {
                RP.Util.Entity.ErroLog.Add(ex, Session.SessionID, _idUsuario);
                return RedirectToAction("Index", "Erro", new { area = string.Empty });
            }
        }
        private ActionResult GetView(int id)
        {
            try
            {
                using (var db = new Context())
                {
                    var _bll = new BLL.ProjetoBLL(db, _idUsuario);

                    var _projeto = _bll.FindSingle(e => e.idProjeto == id,
                        u => u.Cliente, u => u.Vendedor, u => u.Produtos, u => u.ProjetoCustos,
                        u => u.Produtos.Select(l => l.ProdutoMateriais),
                        u => u.Produtos.Select(k => k.Marceneiro), u => u.Produtos.Select(k => k.Projetista));

                    return View(AprovarVM.GetProjeto(_projeto));
                }
            }
            catch (Exception ex)
            {
                RP.Util.Entity.ErroLog.Add(ex, Session.SessionID, _idUsuario);
                return RedirectToAction("Index", "Erro", new { area = string.Empty });
            }
        }
        public ActionResult Finalizar(int id)
        {
            try
            {
                LogBLL.Insert(new LogDado("Finalizar", "Projeto", _idUsuario));
                using (var db = new Context())
                {
                    using (var trans = new RP.DataAccess.RPTransactionScope(db))
                    {
                        var _bll = new BLL.ProjetoBLL(db, _idUsuario);

                        _bll.Finalizar(id);
                        _bll.SaveChanges();

                        trans.Complete();

                        this.AddFlashMessage("Projeto finalizado com sucesso", FlashMessage.INFO);
                        return RedirectToAction("Index");
                    }
                }
            }
            catch (Exception ex)
            {
                RP.Util.Entity.ErroLog.Add(ex, Session.SessionID, _idUsuario);
                return RedirectToAction("Index");
            }
        }
        public ActionResult Orcamento(int idProjeto)
        {
            try
            {
                using (var db = new Context())
                {
                    var _bll = new BLL.ProjetoBLL(db, _idUsuario);

                    var _projeto = _bll.Find(u => u.idProjeto == idProjeto)
                        .Select(u => new 
                        {
                            u.dsCondicao,
                            u.dsGarantia,
                            u.dsIncluso,
                            u.dsObservacao,
                            u.dsPrevisao,
                            u.dsValidade
                        }).FirstOrDefault();

                    ViewBag.dsCondicao = _projeto.dsCondicao;
                    ViewBag.dsGarantia = _projeto.dsGarantia;
                    ViewBag.dsIncluso = _projeto.dsIncluso;
                    ViewBag.dsObservacao = _projeto.dsObservacao;
                    ViewBag.dsPrevisao = _projeto.dsPrevisao;
                    ViewBag.dsValidade = _projeto.dsValidade;

                    return View(idProjeto);
                }
            }
            catch (Exception ex)
            {
                RP.Util.Entity.ErroLog.Add(ex, Session.SessionID, _idUsuario);
                return RedirectToAction("Index");
            }
        }
        public ActionResult Delete(int id)
        {
            try
            {
                using (var db = new Context())
                {
                    using (var trans = new RP.DataAccess.RPTransactionScope(db))
                    {
                        var _bll = new BLL.ProjetoBLL(db, _idUsuario);

                        _bll.Cancelar(id);
                        _bll.SaveChanges();

                        trans.Complete();

                        this.AddFlashMessage("Projeto cancelado com sucesso", FlashMessage.SUCCESS);
                        return RedirectToAction("Index");
                    }
                }
            }
            catch (Exception ex)
            {
                RP.Util.Entity.ErroLog.Add(ex, Session.SessionID, _idUsuario);
                RP.Util.Entity.ErroLog.Add(ex, Session.SessionID, _idUsuario);
                return RedirectToAction("Index");
            }
        }
        public ActionResult AddCusto(CustoProjetoVM model)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    LogBLL.Insert(new LogDado("AddCusto", "Projeto", _idUsuario));
                    using (var db = new Context())
                    {
                        using (var trans = new RP.DataAccess.RPTransactionScope(db))
                        {
                            var _projeto = model.GetProjeto();

                            var _bll = new BLL.ProjetoBLL(db, _idUsuario);

                            _bll.AddCustos(_projeto);
                            _bll.SaveChanges();
                            trans.Complete();

                            this.AddFlashMessage(RP.Util.Resource.Message.INSERT_SUCCESS, FlashMessage.SUCCESS);
                            return RedirectToAction("Index");
                        }
                    }
                }
                catch (Exception ex)
                {
                    RP.Util.Entity.ErroLog.Add(ex, Session.SessionID, _idUsuario);
                    return RedirectToAction("Index", "Erro", new { area = string.Empty });
                }
            }
            return View(model);
        }
        public ActionResult Aprovar(AprovarVM model)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    LogBLL.Insert(new LogDado("Aprovar", "Projeto", _idUsuario));
                    using (var db = new Context())
                    {
                        using (var trans = new RP.DataAccess.RPTransactionScope(db))
                        {
                            var _projeto = model.GetProjeto();

                            var _bll = new BLL.ProjetoBLL(db, _idUsuario);
                            if (_projeto.status == Projeto.VENDIDO)
                            {
                                var _movimentoBLL = new MovimentoProfissionalBLL(db, _idUsuario);
                                var _contaBLL = new ContaReceberBLL(db, _idUsuario);
                                int nrParcelas = model.Parcelas.Count;
                                foreach (var item in model.Parcelas)
                                {
                                    //comissao do vendedor
                                    _movimentoBLL.Insert(new MovimentoProfissional
                                    {
                                        tipo = MovimentoProfissional.TIPO_COMISSAO,
                                        idFuncionario = model.Vendedor.idFuncionario ?? 0,
                                        valor = ((model.porcentagemVendedor / 100) * item.vlParcela),
                                        idProjeto = _projeto.idProjeto,
                                        situacao = MovimentoProfissional.SITUACAO_PENDENTE,
                                        descricao = "Comissão referente a " + item.nrParcela + "º parcela do projeto " + _projeto.descricao,
                                        dtVencimento = item.dtVencimento
                                    });

                                    foreach (var produto in _projeto.Produtos)
                                    {
                                        decimal vlParcela = (produto.vlVenda ?? 0) / nrParcelas;

                                        //comissao do projetista
                                        _movimentoBLL.Insert(new MovimentoProfissional
                                        {
                                            tipo = MovimentoProfissional.TIPO_COMISSAO,
                                            idFuncionario = produto.idProjetista ?? 0,
                                            valor = (((produto.porcentagemProjetista ?? 0) / 100) * vlParcela),
                                            idProjeto = _projeto.idProjeto,
                                            situacao = MovimentoProfissional.SITUACAO_PENDENTE,
                                            descricao = "Comissão referente a " + item.nrParcela + "º parcela do projeto " + _projeto.descricao + " [" + produto.nome + "]",
                                            dtVencimento = item.dtVencimento
                                        });

                                        //comissao do marceneiro
                                        _movimentoBLL.Insert(new MovimentoProfissional
                                        {
                                            tipo = MovimentoProfissional.TIPO_COMISSAO,
                                            idFuncionario = produto.idMarceneiro ?? 0,
                                            valor = (((produto.porcentagemMarceneiro ?? 0) / 100) * vlParcela),
                                            idProjeto = _projeto.idProjeto,
                                            situacao = MovimentoProfissional.SITUACAO_PENDENTE,
                                            descricao = "Comissão referente a " + item.nrParcela + "º parcela do projeto " + _projeto.descricao + " [" + produto.nome + "]",
                                            dtVencimento = item.dtVencimento
                                        });

                                    }

                                    string situacao = ContaReceber.SITUACAO_AGUARDANDO_PAGAMENTO;
                                    decimal? vlPago = null;
                                    DateTime? dtPagamento = null;
                                    if (item.dtVencimento <= DateTime.Now.Date)
                                    {
                                        vlPago = item.vlParcela;
                                        situacao = ContaReceber.SITUACAO_PAGO;
                                        dtPagamento = item.dtVencimento;
                                    }

                                    // Lança conta a receber referente a parcela
                                    var _conta = new ContaReceber
                                    {
                                        idCliente = _projeto.idCliente,
                                        parcela = item.nrParcela,
                                        descricao = "Conta a receber referente a " + item.nrParcela + "º parcela do projeto " + _projeto.descricao + ".  " + item.dsObservacao,
                                        vencimento = item.dtVencimento,
                                        pagamento = dtPagamento,
                                        valorConta = item.vlParcela,
                                        valorPago = vlPago,
                                        situacao = situacao,
                                        flFormaPagamento = item.flFormaPagamento,
                                        idProjeto = _projeto.idProjeto
                                    };
                                    _contaBLL.Insert(_conta);

                                    //se a data de vencimento for a atual lança a entrada no caixa
                                    if (item.dtVencimento <= DateTime.Now.Date)
                                    {
                                        var _caixaBLL = new CaixaBLL(db, _idUsuario);
                                        _caixaBLL.Insert(new Caixa
                                        {
                                            ContaReceber = _conta,
                                            situacao = Caixa.CORENTE,
                                            valor = item.vlParcela,
                                            descricao = _conta.descricao + " [" +model.Cliente.nome + "] " + item.dsObservacao,
                                            dtLancamento = dtPagamento.Value
                                        });
                                    }
                                }
                            }

                            _bll.Aprovar(_projeto);
                            _bll.SaveChanges();
                            trans.Complete();

                            this.AddFlashMessage("Projeto atualizado com sucesso!", FlashMessage.SUCCESS);
                            return RedirectToAction("Index");
                        }
                    }
                }
                catch (Exception ex)
                {
                    RP.Util.Entity.ErroLog.Add(ex, Session.SessionID, _idUsuario);
                    return RedirectToAction("Index", "Erro", new { area = string.Empty });
                }
            }
            return View(model);
        }
        public ActionResult AddCusto(int id)
        {
            try
            {
                using (var db = new Context())
                {
                    var _bll = new BLL.ProjetoBLL(db, _idUsuario);

                    var _projeto = _bll.FindSingle(e => e.idProjeto == id, u => u.Cliente, u => u.ProjetoCustos);

                    return View(CustoProjetoVM.GetProjeto(_projeto));
                }
            }
            catch (Exception ex)
            {
                RP.Util.Entity.ErroLog.Add(ex, Session.SessionID, _idUsuario);
                return RedirectToAction("Index", "Erro", new { area = string.Empty });
            }
        }
        public ActionResult AddItem(AprovarVM model)
        {
            try
            {
                LogBLL.Insert(new LogDado("AddItem", "Projeto", _idUsuario));
                using (var db = new Context())
                {
                    using (var trans = new RP.DataAccess.RPTransactionScope(db))
                    {
                        var _bll = new BLL.ProjetoBLL(db, _idUsuario);

                        var margemGanho = model.margemGanhoMaterial;

                        var _projeto = _bll.FindSingle(e => e.idProjeto == model.idProjeto,
                            u => u.Cliente, u => u.Vendedor, u => u.Produtos, u => u.ProjetoCustos,
                            u => u.Produtos.Select(l => l.ProdutoMateriais),
                            u => u.Produtos.Select(k => k.Marceneiro), u => u.Produtos.Select(k => k.Projetista));

                        model = AprovarVM.GetProjeto(_projeto);

                        _projeto.vlProjeto = model.Produtos.Sum(u => u.vlProduto);
                        _projeto.vlVenda = model.Produtos.Sum(u => u.vlVenda);
                        _projeto.vlDesconto = model.Produtos.Sum(u => u.vlDesconto);

                        foreach (var item in _projeto.Produtos)
                        {
                            item.vlVenda = model.Produtos.First(u => u.idProduto == item.idProduto).vlVenda;
                            item.vlProduto = model.Produtos.First(u => u.idProduto == item.idProduto).vlProduto;
                            item.vlDesconto = model.Produtos.First(u => u.idProduto == item.idProduto).vlDesconto;
                        }

                        _bll.Aprovar(_projeto);
                        _bll.SaveChanges();
                        if (margemGanho != null)
                        {
                            _bll.AlterarMargemGanhoMaterial(margemGanho.Value, model.idProjeto);
                        }
                        _bll.SaveChanges();


                        model = AprovarVM.GetProjeto(_projeto);

                        _projeto.vlProjeto = model.Produtos.Sum(u => u.vlProduto);
                        _projeto.vlVenda = model.Produtos.Sum(u => u.vlVenda);
                        _projeto.vlDesconto = model.Produtos.Sum(u => u.vlDesconto);

                        foreach (var item in _projeto.Produtos)
                        {
                            item.vlVenda = model.Produtos.First(u => u.idProduto == item.idProduto).vlVenda;
                            item.vlProduto = model.Produtos.First(u => u.idProduto == item.idProduto).vlProduto;
                            item.vlDesconto = model.Produtos.First(u => u.idProduto == item.idProduto).vlDesconto;
                        }
                        _bll.Aprovar(_projeto);
                        _bll.SaveChanges();
                        trans.Complete();

                        this.AddFlashMessage("Projeto atualizado com sucesso!", FlashMessage.SUCCESS);
                        return RedirectToAction("Index");
                    }
                }
            }
            catch (Exception ex)
            {
                RP.Util.Entity.ErroLog.Add(ex, Session.SessionID, _idUsuario);
                return RedirectToAction("Index", "Erro", new { area = string.Empty });
            }
        }