//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); }
//TODO Implementar limites de outros tipos que não dinheiro - pensar em extensão para entregas internal override IEnumerable <IRemuneracao> LimitaRemuneracoesDoContexto(IEnumerable <IRemuneracao> remuneracoesPorContextoDeAcumulacao) { IEnumerable <IRemuneracao> remuneracoesLimitadasNoContexto = remuneracoesPorContextoDeAcumulacao; Dinheiro valorJaExcedido = ObtemTotalExcedidoDesteLimite(remuneracoesPorContextoDeAcumulacao); Dinheiro valorExcedente = remuneracoesPorContextoDeAcumulacao.Select(rem => rem.ValorAjustado).SomaDinheiro() - (_valorLimite - valorJaExcedido); if (valorExcedente.Valor > 0) { IEnumerable <IRemuneracao> remuneracoesDisponiveisParaAbatimento = remuneracoesPorContextoDeAcumulacao.Where(rem => !rem.FoiEmitida && (!rem.FoiFechada || _podeAbaterFechadas)); remuneracoesLimitadasNoContexto = FormaDeAbatimento.AbaterValorExcedenteDasRemuneracoes(this, remuneracoesDisponiveisParaAbatimento, valorExcedente); } return(remuneracoesLimitadasNoContexto); }