public ActionResult Receber(ContaReceberVM model)
        {
            if (model.valorPago == null || model.valorPago <= 0)
            {
                ModelState.AddModelError("valorPago", "Informe o valor do pagamento");
            }
            if (model.pagamento == null)
            {
                ModelState.AddModelError("pagamento", "Informe o data do pagamento");
            }
            if (ModelState.IsValid)
            {
                try
                {
                    LogBLL.Insert(new LogDado("Receber", "ContaReceber", _idUsuario));
                    using (var db = new Context())
                    {
                        using (var trans = new RP.DataAccess.RPTransactionScope(db))
                        {
                            var _contaReceber = model.GetContaReceber();

                            var _bll = new BLL.ContaReceberBLL(db, _idUsuario);
                            _bll.Receber(_contaReceber);
                            if (model.flDiferenca == "Sim")
                            {
                                // Lança conta a receber referente a diferença
                                var _diferenca = new ContaReceber
                                {
                                    idProjeto = model.Projeto != null ? model.Projeto.idProjeto : null,
                                    idCliente = _contaReceber.idCliente,
                                    parcela = _contaReceber.parcela,
                                    descricao = "Conta gerada da diferença. Valor original: " + model.valorConta + ". Valor pago: " + model.valorPago,
                                    vencimento = _contaReceber.vencimento,
                                    pagamento = _contaReceber.pagamento,
                                    valorConta = model.vlDiferenca ?? 0,
                                    situacao = ContaReceber.SITUACAO_AGUARDANDO_PAGAMENTO,
                                    flFormaPagamento = _contaReceber.flFormaPagamento,
                                    idCompra = _contaReceber.idCompra,
                                    idOrigem = _contaReceber.idOrigem == null ? _contaReceber.idContaReceber :_contaReceber.idOrigem
                                };
                                _bll.Insert(_diferenca);
                            }
                            var _caixaBLL = new BLL.CaixaBLL(db, _idUsuario);

                            _caixaBLL.Insert(new Caixa
                            {
                                ContaReceber = _contaReceber,
                                situacao = Caixa.CORENTE,
                                valor = (_contaReceber.valorPago.Value),
                                descricao = _contaReceber.descricao + " [" + model.Cliente.nome + "] " + (model.Projeto != null ? model.Projeto.descricao : ""),
                                dtLancamento = _contaReceber.pagamento.Value
                            });
                            _bll.SaveChanges();

                            trans.Complete();

                            this.AddFlashMessage("Conta a receber adicionada 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 Vale(ValeVM model)
        {
            if (string.IsNullOrEmpty(model.Funcionario.nome))
            {
                ModelState.AddModelError("Funcionario.nome", "Informe o funcionario");
            }
            if (ModelState.IsValid)
            {
                try
                {
                    LogBLL.Insert(new LogDado("Vale(ValeVM model)", "Caixa", _idUsuario));
                    using (var db = new Context())
                    {
                        using (var trans = new RP.DataAccess.RPTransactionScope(db))
                        {

                            var _caixaBLL = new BLL.CaixaBLL(db, _idUsuario);
                            var _movimento = model.GetMovimento();

                            _movimento.idUsuario = this._idUsuario;

                            var _conta = new ContaPagar
                            {
                                descricao = "Vale entregue para " + model.Funcionario.nome + " " + model.descricao,
                                valorConta = model.valor,
                                valorPago = model.valor,
                                vencimento = DateTime.Now,
                                pagamento = DateTime.Now,
                                parcela = 1,
                                flFormaPagamento = "Dinheiro",
                                situacao = ContaPagar.SITUACAO_PAGO,
                                idUsuario = this._idUsuario
                            };

                            var _caixa = new Caixa
                            {
                                MovimentoProfissional = _movimento,
                                ContaPagar = _conta,
                                situacao = Caixa.CORENTE,
                                valor = (model.valor * -1),
                                descricao = "Vale entregue para " + model.Funcionario.nome + " " + model.descricao,
                                dtLancamento = DateTime.Now

                            };

                            _caixaBLL.Insert(_caixa);
                            _caixaBLL.SaveChanges();

                            trans.Complete();

                            this.AddFlashMessage("Vale adicionado para " + model.Funcionario.nome + " com sucesso!", FlashMessage.SUCCESS);
                            return RedirectToAction("Index", "ContaPagar");
                        }
                    }
                }
                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 Pagar(PagarVM model)
        {
            if (ModelState.IsValid)
            {
                try
                {
                    LogBLL.Insert(new LogDado("Pagar", "FolhaPagamento", _idUsuario));
                    using (var db = new Context())
                    {
                        using (var trans = new RP.DataAccess.RPTransactionScope(db))
                        {

                            var _bll = new BLL.FolhaPagamentoBLL(db, _idUsuario);
                            var _folha = _bll.FindSingle(u => u.idFolhaPagamento == model.idFolha);
                            _folha.situacao = FolhaPagamento.PAGO;
                            _folha.total = model.totalReceber ?? 0;
                            if (model.Movimentos != null)
                            {
                                _folha.comissao = model.Movimentos.Sum(u => u.comissao) ?? 0;
                                _folha.vale = model.Movimentos.Sum(u => u.vale) ?? 0;
                            }
                            _folha.salario = model.salario ?? 0;
                            _folha.bonificacao = model.bonificacao ?? 0;
                            _folha.outrosDescontos = model.outrosDescontos ?? 0;
                            _folha.dsBonificacao = string.IsNullOrEmpty(model.dsBonificacao) ? "Bonificação referente ao mês de " + model.dsMes : model.dsBonificacao;
                            _folha.dsOutrosDescontos = string.IsNullOrEmpty(model.dsOutrosDescontos) ? "Descontos adicionais referente ao mês de " + model.dsMes : model.dsOutrosDescontos;
                            _folha.inss = model.inss ?? 0;
                            _folha.FGTS = model.FGTS ?? 0;
                            _folha.horaExtra = model.horaExtra ?? 0;

                            _bll.Update(_folha);

                            //realizar pagamento e retirada do caixa


                            var _caixaBLL = new BLL.CaixaBLL(db, _idUsuario);

                            var _conta = new ContaPagar
                            {
                                descricao = "Pagamento realizado para " + model.Funcionario.nome + " referente ao mes " + model.dsMes + " de " + model.nrAno,
                                valorConta = _folha.total,
                                valorPago = _folha.total,
                                vencimento = DateTime.Now,
                                pagamento = DateTime.Now,
                                parcela = 1,
                                flFormaPagamento = "Dinheiro",
                                situacao = ContaPagar.SITUACAO_PAGO,
                                idUsuario = this._idUsuario,
                                idFolhaPagamento = model.idFolha
                            };

                            var _caixa = new Caixa
                            {
                                ContaPagar = _conta,
                                situacao = Caixa.CORENTE,
                                valor = (_folha.total * -1),
                                descricao = "Pagamento realizado para " + model.Funcionario.nome + " referente ao mes " + model.dsMes + " de " + model.nrAno,
                                dtLancamento = DateTime.Now

                            };
                            _caixaBLL.Insert(_caixa);

                            // atualiza os movimentos
                            if (model.Movimentos != null)
                            {
                                var _movimentoBLL = new MovimentoProfissionalBLL(db, _idUsuario);
                                foreach (var item in model.Movimentos)
                                {
                                    _movimentoBLL.AtualizaMovimento(item.idMovimento, MovimentoProfissional.SITUACAO_PAGO, _folha);
                                }
                            }

                            _bll.SaveChanges();

                            trans.Complete();

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