/// <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; }
//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; }