//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);
            }
        }
Esempio n. 2
0
        private void CriarLimite()
        {
            decimal valorLimite = _parametros.ValorLimite;

            ModelosBaseDeDominio.IUnidadeDeEntrega entregaLimite = _parametros.UnidadeDoLimite.CriarEntregas(valorLimite);
            _limiteEmConstrucao    = (ILimiteConstruivel)_parametros.Tipo.Construir(entregaLimite);
            _limiteEmConstrucao.Id = _parametros.Id;
        }