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);
        }
        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 Create(FolhaVM model)
        {

            if (ModelState.IsValid)
            {
                try
                {
                    LogBLL.Insert(new LogDado("Create", "FolhaPagamento", _idUsuario));
                    using (var db = new Context())
                    {
                        using (var trans = new RP.DataAccess.RPTransactionScope(db))
                        {
                            var _bll = new CartaoPontoBLL(db, _idUsuario);
                            var _movimentoBLL = new MovimentoProfissionalBLL(db, _idUsuario);
                            var _folhaBLL = new FolhaPagamentoBLL(db, _idUsuario);
                            foreach (var item in model.Pontos)
                            {
                                var cartao = new CartaoPonto
                                {
                                    dsObservacao = item.dsObservacao,
                                    entradaExtra = string.IsNullOrEmpty(item.entradaExtra) ? null : (TimeSpan?)TimeSpan.Parse(item.entradaExtra + ":00"),
                                    entradaManha = string.IsNullOrEmpty(item.entradaManha) ? null : (TimeSpan?)TimeSpan.Parse(item.entradaManha + ":00"),
                                    entraTarde = string.IsNullOrEmpty(item.entraTarde) ? null : (TimeSpan?)TimeSpan.Parse(item.entraTarde + ":00"),
                                    saidaExtra = string.IsNullOrEmpty(item.saidaExtra) ? null : (TimeSpan?)TimeSpan.Parse(item.saidaExtra + ":00"),
                                    saidaManha = string.IsNullOrEmpty(item.saidaManha) ? null : (TimeSpan?)TimeSpan.Parse(item.saidaManha + ":00"),
                                    saidaTarde = string.IsNullOrEmpty(item.saidaTarde) ? null : (TimeSpan?)TimeSpan.Parse(item.saidaTarde + ":00"),
                                    flSituacao = item.flSituacao,
                                    idFuncionario = model.Funcionario.idFuncionario ?? 0,
                                    dtPonto = new DateTime(model.nrAno, item.nrMes, item.nrDia),
                                };
                                _bll.Insert(cartao);
                            }
                            if (model.Comissoes != null)
                            {
                                foreach (var item in model.Comissoes)
                                {
                                    _movimentoBLL.AtualizaMovimento(item.idMovimento, MovimentoProfissional.SITUACAO_AGUARDANDO_PAGAMENTO);
                                }
                            }
                            var folha = new FolhaPagamento 
                            {
                                idFuncionario = model.Funcionario.idFuncionario ?? 0,
                                nrAno = model.nrAno,
                                nrMes = model.nrMes,
                                situacao = FolhaPagamento.AGUARDANDO_PAGAMENTO                                 
                            };
                            _folhaBLL.Insert(folha);

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

                            this.AddFlashMessage("Folha de pagamento gerada com sucesso!", 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);
        }