private async Task <IEnumerable <IRemuneracao> > AplicaLimitesNasRemuneracoesAsync(IEnumerable <ILimiteDeRemuneracao> limitesDeRemuneracao, IEnumerable <IRemuneracao> remuneracoes, IEnumerable <IRemuneracao> remuneracoesFechadas, IEnumerable <IRemuneracaoEmitida> remuneracoesEmitidas)
        {
            IEnumerable <IGrouping <TipoDeLimite, ILimiteDeRemuneracao> > limitesOrdenados = _descobridorDeLimites.DefineOrdemDeAplicacao(limitesDeRemuneracao);

            IEnumerable <IRemuneracao> remuneracoesLimitadas = remuneracoes;
            IEnumerable <IRemuneracao> todasRemuneracoes     = remuneracoes.Union(remuneracoesFechadas).Union(remuneracoesEmitidas);

            //int[] idLimites = limitesDeRemuneracao.Select(x => x.Id).ToArray();
            //IEnumerable<ParametrosDeLimites> limites = await _descobridorDeLimites.ObtemParametrosDosLimitesAsync(idLimites);

            foreach (IGrouping <TipoDeLimite, ILimiteDeRemuneracao> limitesOrdenadosDoContexto in limitesOrdenados)
            {
                TipoDeLimite tipo = limitesOrdenadosDoContexto.Key;
                IEnumerable <ILimiteDeRemuneracao> limitesAAplicar = tipo.ComporLimites(limitesOrdenadosDoContexto);

                //ParametrosDeLimites limite = new ParametrosDeLimites();
                foreach (ILimiteDeRemuneracao limiteAplicar in limitesAAplicar)
                {
                    //limite = limites.Single(x => x.Id == limiteAplicar.Id);
                    //IEnumerable<IRemuneracao> todasRemuneracoesDoPeriodoDoLimite = todasRemuneracoes.Where(x => x.CompetenciaDaEntrega == new CompetenciaMensal(limite.DataInicio.Value) );
                    //IEnumerable<IRemuneracao> todasRemuneracoesForaDoPeriodoDoLimite = todasRemuneracoes.Where(x => !x.CompetenciaDaEntrega.Contem(limite.DataInicio.Value) && !x.CompetenciaDaEntrega.Contem(limite.DataFim.Value));
                    remuneracoesLimitadas = limiteAplicar.AplicaLimites(todasRemuneracoes).ToArray();
                }
            }

            IEnumerable <IRemuneracao> retorno = remuneracoesLimitadas.Where(x => remuneracoes.Select(c => c.Id).Contains(x.Id));

            return(retorno);
        }
예제 #2
0
 public ParametrosDeLimites(LimiteViewModel limiteVM)
 {
     Id                         = limiteVM.Id;
     Tipo                       = TipoDeLimite.Get(limiteVM.TipoDeLimite);
     UnidadeDoLimite            = UnidadeDeEntregaDeValorLimite.Get(limiteVM.Moeda);
     TipoDeContextoDeAplicacao  = TipoDeDefinidorDeContexto.Regra;
     TipoDeContextoDeAcumulacao = TipoDeDefinidorDeContexto.Funcionario;
     TipoDeAbatimento           = TipoDeAbatimento.AbatimentoProporcionalAoValor;
     Nome                       = limiteVM.Nome;
     ValorLimite                = limiteVM.ValorLimite;
     DataFim                    = limiteVM.DataFim;
     DataInicio                 = limiteVM.DataInicio;
     IdsDosContextosDeAplicacao = limiteVM.IdsDosContextosDeAplicacao;
 }