//TODO Melhorar reutilizacao de codigo usando pattern Template - note que a funcao aplica limites é idêntica para o limite máximo e o mínimo internal override IEnumerable <IRemuneracao> LimitaRemuneracoesDoContexto(IEnumerable <IRemuneracao> remuneracoesPorContextoDeAcumulacao) { IEnumerable <IRemuneracao> remuneracoesLimitadasNoContexto = null; Dinheiro totalDaRemuneracao = new Dinheiro(); totalDaRemuneracao = remuneracoesPorContextoDeAcumulacao.Select(rem => rem is IRemuneracaoLimitada ? rem.ValorBruto : rem.ValorAjustado).SomaDinheiro(); Dinheiro valorJaExcedido = ObtemTotalExcedidoDesteLimite(remuneracoesPorContextoDeAcumulacao); Dinheiro valorExcedente = Dinheiro.MenorEntre(_valorLimite, totalDaRemuneracao); IEnumerable <IRemuneracao> remuneracoesDisponiveisParaAbatimento = remuneracoesPorContextoDeAcumulacao.Where(rem => !rem.FoiEmitida && (!rem.FoiFechada || _podeAbaterFechadas)); remuneracoesLimitadasNoContexto = FormaDeAbatimento.AbaterValorExcedenteDasRemuneracoes(this, remuneracoesDisponiveisParaAbatimento, valorExcedente); return(remuneracoesLimitadasNoContexto); }