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()); }
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()); }