示例#1
0
        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);
        }
示例#2
0
        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, ""));
            }
        }
示例#3
0
        public IEnumerable <IRemuneracao> AplicaLimites(IEnumerable <IRemuneracao> remuneracoes)
        {
            if (_limite == null)
            {
                var construtor = new ConstrutorDeLimitePadrao(this);
                _limite = construtor.ConstruirContexto().ConstruirFormaDeAbatimento().Construir();
            }

            return(_limite.AplicaLimites(remuneracoes));
        }
示例#4
0
        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);
        }
示例#5
0
        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);
        }
示例#6
0
        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);
 }