/// <summary>
        /// Grava um movimento de caixa
        /// </summary>
        /// <param name="movimento">movimentacao com dados inclusive a id da conta</param>
        /// <param name="notificacao">mensagem de erro ou sucesso</param>
        /// <returns></returns>
        public bool Lancar(MovimentoCaixa movimento, out Notificacao notificacao)
        {
            if (movimento.Valor <= 0 || !new UtilCtrl().Decimal(movimento.Valor.ToString(), out  notificacao))
            {
                notificacao = new Notificacao("O valor deve ser um decimal positivo, escolha entre crédito ou débito", 'e');
                return false;
            }

            if (!new ContaCaixaCtrl().Recuperar(movimento.ContaCaixa, out  notificacao))//recupera conta caixa
            {
                return false;
            }

            //atualiza o saldo que ficara salvo no banco de dados, se for crédito soma se não subtrai!
            movimento.ContaCaixa.Saldo = movimento.Credito
                                             ? movimento.ContaCaixa.Saldo + movimento.Valor
                                             : movimento.ContaCaixa.Saldo - movimento.Valor;

            if (!new MovimentoCaixaBD().Lancar(movimento))
            {
                notificacao = new Notificacao("Não foi possivel lançar o movimento. <br/>Problema com Banco de Dados, notifique o administrador", 'e');
                return false;
            }

            notificacao = new Notificacao("Lançamento efetuado com sucesso", 's');
            return true;
        }
        public bool Estornar(MovimentoCaixa movimento, out Notificacao notificacao)
        {
            if (string.IsNullOrEmpty(movimento.Estorno))
            {
                notificacao = new Notificacao("O Estorno não foi realizado, é necesário informar uma justificativa", 'e');
                return false;
            }

            if (movimento.Estorno.Length>100)
            {
                notificacao = new Notificacao("O Estorno não foi realizado, é necesário informar uma justificativa no maximo 100 caracteres, tente novamente!", 'e');
                return false;
            }

            if (!new ContaCaixaCtrl().Recuperar(movimento.ContaCaixa, out  notificacao))//recupera conta caixa seus dados e Saldo!!!
            {
                return false;//a notificacao vai por conta da propria validacao!
            }

            string estornoAux = movimento.Estorno;//guarda justificativa do estorn, pois a mesma sera sobrecarregada na validação!

            if (new MovimentoCaixaBD().Recuperar(movimento))//checa se existe movimento com id e a conta informada
            {
                if(movimento.Estorno !="")//checa se a mesma ja não havia sido estornada!
                {
                    notificacao = new Notificacao("O movimento informado já foi estornado!, notifique o administrador este erro!", 'a');
                    return false;
                }

                movimento.Estorno = estornoAux; //devolve a justificativa informada pelo usuário

                //inverte o tipo de movimento
                movimento.Credito = !movimento.Credito;//inverte o tipo de movimento Credito/Débito (se era crédito vira débito no estorno)

                //atualiza o saldo que será salvo no banco de dados, se for crédito soma se não subtrai!
                movimento.ContaCaixa.Saldo = movimento.Credito
                                                 ? movimento.ContaCaixa.Saldo + movimento.Valor
                                                 : movimento.ContaCaixa.Saldo - movimento.Valor;

                if (!new MovimentoCaixaBD().Estornar(movimento))//realiza o estorno!
                {
                    notificacao = new Notificacao("Não foi possivel estornar a movimentação<br/>Problema com Banco de Dados, notifique o administrador", 'e');
                    return false;
                }

                notificacao = new Notificacao("O movimento informado foi estornado com sucesso!", 's');
                return true;
            }

            notificacao = new Notificacao("O movimento informado é inválido, não foi encontrado", 'e');
            return false;
        }
Example #3
0
        //Opcoes de Lancamento
        protected void BtnOpcoes(object sender, CommandEventArgs e)
        {
            switch (e.CommandName)
            {
                //--Acoes Filtro Periodo
                case "filtrarMes":
                    {
                        #region Filtro Mes
                        DateTime dtI = Convert.ToDateTime(dtInicial.Value);
                        DateTime dtF = Convert.ToDateTime(dtFinal.Value);

                        switch (e.CommandArgument.ToString())
                        {
                            case "periodo":
                                {
                                    string aux;//salva copia da data anterior ao filtro selecionado!
                                    aux = dtInicial.Value;
                                    dtInicial.Value = ttbDtInicio.Text;
                                    ttbDtInicio.Text = aux;

                                    aux = dtFinal.Value;
                                    dtFinal.Value = ttbDtFim.Text;
                                    ttbDtFim.Text = aux;

                                    if (!ListarMovimentosCaixa())//ouve erro volta periodo que estava setado anteriormente
                                    {
                                        dtInicial.Value = ttbDtInicio.Text;
                                        dtFinal.Value = ttbDtFim.Text;
                                    }
                                    ttbDtInicio.Text = "";
                                    ttbDtFim.Text = "";
                                }
                                break;
                            case "esteMes":
                                {
                                    FiltroMesAtual();
                                }
                                break;
                            default:
                                {
                                    //incrementa ou decrementa um mes no filtro de data atual
                                    int mesAdd = e.CommandArgument.ToString() == "add" ? +1 : -1;

                                    dtInicial.Value = dtI.AddMonths(mesAdd).ToString();

                                    //se se o periodo cobrir o mes fechado pula para o proximo mes correte, senão só acrescenta um mes ao filtro corrente!
                                    if (dtI.Day == 1)
                                    {
                                        if (dtF.Day == DateTime.DaysInMonth(dtF.Year, dtF.Month))
                                        {
                                            dtF = dtF.AddMonths(mesAdd);//acrescenta um mes na data final atual!
                                            dtF = new DateTime(dtF.Year, dtF.Month, DateTime.DaysInMonth(dtF.Year, dtF.Month));//ultimo dia do mes setado
                                        }
                                    }
                                    else
                                    {
                                        dtF = dtF.AddMonths(mesAdd);//somente acrescenta um mes na data final atual!
                                    }

                                    dtFinal.Value = dtF.ToString();
                                }
                                break;
                        }

                        TextoPeriodoFiltro();
                        ListarMovimentosCaixa();
                        #endregion
                    }
                    break;
                //--acoes lançamento
                case "lancar":
                    {
                        #region Efetuar Lançamento
                        Notificacao notificacao;

                        decimal valor;
                        DateTime dtEmissao;
                        decimal.TryParse(ttbValor.Text, out valor);
                        DateTime.TryParse(ttbChData.Text, out dtEmissao);

                        var movimento = new MovimentoCaixa(rblTipoMov.SelectedValue == "c",
                                                           valor, new ContaCaixa(Convert.ToInt32(contaId.Value)));

                        if (new MovimentoCaixaCtrl().Lancar(movimento, out notificacao))
                        {
                            rblTipoMov.SelectedIndex = 0;
                            ttbValor.Text = "";//limpa
                            notificacoes.Add(notificacao);
                            ListarMovimentosCaixa();
                        }
                        else
                        {
                            notificacoes.Add(notificacao);
                            ListarNotificacoes();
                        }
                        #endregion
                    }
                    break;
                case "estornar":
                    {
                        Notificacao notificacao;
                        if (e.CommandArgument != "")//ou seja é a confirmação!
                        {
                            var movimento = new MovimentoCaixa(Convert.ToInt32(movimentoId.Value),
                                                               new ContaCaixa(Convert.ToInt32(contaId.Value)),
                                                               ttbJustificativa.Text);

                            if (new MovimentoCaixaCtrl().Estornar(movimento, out notificacao))
                            {
                                notificacoes.Add(notificacao);
                                ListarMovimentosCaixa();
                            }
                            else
                            {
                                notificacoes.Add(notificacao);
                                ListarNotificacoes();
                            }

                        }
                        else
                        {
                            ListarNotificacoes();//limpa notificaçoes
                        }
                        ttbJustificativa.Text = "";
                        movimentoId.Value = "0";
                    }
                    break;
                //-- mudar conta
                case "trocarConta":
                    {
                        ContaView.Visible = false;
                        ContaSelect.Visible = true;
                        ttbConta.Text = "";
                        contaId.Value = "0";
                        ListarNotificacoes();
                        ttbValor.Text = "";
                        FiltroMesAtual();
                    }
                    break;
                case "relatorio":
                    {
                        DateTime dti;
                        DateTime dtf;

                        DateTime.TryParse(dtInicial.Value, out dti);
                        DateTime.TryParse(dtFinal.Value, out dtf);
                        //informa a data inicial e final para filtrar as movimentações

                        var conta = new ContaCaixa(Convert.ToInt32(contaId.Value), dti, dtf);

                        Session["fluxocaixa"] = conta;
                        Response.Redirect("/View/financeiro/relatorios/fluxodecaixa.aspx");

                    }
                    break;
            }
        }
        /// <summary>
        /// Grava uma movimentação de caixa com Transação
        /// </summary>
        /// <param name="movimento">dados da movimentacao</param>
        /// <param name="autoIniciarT"></param>
        /// <param name="autoConfirmarT"> </param>
        /// <returns>verdadeiro se não houver erros</returns>
        public bool Lancar(MovimentoCaixa movimento, bool autoIniciarT=true, bool autoConfirmarT=true)
        {
            try
            {
                if(autoIniciarT)
                    _bd.IniciarTransacao();
                _bd.Cmd.Parameters.Clear();
                //Etapa 1 Lançar movimento
                _bd.Cmd.CommandText = @"INSERT INTO `movimentosCaixa` (`caixa_id`, `credito`, `data`,`valor`)
                VALUES (@caixaid, @credito, @data,@valor); SELECT LAST_INSERT_ID()";

                _bd.Cmd.Parameters.AddWithValue("@caixaid", movimento.ContaCaixa.Id);
                _bd.Cmd.Parameters.AddWithValue("@credito", movimento.Credito);//se falso == débito
                _bd.Cmd.Parameters.AddWithValue("@data", DateTime.Now);//pega data do sistema!
                _bd.Cmd.Parameters.AddWithValue("@valor", movimento.Valor);//valor do lançamento
                movimento.Id = Convert.ToInt32(_bd.ExecuteNonQuery());

                if (movimento.Id == 0)//se nao afetar nenhuma linha
                {
                    _bd.CancelarTransacao();
                    return false;
                }

                _bd.Cmd.Parameters.Clear();

                //Etapa 2 Atualizar saldo Caixa
                _bd.Cmd.CommandText = @"update contasCaixa set saldo = @saldo where id = @caixaid";
                _bd.Cmd.Parameters.AddWithValue("@caixaid", movimento.ContaCaixa.Id);
                _bd.Cmd.Parameters.AddWithValue("@saldo", movimento.ContaCaixa.Saldo);

                if (_bd.ExecuteNonQuery() <= 0)//se nao afetar nenhuma linha
                {
                    _bd.CancelarTransacao();
                    return false;
                }

            }
            catch (Exception)
            {
                _bd.CancelarTransacao();
                return false;
            }
            if(autoConfirmarT)
            _bd.ConfirmarTransacao();
            return true;
        }
        /// <summary>
        /// Grava dados de estorno no BD
        /// </summary>
        /// <param name="movimento">movimento a ser estornado</param>
        /// <returns></returns>
        public bool Estornar(MovimentoCaixa movimento)
        {
            _bd = new Persistencia();
            try
            {
                _bd.IniciarTransacao();

                #region Etapa 1 Setar justifica do estorno no movimento selecionado
                _bd.Cmd.CommandText = @"update movimentosCaixa set estorno = @estorno where id = @id and caixa_id = @caixa_id";
                _bd.Cmd.Parameters.AddWithValue("@id", movimento.Id);
                _bd.Cmd.Parameters.AddWithValue("@caixa_id", movimento.ContaCaixa.Id);
                _bd.Cmd.Parameters.AddWithValue("@estorno", movimento.Estorno);

                if (_bd.ExecuteNonQuery() <= 0)//se nao afetar linhas
                {
                    _bd.CancelarTransacao();
                    return false;
                }
                #endregion

                _bd.Cmd.Parameters.Clear();

                #region Etapa 2 lançar um movimento com estorno
                _bd.Cmd.CommandText = @"INSERT INTO `movimentosCaixa` (`caixa_id`, `credito`, `data`,`valor`, `quitacao_id`, `estorno`)
                VALUES (@caixaid, @credito, @data,@valor, @quitacao_id, @estorno)";

                _bd.Cmd.Parameters.AddWithValue("@caixaid", movimento.ContaCaixa.Id);
                _bd.Cmd.Parameters.AddWithValue("@credito", movimento.Credito);//ja deve vir da controladora com a justificativa correta
                _bd.Cmd.Parameters.AddWithValue("@data", DateTime.Now);//pega data do sistema!
                _bd.Cmd.Parameters.AddWithValue("@valor", movimento.Valor);//valor do lançamento
                _bd.Cmd.Parameters.AddWithValue("@quitacao_id", movimento.Quitacao);//caso a movimentacao seja provinda de uma quitacao
                _bd.Cmd.Parameters.AddWithValue("@estorno", "Estorno do movimento Nº" + movimento.Id);//informa estorno de qual operação

                if (_bd.ExecuteNonQuery() <= 0)//se nao afetar nenhuma linha cancela transação
                {
                    _bd.CancelarTransacao();
                    return false;
                }
                #endregion

                _bd.Cmd.Parameters.Clear();

                #region Etapa 3 Atualizar saldo Caixa
                _bd.Cmd.CommandText = @"update contasCaixa set saldo = @saldo where id = @caixaid";
                _bd.Cmd.Parameters.AddWithValue("@caixaid", movimento.ContaCaixa.Id);
                _bd.Cmd.Parameters.AddWithValue("@saldo", movimento.ContaCaixa.Saldo);

                if (_bd.ExecuteNonQuery() <= 0)//se nao afetar nenhuma linha
                {
                    _bd.CancelarTransacao();
                    return false;
                }
                #endregion
            }
            catch (Exception)
            {
                _bd.CancelarTransacao();
                return false;
            }
            _bd.ConfirmarTransacao();
            return true;
        }
        /// <summary>
        /// Recupera do banco de dados as movimentacoes de uma conta de caixa em um determinado periodo
        /// </summary>
        /// <param name="contaCaixa">Conta de Caixa</param>
        /// <returns></returns>
        public bool RecuperarMovimentos(ContaCaixa contaCaixa)
        {
            _bd = new Persistencia();
            contaCaixa.Movimentacoes = new List<MovimentoCaixa>();//limpa lista
            try
            {
                _bd.Cmd.CommandText = @"select mc.id, mc.credito, mc.data, mc.valor, mc.quitacao_id, mc.estorno,
                ((select coalesce(sum(cr.valor),0) from movimentosCaixa cr where (cr.data<=mc.data AND cr.credito = 1 and cr.caixa_id = mc.caixa_id))
                - (select coalesce(sum(de.valor),0) from movimentosCaixa de where (de.data<=mc.data AND de.credito = 0 and de.caixa_id = mc.caixa_id))) as saldo
                from movimentosCaixa mc where mc.data between @dataI AND @dataF and mc.caixa_id = @caixa_id
                ORDER BY mc.data asc ";

                _bd.Cmd.Parameters.AddWithValue("@caixa_id", contaCaixa.Id);
                _bd.Cmd.Parameters.AddWithValue("@dataI", contaCaixa.DataInicial);
                _bd.Cmd.Parameters.AddWithValue("@dataF", contaCaixa.DataFinal);

                DataTable listaMovimentos = _bd.ExecuteReader();

                foreach (DataRow movimento in listaMovimentos.Rows)
                {
                    var mov = new MovimentoCaixa(
                        Convert.ToInt32(movimento["id"].ToString()),
                        Convert.ToBoolean(movimento["credito"].ToString()),
                        Convert.ToDateTime(movimento["data"].ToString()),
                        Convert.ToDecimal(movimento["valor"].ToString()),
                        movimento["estorno"].ToString(),                    //justificativa do estorno!
                        new Quitacao(string.IsNullOrEmpty(movimento["quitacao_id"].ToString())? 0 : Convert.ToInt32(movimento["quitacao_id"])),//se nao tiver vinculo informa zero "0"
                        Convert.ToDecimal(movimento["saldo"].ToString())
                        );
                    contaCaixa.Movimentacoes.Add(mov);
                }

            }
            catch (Exception)
            {
                contaCaixa.Movimentacoes = new List<MovimentoCaixa>();//limpa lista
                return false;
            }
            return true;
        }
        /// <summary>
        /// recupera o tipo, valor e justificativa de estorno se ouver
        /// </summary>
        /// <param name="movimento"></param>
        /// <returns></returns>
        public bool Recuperar(MovimentoCaixa movimento)
        {
            _bd = new Persistencia();
            try
            {
                _bd.Cmd.CommandText = @"Select credito, valor, estorno from movimentosCaixa
                                        where id = @id and caixa_id = @caixa_id";
                _bd.Cmd.Parameters.AddWithValue("@id", movimento.Id);
                _bd.Cmd.Parameters.AddWithValue("@caixa_id", movimento.ContaCaixa.Id);

                DataTable movBd = _bd.ExecuteReader();

                movimento.Credito = Convert.ToBoolean(movBd.Rows[0]["credito"]);//1 == credito 0 ==débito
                movimento.Valor = Convert.ToDecimal(movBd.Rows[0]["valor"].ToString());
                movimento.Estorno = movBd.Rows[0]["estorno"].ToString();

            }
            catch (Exception)
            {
                return false;
            }
            return true;
        }