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); } }
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()); } }
internal DefinidorDeContextoDeLimitePorDelegacao(IDefinidorDeContextoDeAplicacaoDeLimite aplicacao, IDefinidorDeContextoDeAcumulacaoDeLimite acumulacao) { _definidorDeAplicacao = new Lazy <IDefinidorDeContextoDeAplicacaoDeLimite>(() => aplicacao); _definidorDeAcumulacao = new Lazy <IDefinidorDeContextoDeAcumulacaoDeLimite>(() => acumulacao); }
public IDefinidorDeContextoDeAplicacaoDeLimite Interseccao(IDefinidorDeContextoDeAplicacaoDeLimite contexto) { return(this); }
public IDefinidorDeContextoDeAplicacaoDeLimite Diferenca(IDefinidorDeContextoDeAplicacaoDeLimite outroContexto) { return(outroContexto); }