Exemple #1
0
 public IDefinidorDeContextoDeAplicacaoDeLimite Diferenca(IDefinidorDeContextoDeAplicacaoDeLimite outroContexto)
 {
     if (Interseccao(outroContexto) is DefinidorDeContextoDeAplicacaoPorFuncionario contextoInterseccao)
     {
         var idsNaoContidos = ContextosPermitidos.Where(id => !contextoInterseccao.ContextosPermitidos.Contains(id));
         if (contextoInterseccao.ContextosPermitidos.Count() > 0)
         {
             if (idsNaoContidos.Count() > 0)
             {
                 return(new DefinidorDeContextoDeAplicacaoPorFuncionario(idsNaoContidos));
             }
             else
             {
                 return(new DefinidorDeContextoVazio());
             }
         }
         else
         {
             return(new DefinidorDeContextoDeAplicacaoPorFuncionario(ContextosPermitidos));
         }
     }
     else
     {
         return(new DefinidorDeContextoDeAplicacaoPorFuncionario(ContextosPermitidos));
     }
 }
        //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);
            }
        }
Exemple #3
0
        public IDefinidorDeContextoDeAplicacaoDeLimite Interseccao(IDefinidorDeContextoDeAplicacaoDeLimite contexto)
        {
            if (contexto is DefinidorDeContextoDeAplicacaoPorFuncionario contextoDeAplicacaoPorFuncionario)
            {
                IEnumerable <int> idsEmComum = ContextosPermitidos.Intersect(contextoDeAplicacaoPorFuncionario.ContextosPermitidos);

                if (idsEmComum.Count() > 0)
                {
                    return(new DefinidorDeContextoDeAplicacaoPorFuncionario(idsEmComum));
                }
                else
                {
                    return(new DefinidorDeContextoVazio());
                }
            }
            else
            {
                return(new DefinidorDeContextoVazio());
            }
        }
Exemple #4
0
 internal DefinidorDeContextoDeLimitePorDelegacao(IDefinidorDeContextoDeAplicacaoDeLimite aplicacao, IDefinidorDeContextoDeAcumulacaoDeLimite acumulacao)
 {
     _definidorDeAplicacao  = new Lazy <IDefinidorDeContextoDeAplicacaoDeLimite>(() => aplicacao);
     _definidorDeAcumulacao = new Lazy <IDefinidorDeContextoDeAcumulacaoDeLimite>(() => acumulacao);
 }
Exemple #5
0
 public IDefinidorDeContextoDeAplicacaoDeLimite Interseccao(IDefinidorDeContextoDeAplicacaoDeLimite contexto)
 {
     return(this);
 }
Exemple #6
0
 public IDefinidorDeContextoDeAplicacaoDeLimite Diferenca(IDefinidorDeContextoDeAplicacaoDeLimite outroContexto)
 {
     return(outroContexto);
 }