//TODO implementar limites compostos para outros tipos de contexto (além de regra e funcionario
        public IEnumerable <ILimiteDeRemuneracao> ConstruirLimites()
        {
            IEnumerable <ILimiteConstruivel>   limitesAVerificar = _limites.Where(lim => LimitePodeterInterseccao(lim)).Select(lim => lim as ILimiteConstruivel).ToArray();
            IEnumerable <ILimiteDeRemuneracao> outrosLimites     = _limites.Where(lim => !LimitePodeterInterseccao(lim)).ToArray();

            var idsRegrasDistintas = limitesAVerificar.SelectMany(lim => lim.DefinidorDeContexto.Aplicacao.ContextosPermitidos).Distinct();

            foreach (var id in idsRegrasDistintas)
            {
                var limitesDaRegra = limitesAVerificar.Where(lim => lim.DefinidorDeContexto.Aplicacao.ContextosPermitidos.Contains(id));
                ILimiteConstruivel limiteComposto = ConstruirLimiteComposto(limitesDaRegra);

                IDefinidorDeContextoDeAcumulacaoDeLimite acumulacao = limitesDaRegra.First().DefinidorDeContexto.Acumulacao.Tipo.ConstruirDefinidorDeAcumulacao();

                IDefinidorDeContextoDeAplicacaoDeLimite aplicacao = limitesDaRegra.First().DefinidorDeContexto.Aplicacao.Tipo.ConstruirDefinidorDeAplicacao(new[] { id });

                limiteComposto.DefinidorDeContexto = new DefinidorDeContextoDeLimitePorDelegacao(aplicacao, acumulacao);

                yield return(limiteComposto);
            }

            //TODO implementar outros tipos de limite com intersecção
            foreach (var limite in outrosLimites)
            {
                yield return(limite);
            }
        }
Exemplo n.º 2
0
 internal DefinidorDeContextoDeLimitePorDelegacao(IDefinidorDeContextoDeAplicacaoDeLimite aplicacao, IDefinidorDeContextoDeAcumulacaoDeLimite acumulacao)
 {
     _definidorDeAplicacao  = new Lazy <IDefinidorDeContextoDeAplicacaoDeLimite>(() => aplicacao);
     _definidorDeAcumulacao = new Lazy <IDefinidorDeContextoDeAcumulacaoDeLimite>(() => acumulacao);
 }