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