private decimal GetValorTotalAtualizadoEmReais(Cobranca cobranca, CobrancaParcelamento parcelamento, Parametrizacao parametrizacao) { var valorPagoAnteriores = new Decimal(); var parcelamentos = (new CobrancaParcelamentoDa()).Obter(cobranca.Id); if (parcelamentos != null) { var parcelamentosAnteriores = parcelamentos.Where(x => x.Id != parcelamento.Id); foreach (var parcelamentoAnterior in parcelamentosAnteriores) { valorPagoAnteriores += parcelamentoAnterior.DUAS.Sum(x => x.ValorPago); } } var prazoDesconto = parametrizacao.PrazoDescontoUnidade * GetPrazoDesconto(parametrizacao.PrazoDescontoDecorrencia); if (parcelamento.Data1Vencimento.Data.Value < cobranca.DataIUF.Data.Value.AddDays(prazoDesconto + 1).Date) { return(parcelamento.ValorMulta - valorPagoAnteriores); } var multaVRTE = parcelamento.ValorMulta * (Convert.ToDecimal(parametrizacao.MultaPercentual) / 100); var jurosVRTE = new Decimal(); var diasJuros = Convert.ToDecimal(parcelamento.Data1Vencimento.Data.Value.Date.Subtract(cobranca.DataIUF.Data.Value.Date).TotalDays); if (diasJuros > 0) { jurosVRTE = (diasJuros / 30) * (Convert.ToDecimal(parametrizacao.JurosPercentual) / 100); } return(parcelamento.ValorMulta + multaVRTE + (parcelamento.ValorMulta * jurosVRTE) - valorPagoAnteriores); }
public bool Salvar(CobrancaParcelamento parcelamento, BancoDeDados banco = null) { try { if (_validarParcelamento.Salvar(parcelamento)) { GerenciadorTransacao.ObterIDAtual(); using (BancoDeDados bancoDeDados = BancoDeDados.ObterInstancia(banco)) { bancoDeDados.IniciarTransacao(); _daParcelamento.Salvar(parcelamento, bancoDeDados); foreach (var dua in parcelamento.DUAS) { dua.ParcelamentoId = parcelamento.Id; this.Salvar(dua, bancoDeDados); } bancoDeDados.Commit(); } } } catch (Exception e) { Validacao.AddErro(e); } return(Validacao.EhValido); }
public List <CobrancaDUA> GerarParcelas(Cobranca cobranca, CobrancaParcelamento parcelamento) { var list = new List <CobrancaDUA>(); if (!_validar.Calcular(cobranca, parcelamento)) { return(list); } var parametrizacao = _busConfiguracao.ObterParametrizacao(cobranca.CodigoReceitaId, cobranca.DataEmissaoIUF.Data.Value); var parcelaAnterior = new CobrancaDUA(); if (parametrizacao != null) { for (int i = 1; i <= parcelamento.QuantidadeParcelas; i++) { var parcela = new CobrancaDUA() { DataEmissao = parcelamento.DataEmissao, Parcela = string.Concat(i, '/', parcelamento.QuantidadeParcelas), ParcelamentoId = parcelamento.Id }; if (i == 1) { parcela.DataVencimento = new DateTecno() { Data = parcelamento.Data1Vencimento.Data } } ; else if (parcelaAnterior.DataVencimento.IsValido) { var dataVencimento = parcelaAnterior.DataVencimento.Data.Value.AddMonths(1); if (dataVencimento.DayOfWeek == DayOfWeek.Saturday) { dataVencimento.AddDays(2); } else if (dataVencimento.DayOfWeek == DayOfWeek.Monday) { dataVencimento.AddDays(1); } parcela.DataVencimento = new DateTecno() { Data = dataVencimento }; } parcela.Situacao = "Em Aberto"; parcelaAnterior = parcela; list.Add(parcela); } } return(list); }
public List <CobrancaParcelamento> Obter(int cobrancaId, BancoDeDados banco = null) { var lista = new List <CobrancaParcelamento>(); var cobrancaDUADa = new CobrancaDUADa(); using (BancoDeDados bancoDeDados = BancoDeDados.ObterInstancia(banco)) { Comando comando = bancoDeDados.CriarComando(@"select p.id, p.cobranca, p.valor_multa, p.valor_multa_atualizado, p.qtdparcelas, p.vencimento_data, p.dataemissao, p.tid from {0}tab_fisc_cob_parcelamento p where p.cobranca = :cobranca order by p.id" , EsquemaBanco); comando.AdicionarParametroEntrada("cobranca", cobrancaId, DbType.Int32); using (IDataReader reader = bancoDeDados.ExecutarReader(comando)) { while (reader.Read()) { var cobrancaParcelamento = new CobrancaParcelamento { Id = reader.GetValue <int>("id"), CobrancaId = reader.GetValue <int>("cobranca"), ValorMulta = reader.GetValue <decimal>("valor_multa"), ValorMultaAtualizado = reader.GetValue <decimal>("valor_multa_atualizado"), QuantidadeParcelas = reader.GetValue <int>("qtdparcelas"), }; cobrancaParcelamento.Data1Vencimento.Data = reader.GetValue <DateTime>("vencimento_data"); cobrancaParcelamento.DataEmissao.Data = reader.GetValue <DateTime>("dataemissao"); if (cobrancaParcelamento.DataEmissao.Data.HasValue && cobrancaParcelamento.DataEmissao.Data.Value.Year == 1) { cobrancaParcelamento.DataEmissao = new DateTecno(); } if (cobrancaParcelamento.DataEmissao.Data.HasValue && cobrancaParcelamento.DataEmissao.Data.Value.Year == 1) { cobrancaParcelamento.DataEmissao = new DateTecno(); } cobrancaParcelamento.DUAS = cobrancaDUADa.Obter(cobrancaParcelamento.Id); lista.Add(cobrancaParcelamento); } reader.Close(); } } return(lista); }
public int GetMaximoParcelas(Cobranca cobranca, CobrancaParcelamento parcelamento) { if (cobranca == null || !Convert.ToBoolean(cobranca.DataIUF?.IsValido) || !Convert.ToBoolean(cobranca.DataEmissaoIUF?.IsValido)) { return(0); } var parametrizacao = _busConfiguracao.ObterParametrizacao(cobranca.CodigoReceitaId, cobranca.DataEmissaoIUF.Data.Value); if (parametrizacao == null) { return(0); } var vrte = _busConfiguracao.ObterVrte(cobranca.DataIUF.Data.Value.Year); if ((vrte?.Id ?? 0) == 0) { return(0); } if (parcelamento.ValorMultaAtualizado == 0 && Convert.ToBoolean(parcelamento.Data1Vencimento?.IsValido)) { parcelamento.ValorMultaAtualizado = this.GetValorTotalAtualizadoEmReais(cobranca, parcelamento, parametrizacao); } var valorAtualizadoVRTE = parcelamento.ValorMultaAtualizado / vrte.VrteEmReais; var parcela = 0; if (cobranca.AutuadoPessoa.IsFisica) { parcela = Decimal.ToInt32(valorAtualizadoVRTE / parametrizacao.ValorMinimoPF); } else { parcela = Decimal.ToInt32(valorAtualizadoVRTE / parametrizacao.ValorMinimoPJ); } var detalhe = parametrizacao.ParametrizacaoDetalhes.FindLast(x => x.ValorInicial < parcelamento.ValorMultaAtualizado && (x.ValorFinal == 0 || x.ValorFinal >= parcelamento.ValorMultaAtualizado)); if ((detalhe?.Id ?? 0) == 0) { return(0); } if (parcela > detalhe.MaximoParcelas) { return(detalhe.MaximoParcelas); } return(parcela); }
public bool NovoParcelamento(Cobranca cobranca) { try { if (_validar.Salvar(cobranca)) { foreach (var parcela in cobranca.UltimoParcelamento.DUAS) { if (!parcela.DataPagamento.IsValido && parcela.ValorPago == 0) { parcela.DataCancelamento = new DateTecno() { Data = DateTime.Now } } ; } this.Salvar(cobranca.UltimoParcelamento); var parcelamento = new CobrancaParcelamento() { CobrancaId = cobranca.Id, Data1Vencimento = new DateTecno() { Data = DateTime.Now.AddDays(15) }, DataEmissao = new DateTecno() { Data = DateTime.Now }, ValorMulta = cobranca.UltimoParcelamento.ValorMulta, DUAS = new List <CobrancaDUA>() }; var parametrizacao = _busConfiguracao.ObterParametrizacao(cobranca.CodigoReceitaId, cobranca.DataEmissaoIUF.Data.Value); parcelamento.ValorMultaAtualizado = Math.Round(this.GetValorTotalAtualizadoEmReais(cobranca, parcelamento, parametrizacao)); if (cobranca.AutuadoPessoa == null) { cobranca.AutuadoPessoa = cobranca.AutuadoPessoaId > 0 ? new PessoaBus().Obter(cobranca.AutuadoPessoaId) : new Pessoa(); } parcelamento.QuantidadeParcelas = this.GetMaximoParcelas(cobranca, parcelamento); this.Salvar(parcelamento); } } catch (Exception e) { Validacao.AddErro(e); } return(Validacao.EhValido); }
public CobrancaParcelamento Criar(CobrancaParcelamento cobrancaParcelamento, BancoDeDados banco = null) { using (BancoDeDados bancoDeDados = BancoDeDados.ObterInstancia(banco)) { bancoDeDados.IniciarTransacao(); Comando comando = bancoDeDados.CriarComando(@" insert into {0}tab_fisc_cob_parcelamento (id, cobranca, valor_multa, valor_multa_atualizado, qtdparcelas, vencimento_data, dataemissao, tid) values ({0}seq_fisc_cob_parc.nextval, :cobranca, :valor_multa, :valor_multa_atualizado, :qtdparcelas, :vencimento_data, :dataemissao, :tid) returning id into :id", EsquemaBanco); comando.AdicionarParametroEntrada("cobranca", cobrancaParcelamento.CobrancaId, DbType.Int32); comando.AdicionarParametroEntrada("valor_multa", cobrancaParcelamento.ValorMulta, DbType.Decimal); comando.AdicionarParametroEntrada("valor_multa_atualizado", cobrancaParcelamento.ValorMultaAtualizado, DbType.Decimal); comando.AdicionarParametroEntrada("qtdparcelas", cobrancaParcelamento.QuantidadeParcelas, DbType.Int32); comando.AdicionarParametroEntrada("vencimento_data", cobrancaParcelamento.Data1Vencimento.Data, DbType.DateTime); comando.AdicionarParametroEntrada("dataemissao", cobrancaParcelamento.DataEmissao.Data, DbType.DateTime); comando.AdicionarParametroEntrada("tid", DbType.String, 36, GerenciadorTransacao.ObterIDAtual()); comando.AdicionarParametroSaida("id", DbType.Int32); bancoDeDados.ExecutarNonQuery(comando); cobrancaParcelamento.Id = Convert.ToInt32(comando.ObterValorParametro("id")); Historico.Gerar(cobrancaParcelamento.CobrancaId, eHistoricoArtefato.cobranca, eHistoricoAcao.atualizar, bancoDeDados); //Consulta.Gerar(cobrancaParcelamento.Id, eHistoricoArtefato.cobranca, bancoDeDados); bancoDeDados.Commit(); } return(cobrancaParcelamento); }
private Cobranca GetCobranca(int codigoReceita) { var cobranca = _bus.Obter(1); if (cobranca == null) { cobranca = new Cobranca() { Id = 1, DataEmissaoIUF = new DateTecno() { Data = DateTime.Now.AddDays(-60) }, DataIUF = new DateTecno() { Data = DateTime.Now.AddDays(-60) }, CodigoReceitaId = codigoReceita, AutuadoPessoa = _busPessoa.Obter(2525) }; cobranca.AutuadoPessoaId = cobranca.AutuadoPessoa.Id; var parcelamento = new CobrancaParcelamento() { Id = 1, ValorMulta = 1959.48M, DataEmissao = new DateTecno() { Data = DateTime.Now }, Data1Vencimento = new DateTecno() { Data = DateTime.Now.AddDays(30) }, CobrancaId = 1 }; cobranca.Parcelamentos = new List <CobrancaParcelamento>() { parcelamento }; } return(cobranca); }
public CobrancaParcelamento Salvar(CobrancaParcelamento cobrancaParcelamento, BancoDeDados banco = null) { if (cobrancaParcelamento == null) { throw new Exception("Cobranca é nulo."); } if (cobrancaParcelamento.Id <= 0) { cobrancaParcelamento = Criar(cobrancaParcelamento, banco); } else { cobrancaParcelamento = Editar(cobrancaParcelamento, banco); } return(cobrancaParcelamento); }
public bool Salvar(CobrancaParcelamento parcelamento) { if (parcelamento.QuantidadeParcelas == 0) { Validacao.Add(Mensagem.CobrancaMsg.QuantidadeParcelasObrigatorio); } if (!parcelamento.Data1Vencimento.IsValido) { Validacao.Add(Mensagem.CobrancaMsg.DataVencimentoObrigatoria); } if (!parcelamento.DataEmissao.IsValido) { Validacao.Add(Mensagem.CobrancaMsg.DataEmissaoObrigatoria); } return(Validacao.EhValido); }
public CobrancaParcelamento Editar(CobrancaParcelamento cobrancaParcelamento, BancoDeDados banco = null) { using (BancoDeDados bancoDeDados = BancoDeDados.ObterInstancia(banco)) { bancoDeDados.IniciarTransacao(); Comando comando = bancoDeDados.CriarComando(@" update {0}tab_fisc_cob_parcelamento t set t.cobranca = :cobranca, t.valor_multa = :valor_multa, t.valor_multa_atualizado = :valor_multa_atualizado, t.qtdparcelas = :qtdparcelas, t.vencimento_data = :vencimento_data, t.dataemissao = :dataemissao, t.tid = :tid where t.id = :id", EsquemaBanco); comando.AdicionarParametroEntrada("id", cobrancaParcelamento.Id, DbType.Int32); comando.AdicionarParametroEntrada("cobranca", cobrancaParcelamento.CobrancaId, DbType.Int32); comando.AdicionarParametroEntrada("valor_multa", cobrancaParcelamento.ValorMulta, DbType.Decimal); comando.AdicionarParametroEntrada("valor_multa_atualizado", cobrancaParcelamento.ValorMultaAtualizado, DbType.Decimal); comando.AdicionarParametroEntrada("qtdparcelas", cobrancaParcelamento.QuantidadeParcelas, DbType.Int32); comando.AdicionarParametroEntrada("vencimento_data", cobrancaParcelamento.Data1Vencimento.Data, DbType.DateTime); comando.AdicionarParametroEntrada("dataemissao", cobrancaParcelamento.DataEmissao.Data, DbType.DateTime); comando.AdicionarParametroEntrada("tid", DbType.String, 36, GerenciadorTransacao.ObterIDAtual()); bancoDeDados.ExecutarNonQuery(comando); Historico.Gerar(cobrancaParcelamento.CobrancaId, eHistoricoArtefato.cobranca, eHistoricoAcao.atualizar, bancoDeDados); //Consulta.Gerar(cobrancaParcelamento.Id, eHistoricoArtefato.cobranca, bancoDeDados); bancoDeDados.Commit(); } return(cobrancaParcelamento); }
public bool Calcular(Cobranca cobranca, CobrancaParcelamento parcelamento) { if (cobranca.CodigoReceitaId == 0) { return(false); } if (!cobranca.DataEmissaoIUF.IsValido) { Validacao.Add(Mensagem.CobrancaMsg.DataEmissaoIUFObrigatorio); } if (!cobranca.DataIUF.IsValido) { Validacao.Add(Mensagem.CobrancaMsg.DataIUFObrigatorio); } if (!parcelamento.Data1Vencimento.IsValido) { Validacao.Add(Mensagem.CobrancaMsg.DataVencimentoObrigatoria); } return(Validacao.EhValido); }
public bool CalcularParcelas(Cobranca cobranca, CobrancaParcelamento parcelamento) { var retorno = false; if (!_validar.Calcular(cobranca, parcelamento)) { return(retorno); } var vrte = _busConfiguracao.ObterVrte(cobranca.DataIUF.Data.Value.Year) ?? new Vrte(); var parametrizacao = _busConfiguracao.ObterParametrizacao(cobranca.CodigoReceitaId, cobranca.DataEmissaoIUF.Data.Value); var vrte1Vencimento = _busConfiguracao.ObterVrte(parcelamento.Data1Vencimento.Data.Value.Year) ?? new Vrte(); if (!_validar.CalcularParametrizacao(parametrizacao, vrte, vrte1Vencimento)) { return(retorno); } var valorMultaAtualizadoEmReais = GetValorTotalAtualizadoEmReais(cobranca, parcelamento, parametrizacao); parcelamento.ValorMultaAtualizado = (valorMultaAtualizadoEmReais / vrte.VrteEmReais) * vrte1Vencimento.VrteEmReais; var valorAtualizadoVRTE = parcelamento.ValorMultaAtualizado / vrte1Vencimento.VrteEmReais; if ((parcelamento.DUAS?.Count ?? 0) == 0) { if (parcelamento.QuantidadeParcelas == 0) { parcelamento.QuantidadeParcelas = this.GetMaximoParcelas(cobranca, parcelamento); } parcelamento.DUAS = this.GerarParcelas(cobranca, parcelamento); } var parcelas = parcelamento.DUAS.OrderBy(x => Convert.ToInt32(x.Parcela.Split('/')[0])).ToList(); if (parcelas.Count == 1 && cobranca.Parcelamentos?.Count <= 1) { var parcela = parcelas[0]; if (parcela.ValorDUA == 0) { var prazoDesconto = parametrizacao.PrazoDescontoUnidade * GetPrazoDesconto(parametrizacao.PrazoDescontoDecorrencia); var vrteParcela = _busConfiguracao.ObterVrte(parcela.DataVencimento.Data.Value.Year); if (parcela.DataVencimento.Data < cobranca.DataIUF.Data.Value.AddDays(prazoDesconto + 1).Date) { parcelamento.ValorMultaAtualizado = parcelamento.ValorMulta; valorAtualizadoVRTE = parcelamento.ValorMulta / vrte.VrteEmReais; parcela.VRTE = valorAtualizadoVRTE * (1 - (Convert.ToDecimal(parametrizacao.DescontoPercentual) / 100)); if (vrteParcela.Id > 0) { parcela.ValorDUA = Math.Round(parcela.VRTE * vrteParcela.VrteEmReais, 2); parcelamento.ValorMultaAtualizado = parcela.ValorDUA; } } else { parcela.VRTE = valorAtualizadoVRTE; if (vrteParcela.Id > 0) { parcela.ValorDUA = Math.Round(valorAtualizadoVRTE * vrteParcela.VrteEmReais, 2); } } } retorno = true; } else { var parcelaAnterior = new CobrancaDUA(); var valorJuros = 1 + (Convert.ToDecimal(parametrizacao.JurosPercentual) / 100); foreach (var parcela in parcelas) { if (parcela.ValorDUA == 0) { if (parcela.VRTE == 0) { if ((parcela.Parcela.Split('/')[0]).Equals("1")) { parcela.VRTE = Math.Round(valorAtualizadoVRTE / parcelamento.QuantidadeParcelas, 4); } else { parcela.VRTE = Math.Round(parcelaAnterior.VRTE * valorJuros, 4); } } if (parcela.DataVencimento.IsValido) { var vrteParcela = _busConfiguracao.ObterVrte(parcela.DataVencimento.Data.Value.Year); if (vrteParcela.Id > 0) { parcela.ValorDUA = Math.Round(parcela.VRTE * vrteParcela.VrteEmReais, 2); } } } parcelaAnterior = parcela; retorno = true; } } return(retorno); }