public void Deve_Remunerar_Linearmente_Proporcional_Ao_Percentual_Configurado_Para_a_Regra()
        {
            //Arrange
            Random  rnd           = new Random();
            decimal multiplicador = rnd.Next(0, 100) / 100.0M;
            var     valorHora     = new Dinheiro(valor: 100M, moeda: Moeda.Real);
            Mock <ITabelaDePreco <int> > tabelaMock = GeraTabelaMock(valorHora);
            Profissional   favorecido    = LOMock.GeraProfissionalMock(id: 1, categoria: new Categoria(), nome: "LeMock");
            IFavorecimento favorecimento = LOMock.GeraFavorecimentoMock(new[] { favorecido });
            ParametrosDeRegraDeRemuneracao parametrosRegra1 = LOMock.GeraParametrosDeRegraDeRemuneracaoPorHoraMock(percentual: 100);
            ParametrosDeRegraDeRemuneracao parametrosRegra2 = LOMock.GeraParametrosDeRegraDeRemuneracaoPorHoraMock(percentual: 100 * multiplicador);
            IRegraDeRemuneracao            regra1           = LOMock.ConstroiRegraPorHora(parametrosRegra1, favorecimento, tabelaMock.Object);
            IRegraDeRemuneracao            regra2           = LOMock.ConstroiRegraPorHora(parametrosRegra2, favorecimento, tabelaMock.Object);

            Mock <IHoraPreProcessada> entregaMock = ConfiguraMockEntregaRemuneravel(5, favorecido);

            //Act
            IEnumerable <IRemuneracao> remuneracoesA = regra1.CalculaRemuneracoes(new IEntregaPreProcessada[] { entregaMock.Object });
            IEnumerable <IRemuneracao> remuneracoesB = regra2.CalculaRemuneracoes(new IEntregaPreProcessada[] { entregaMock.Object });
            IEnumerator <IRemuneracao> enumeratorA   = remuneracoesA.GetEnumerator();
            IRemuneracao RemuneracaoA = remuneracoesA.First();
            IEnumerator <IRemuneracao> enumeratorB = remuneracoesB.GetEnumerator();
            IRemuneracao RemuneracaoB = remuneracoesB.First();

            //Assert
            Assert.AreEqual(multiplicador * RemuneracaoA.ValorAjustado.Valor, RemuneracaoB.ValorAjustado.Valor);
        }
Ejemplo n.º 2
0
        public IEnumerable <IRemuneracao> AbaterValorExcedenteDasRemuneracoes(ILimiteDeRemuneracao limiteOriginario, IEnumerable <IRemuneracao> remuneracoes, Dinheiro valorExcedente)
        {
            //TODO funciona apenas para real
            Dinheiro valorTotal = remuneracoes.Select(rem => rem.ValorAjustado).SomaDinheiro();

            ConcurrentStack <IRemuneracao> remuneracoesAbatidas = new ConcurrentStack <IRemuneracao>();

            Dinheiro totalAbatido = Dinheiro.Zero;

            Parallel.ForEach(remuneracoes, (rem) =>
            {
                decimal percentualDeAbatimento = decimal.Round(rem.ValorAjustado / valorTotal, 7);

                Dinheiro valorDoAbatimento = percentualDeAbatimento * valorExcedente;

                Dinheiro valorDoAbatimentoArrendondado = Dinheiro.Arredondar(valorDoAbatimento, 7);

                IRemuneracao remuneracaoDivididaEmPartesAbatidas = AbaterRemuneracao(rem, valorDoAbatimentoArrendondado, limiteOriginario);

                if (limiteOriginario.Tipo.Id.Equals("LIMITE_MINIMO") && remuneracaoDivididaEmPartesAbatidas.ValorAjustado > Dinheiro.Zero || limiteOriginario.Tipo.Id.Equals("LIMITE_MAXIMO"))
                {
                    remuneracoesAbatidas.Push(remuneracaoDivididaEmPartesAbatidas);
                    totalAbatido += valorDoAbatimentoArrendondado;
                }
            });

            Dinheiro diferencaDeExcedente = Dinheiro.Arredondar(valorExcedente - totalAbatido, 6);

            if (diferencaDeExcedente != Dinheiro.Zero && remuneracoesAbatidas.Count() > 0)
            {
                CorrecaoDeArredondamentoDeExcedente(remuneracoesAbatidas.First(), diferencaDeExcedente);
            }

            return(remuneracoesAbatidas);
        }
Ejemplo n.º 3
0
        private void CorrecaoDeArredondamentoDeExcedente(IRemuneracao remuneracao, Dinheiro diferencaDeExcedente)
        {
            var remuneracaoLimitada = remuneracao as IRemuneracaoLimitada;

            IExcedenteDeRemuneracao excedente = remuneracaoLimitada.Excedentes.Last();

            remuneracaoLimitada.RemoverExcedente(excedente);

            IExcedenteDeRemuneracao novoExcedente = new ExcedenteDeRemuneracao(remuneracaoLimitada, excedente.Limite, excedente.ValorBruto, valorExcedenteAoLimiteDestaRemuneracao: excedente.ValorExcedente + diferencaDeExcedente);

            remuneracaoLimitada.AdicionarExcedente(novoExcedente);
        }
Ejemplo n.º 4
0
        private IRemuneracao AbaterRemuneracao(IRemuneracao rem, Dinheiro valorDoAbatimento, ILimiteDeRemuneracao limiteOriginario)
        {
            IExcedenteDeRemuneracao remuneracaoExcedente  = new ExcedenteDeRemuneracao(rem, limiteOriginario, rem.ValorBruto, valorExcedenteAoLimiteDestaRemuneracao: valorDoAbatimento);
            IRemuneracao            remuneracaoAposLimite = rem;

            if (rem is IRemuneracaoLimitada remuneracaoLimitada)
            {
                rem.ValorAjustado     = new Dinheiro(rem.ValorBruto.Valor, rem.ValorBruto.Moeda);
                remuneracaoAposLimite = remuneracaoLimitada.AdicionarExcedente(remuneracaoExcedente);
            }
            else
            {
                remuneracaoLimitada   = new RemuneracaoLimitada(remuneracaoAposLimite, valorBruto: remuneracaoAposLimite.ValorBruto);
                remuneracaoAposLimite = remuneracaoLimitada.AdicionarExcedente(remuneracaoExcedente);
            }

            return(remuneracaoAposLimite);
        }
        public void Deve_Remunerar_Favorecido_Conforme_Tabela()
        {
            //Arrange
            Profissional   favorecido               = LOMock.GeraProfissionalMock(id: 1, categoria: new Categoria(), nome: "LeMock");
            IFavorecimento favorecimento            = LOMock.GeraFavorecimentoMock(new[] { favorecido });
            var            valorHora                = new Dinheiro(valor: 100M, moeda: Moeda.Real);
            Mock <ITabelaDePreco <int> > tabelaMock = GeraTabelaMock(valorHora);

            ParametrosDeRegraDeRemuneracao parametrosRegra = LOMock.GeraParametrosDeRegraDeRemuneracaoPorHoraMock(percentual: 100M);

            IRegraDeRemuneracao       regra   = LOMock.ConstroiRegraPorHora(parametrosRegra, favorecimento, tabelaMock.Object);
            Mock <IHoraPreProcessada> entrega = ConfiguraMockEntregaRemuneravel(5, favorecido);

            //Act
            IEnumerable <IRemuneracao> remuneracoes = regra.CalculaRemuneracoes((new IEntregaPreProcessada[] { entrega.Object }));
            IRemuneracao Remuneracao = remuneracoes.First();

            //Assert
            Assert.AreEqual(favorecido.Id, Remuneracao.IdFavorecido);
            Assert.AreEqual(5 * valorHora.Valor, Remuneracao.ValorAjustado.Valor);
        }
Ejemplo n.º 6
0
 public decimal Calcular(IRemuneracao remuneracao)
 {
     return(remuneracao.Remuneracao());
 }
        private IRemuneracao AplicaPenalizacao(IRemuneracao remuneracao)
        {
            remuneracao.ValorAjustado -= remuneracao.ValorAjustado * (PercentualBonus / 100);

            return(remuneracao);
        }
        private IRemuneracao AplicaBonus(IRemuneracao remuneracao)
        {
            remuneracao.ValorAjustado += remuneracao.ValorAjustado * (PercentualBonus / 100);

            return(remuneracao);
        }
Ejemplo n.º 9
0
        private static void AdicionarVinculoARemuneracao(ILimiteDeRemuneracao limiteOriginario, IRemuneracao remuneracaoAposLimite)
        {
            const string TIPO_DE_VINCULO_LIMITE = "Limite";

            if (remuneracaoAposLimite.Vinculacao?.Where(it => it.ID == limiteOriginario.Id && it.Tipo == TIPO_DE_VINCULO_LIMITE).Count() == 0)
            {
                remuneracaoAposLimite.AdicionarVinculo(new Vinculo(TIPO_DE_VINCULO_LIMITE, limiteOriginario.Id, ""));
            }
        }