public ActionResult Details(int id)
        {
            try
            {
                LogBLL.Insert(new LogDado("Details", "Compra", _idUsuario));
                using (var db = new Context())
                {
                    var _bll = new BLL.CompraBLL(db, _idUsuario);

                    var _compra = _bll.FindSingle(e => e.idCompra == id, u => u.Fornecedor, u => u.Projeto.Cliente, u => u.ContasPagar);

                    return View(CompraVM.GetCompra(_compra));
                }
            }
            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", "Compra", _idUsuario));
                using (var db = new Context())
                {
                    var _bll = new BLL.CompraBLL(db, _idUsuario);

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

                    return View("Index", result);
                }
            }
            catch (Exception ex)
            {
                RP.Util.Entity.ErroLog.Add(ex, Session.SessionID, _idUsuario);
                return RedirectToAction("Index", "Erro", new { area = string.Empty });
            }
        }
        public JsonResult JsCreate(Compra model)
        {
            try
            {
                LogBLL.Insert(new LogDado("JsCreate", "Compra", _idUsuario));
                using (var db = new Context())
                {
                    using (var trans = new RP.DataAccess.RPTransactionScope(db))
                    {
                        var _bll = new BLL.CompraBLL(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.CompraBLL(db, _idUsuario);

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

                    var list = result.Select(s => new
                    {
                        s.idCompra,
                        //s.nome,
                        //estado = s.Estado.nome,
                        //pais = s.Estado.Pais.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 Cancelar(int id)
        {
            try
            {
                LogBLL.Insert(new LogDado("Cancelar", "Compra", _idUsuario));
                using (var db = new Context())
                {
                    using (var trans = new RP.DataAccess.RPTransactionScope(db))
                    {
                        var _bll = new BLL.CompraBLL(db, _idUsuario);

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

                        trans.Complete();

                        this.AddFlashMessage(RP.Util.Resource.Message.DELETE_SUCCESS, FlashMessage.SUCCESS);
                        return RedirectToAction("Index");
                    }
                }
            }
            catch (Exception ex)
            {
                RP.Util.Entity.ErroLog.Add(ex, Session.SessionID, _idUsuario);
                this.AddFlashMessage(RP.Util.Exception.Message.Get(ex), FlashMessage.ERROR); RP.Util.Entity.ErroLog.Add(ex, Session.SessionID, _idUsuario);
                return RedirectToAction("Delete", id);
            }
        }
        public ActionResult Vulso(CompraVM model)
        {
            if (string.IsNullOrEmpty(model.Fornecedor.nome))
            {
                ModelState.AddModelError("Fornecedor.nome", "Informe o fornecedor");
            }
            if (model.total <= 0)
            {
                ModelState.AddModelError("total", "Informe o total");
            }
            if (ModelState.IsValid)
            {
                try
                {
                    LogBLL.Insert(new LogDado("Vulso", "Compra", _idUsuario));
                    using (var db = new Context())
                    {
                        using (var trans = new RP.DataAccess.RPTransactionScope(db))
                        {
                            var _compra = model.GetCompra();

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

                            _bll.Insert(_compra);
                            var _contaBLL = new ContaPagarBLL(db, _idUsuario);
                            var _caixaBLL = new CaixaBLL(db, _idUsuario);
                            if (model.Parcelas != null && model.Parcelas.Any())
                            {
                                int nrParcelas = model.Parcelas.Count;
                                foreach (var item in model.Parcelas)
                                {
                                    string situacao = ContaPagar.SITUACAO_AGUARDANDO_PAGAMENTO;
                                    decimal? vlPago = null;
                                    DateTime? dtPagamento = null;
                                    if (item.dtVencimento <= DateTime.Now.Date)
                                    {
                                        vlPago = item.vlParcela;
                                        situacao = ContaPagar.SITUACAO_PAGO;
                                        dtPagamento = item.dtVencimento;
                                    }

                                    // Lança conta a pagar referente a parcela
                                    var _conta = new ContaPagar
                                    {
                                        idFornecedor = _compra.idFornecedor,
                                        parcela = item.nrParcela,
                                        descricao = "Conta a pagar referente a " + item.nrParcela + "º parcela.  " + item.dsObservacao,
                                        vencimento = item.dtVencimento,
                                        pagamento = dtPagamento,
                                        valorConta = item.vlParcela,
                                        valorPago = vlPago,
                                        situacao = situacao,
                                        flFormaPagamento = item.flFormaPagamento,
                                        Compra = _compra
                                    };
                                    _contaBLL.Insert(_conta);

                                    //se a data de vencimento for a atual lança a entrada no caixa
                                    if (item.dtVencimento <= DateTime.Now.Date)
                                    {
                                        _caixaBLL.Insert(new Caixa
                                        {
                                            ContaPagar = _conta,
                                            situacao = Caixa.CORENTE,
                                            valor = (item.vlParcela * -1),
                                            descricao = _compra.descricao + " [" + model.Fornecedor.nome + "] " + item.dsObservacao,
                                            dtLancamento = item.dtVencimento
                                        });
                                    }
                                }
                            }
                            else
                            {
                                var _conta = new ContaPagar
                                {
                                    idFornecedor = _compra.idFornecedor,
                                    parcela = 1,
                                    descricao = "Conta a pagar referente a " + model.descricao + " [Fornecedor:" + model.Fornecedor.nome + "] ",
                                    vencimento = DateTime.Now,
                                    pagamento = DateTime.Now,
                                    valorConta = model.total,
                                    valorPago = model.total,
                                    situacao = ContaPagar.SITUACAO_PAGO,
                                    flFormaPagamento = string.Empty,
                                    Compra = _compra
                                };
                                _contaBLL.Insert(_conta);
                                _caixaBLL.Insert(new Caixa
                                {
                                    ContaPagar = _conta,
                                    situacao = Caixa.CORENTE,
                                    valor = (model.total * -1),
                                    descricao = model.descricao + " [" + model.Fornecedor.nome + "] " + model.descricao,
                                    dtLancamento = DateTime.Now
                                });
                            }
                            _bll.SaveChanges();

                            trans.Complete();

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