public IEnumerable <IRemuneracao> AbaterValorExcedenteDasRemuneracoes(ILimiteDeRemuneracao limiteOriginario, IEnumerable <IRemuneracao> remuneracoes, Dinheiro valorExcedente) { //TODO funciona apenas para real Dinheiro valorTotal = remuneracoes.Select(rem => rem.ValorAjustado).SomaDinheiro(); ConcurrentStack <IRemuneracao> remuneracoesAbatidas = new ConcurrentStack <IRemuneracao>(); Dinheiro totalAbatido = Dinheiro.Zero; Parallel.ForEach(remuneracoes, (rem) => { decimal percentualDeAbatimento = decimal.Round(rem.ValorAjustado / valorTotal, 7); Dinheiro valorDoAbatimento = percentualDeAbatimento * valorExcedente; Dinheiro valorDoAbatimentoArrendondado = Dinheiro.Arredondar(valorDoAbatimento, 7); IRemuneracao remuneracaoDivididaEmPartesAbatidas = AbaterRemuneracao(rem, valorDoAbatimentoArrendondado, limiteOriginario); if (limiteOriginario.Tipo.Id.Equals("LIMITE_MINIMO") && remuneracaoDivididaEmPartesAbatidas.ValorAjustado > Dinheiro.Zero || limiteOriginario.Tipo.Id.Equals("LIMITE_MAXIMO")) { remuneracoesAbatidas.Push(remuneracaoDivididaEmPartesAbatidas); totalAbatido += valorDoAbatimentoArrendondado; } }); Dinheiro diferencaDeExcedente = Dinheiro.Arredondar(valorExcedente - totalAbatido, 6); if (diferencaDeExcedente != Dinheiro.Zero && remuneracoesAbatidas.Count() > 0) { CorrecaoDeArredondamentoDeExcedente(remuneracoesAbatidas.First(), diferencaDeExcedente); } return(remuneracoesAbatidas); }
private static void AdicionarVinculoARemuneracao(ILimiteDeRemuneracao limiteOriginario, IRemuneracao remuneracaoAposLimite) { const string TIPO_DE_VINCULO_LIMITE = "Limite"; if (remuneracaoAposLimite.Vinculacao?.Where(it => it.ID == limiteOriginario.Id && it.Tipo == TIPO_DE_VINCULO_LIMITE).Count() == 0) { remuneracaoAposLimite.AdicionarVinculo(new Vinculo(TIPO_DE_VINCULO_LIMITE, limiteOriginario.Id, "")); } }
public IEnumerable <IRemuneracao> AplicaLimites(IEnumerable <IRemuneracao> remuneracoes) { if (_limite == null) { var construtor = new ConstrutorDeLimitePadrao(this); _limite = construtor.ConstruirContexto().ConstruirFormaDeAbatimento().Construir(); } return(_limite.AplicaLimites(remuneracoes)); }
public async Task <IEnumerable <ILimiteDeRemuneracao> > ObtemLimitesAsync(int[] idsLimites) { IEnumerable <ParametrosDeLimites> parametros = (await _repositorio.ObtemLimitesAsync(idsLimites)).Select(par => (ParametrosDeLimites)par); ConcurrentQueue <ILimiteDeRemuneracao> limitesDeRemuneracao = new ConcurrentQueue <ILimiteDeRemuneracao>(); Parallel.ForEach(parametros, (parametro) => { ILimiteDeRemuneracao limite = ConstruirLimite(parametro); if (limite != null) { limitesDeRemuneracao.Enqueue(limite); } }); return(limitesDeRemuneracao); }
public async Task <IEnumerable <ILimiteDeRemuneracao> > DescobrirLimitesAplicaveisNoPeriodoAsync(PeriodoSimples periodo) { IEnumerable <ParametrosDeLimites> parametros = (await _repositorio.ListarLimitesVigentesNoPeriodo(periodo)).Select(par => (ParametrosDeLimites)par); ConcurrentQueue <ILimiteDeRemuneracao> limitesDeRemuneracao = new ConcurrentQueue <ILimiteDeRemuneracao>(); Parallel.ForEach(parametros, (parametro) => { ILimiteDeRemuneracao limite = ConstruirLimite(parametro); if (limite != null) { limitesDeRemuneracao.Enqueue(limite); } }); return(limitesDeRemuneracao); }
private IRemuneracao AbaterRemuneracao(IRemuneracao rem, Dinheiro valorDoAbatimento, ILimiteDeRemuneracao limiteOriginario) { IExcedenteDeRemuneracao remuneracaoExcedente = new ExcedenteDeRemuneracao(rem, limiteOriginario, rem.ValorBruto, valorExcedenteAoLimiteDestaRemuneracao: valorDoAbatimento); IRemuneracao remuneracaoAposLimite = rem; if (rem is IRemuneracaoLimitada remuneracaoLimitada) { rem.ValorAjustado = new Dinheiro(rem.ValorBruto.Valor, rem.ValorBruto.Moeda); remuneracaoAposLimite = remuneracaoLimitada.AdicionarExcedente(remuneracaoExcedente); } else { remuneracaoLimitada = new RemuneracaoLimitada(remuneracaoAposLimite, valorBruto: remuneracaoAposLimite.ValorBruto); remuneracaoAposLimite = remuneracaoLimitada.AdicionarExcedente(remuneracaoExcedente); } return(remuneracaoAposLimite); }
private static bool LimitePodeterInterseccao(ILimiteDeRemuneracao lim) { return((lim is ILimiteConstruivel construivel) && construivel.DefinidorDeContexto.Aplicacao.Tipo == TipoDeDefinidorDeContexto.Regra && construivel.DefinidorDeContexto.Acumulacao.Tipo == TipoDeDefinidorDeContexto.Funcionario); }