예제 #1
0
        static void Main(string[] args)
        {
            var parametros = new ParametrosSimulacao
            {
                Faturamento   = 10000,
                LiquidoMinimo = 3500
            };


            var bestsConfs = new Simulacao().Simular(parametros);

            var bestConf = bestsConfs.FirstOrDefault();

            if (bestConf != null)
            {
                Console.WriteLine("::::: Melhor Pro-Labore :::::");
                Console.WriteLine($"Faturamento R$ {bestConf.Faturamento.ToString("0.00")}");
                Console.WriteLine("");
                Console.WriteLine("* Pro-Labore:");
                Console.WriteLine($" - Pro-Labore Bruto R$ {bestConf.Bruto.ToString("0.00")}");
                Console.WriteLine($" - Desc. INSS R$ {bestConf.INSS.ToString("0.00")}");
                Console.WriteLine($" - Desc. IRRF R$ {bestConf.IRPF.ToString("0.00")}");
                Console.WriteLine($" - Liquido R$ {bestConf.Liquido.ToString("0.00")}");

                Console.WriteLine("");
                Console.WriteLine("* Empresa:");
                Console.WriteLine($" - Custo para a empresa R$ {bestConf.CustoEmpresa.ToString("0.00")}");
                Console.WriteLine($" - Desc. INSS Patronal R$ {bestConf.INSSPatronal.ToString("0.00")}");
                Console.WriteLine($" - Lucro/Caixa R$ {(parametros.Faturamento - bestConf.CustoEmpresa).ToString("0.00")}");
            }

            //Console.WriteLine(bestsConfs.Where(x => (x.Bruto % 100) == 0).ToArray());
        }
예제 #2
0
        public Resultado[] Simular(ParametrosSimulacao parametros)
        {
            int qtdSimulacoes = Decimal.ToInt32(Math.Ceiling(
                                                    parametros.Faturamento * (1m - Constantes.AliquotaSimples))
                                                - (parametros.Descontos ?? 0m));

            return(Enumerable.Range(0, qtdSimulacoes)
                   .AsParallel()
                   .Select(x => Convert.ToDecimal(x))
                   .Where(x => (x / parametros.Faturamento) >= 0.28m)
                   .Select(x => new
            {
                bruto = x,
                _base = x * (1 - Constantes.AliquotaINSS)
            })
                   .Select(x => new
            {
                x.bruto,
                x._base,
                faixaAliquota = FaixaAliquota(x._base),
                inssPatronal = (x.bruto * Constantes.AliquotaINSSPatronal)
            })
                   .Select(x => new Resultado
            {
                Faturamento = parametros.Faturamento,
                Bruto = x.bruto,
                INSS = (x.bruto > Constantes.TetoINSS ? Constantes.TetoINSS : x.bruto) * Constantes.AliquotaINSS,
                IRPF = x._base * x.faixaAliquota,
                Liquido = x._base * (1 - x.faixaAliquota),
                CustoEmpresa = x.bruto - (x.inssPatronal * -1m),
                INSSPatronal = x.inssPatronal
            })
                   .Where(x => parametros.IRPFMinimo == null || x.IRPF >= parametros.IRPFMinimo)
                   .Where(x => parametros.IRPFMaximo == null || x.IRPF <= parametros.IRPFMaximo)
                   .Where(x => parametros.INSSMinimo == null || x.INSS >= parametros.INSSMinimo)
                   .Where(x => parametros.INSSMaximo == null || x.INSS <= parametros.INSSMaximo)
                   .Where(x => parametros.LiquidoMinimo == null || x.Liquido >= parametros.LiquidoMinimo)
                   .Where(x => parametros.LiquidoMaximo == null || x.Liquido <= parametros.LiquidoMaximo)
                   .OrderBy(x => x.Liquido)
                   .Where((x, i) => parametros.SaltoResultados == null || (i % parametros.SaltoResultados) == 0)
                   .ToArray()
                   .Take(parametros.QtdResultados ?? int.MaxValue)
                   .ToArray());
        }