/// <summary> /// Obtem o valor da aliquota IRRF do funcionario de acordo com o valor do salario /// </summary> /// <param name="funcionario"></param> /// <returns></returns> private decimal GetAliquotaIrrf(FuncionarioCompetencia funcionario) { using (var ctx = new BalcaoContext()) { //pega o salario bruto - vlr inss, pois é contribuicao entao ja deduz no irrf var salarioFun = funcionario.Funcionario.Salario - ValorInss(funcionario); var aliquota = 0M; var encargos = ctx.FaixaContribuicaoSalarialDao.Where( e => e.TipoContribuicao == TypeEncargoSalarial.IRRF && e.ValorInicial <= salarioFun && e.ValorFinal >= salarioFun); //se não achou nada, o salario do cara é maior que a faixa dos 11%, então use a aliquota = 11% if (encargos.Count() == 0) { aliquota = 0M; } else //senao recupera a aliquota da faixa salarial do sujeito { aliquota = encargos.FirstOrDefault().AliquotaEncargo; } return(aliquota); } }
/// <summary> /// Obtem o valor do INSS do funcionario de acordo com o valor do salario /// </summary> /// <param name="funcionario"></param> /// <returns></returns> private decimal ValorInss(FuncionarioCompetencia funcionario) { using (var ctx = new BalcaoContext()) { var dtCompetencia = funcionario.Competencia.DataInicialCompetencia.Date; var salarioFun = funcionario.Funcionario.Salario; var encargos = ctx.FaixaContribuicaoSalarialDao.Where( e => (e.TipoContribuicao == TypeEncargoSalarial.INSS && e.VigenciaInicial.Date >= dtCompetencia && e.ValorInicial <= salarioFun && e.ValorFinal >= salarioFun) || (!e.VigenciaFinal.HasValue && e.TipoContribuicao == TypeEncargoSalarial.INSS && e.ValorInicial <= salarioFun && e.ValorFinal >= salarioFun)).FirstOrDefault(); //se nao achou o engargo para o INSS, o candango paga o TETO if (encargos == null) { salarioFun = ctx.FaixaContribuicaoSalarialDao .Where(e => e.TipoContribuicao == TypeEncargoSalarial.INSS).OrderBy(e => e.ValorFinal).Last().ValorFinal; } decimal vlrInss = (salarioFun * GetAliquotaInss(funcionario)) / 100; return(vlrInss); } }
//Gerar ficha financeira de cada funcionario. private ICollection <FichaFinanceiraFuncionario> GerarFichaFinanceira(FuncionarioCompetencia funcionario, GrupoEvento grupo, TypeTipoFechamentoFolha p_tipoFechamento) { var dataRef = funcionario.Competencia.DataFinalCompetencia; foreach (var evento in grupo.EventosGrupo) { //salario contratual if (evento.Evento.CodigoCalculo == TypeCodigoCalculo.SalarioBase) { var qtd = obtemDiasFolha(p_tipoFechamento); var salario = GetSalarioCompetencia(p_tipoFechamento, funcionario); FichaFinanceiraFuncionario fichaFin = new FichaFinanceiraFuncionario(funcionario, evento.Evento, salario, evento.Evento.TipoReferencia, dataRef, qtd); fichaFin.Evento = evento.Evento; if (fichaFin.ValorMovimento > 0M) { funcionario.FichaFinanceiraFuncionario.Add(fichaFin); } } //calculo do INSS else if (evento.Evento.CodigoCalculo == TypeCodigoCalculo.INSS) { FichaFinanceiraFuncionario fichaFin = new FichaFinanceiraFuncionario( funcionarioComp: funcionario, evento: evento.Evento, valor: ValorInss(funcionario), tipoReferencia: evento.Evento.TipoReferencia, dataRef: dataRef, quantidade: GetAliquotaInss(funcionario)); fichaFin.Evento = evento.Evento; if (fichaFin.ValorMovimento > 0M) { funcionario.FichaFinanceiraFuncionario.Add(fichaFin); } } //valor do FGTS no mês. Aliquota sempre é 8% else if (evento.Evento.CodigoCalculo == TypeCodigoCalculo.FGTS) { decimal vlrFGTS = (funcionario.Funcionario.Salario * 8) / 100; funcionario.ValorFgts = vlrFGTS; FichaFinanceiraFuncionario fichaFin = new FichaFinanceiraFuncionario(funcionario, evento.Evento, vlrFGTS, evento.Evento.TipoReferencia, dataRef, 8); fichaFin.Evento = evento.Evento; if (fichaFin.ValorMovimento > 0M) { funcionario.FichaFinanceiraFuncionario.Add(fichaFin); } } //Valor do IRRF no mês, lanca o evento somente se aliquota for maior que 0 else if (evento.Evento.CodigoCalculo == TypeCodigoCalculo.IRRF) { var aliqIRRF = GetAliquotaIrrf(funcionario); if (aliqIRRF > 0) { decimal vlrIRRF = (funcionario.Funcionario.Salario - ValorInss(funcionario)) * aliqIRRF / 100; vlrIRRF -= GetDeducaoIrrf(funcionario); FichaFinanceiraFuncionario fichaFin = new FichaFinanceiraFuncionario(funcionario, evento.Evento, vlrIRRF, evento.Evento.TipoReferencia, dataRef, aliqIRRF); fichaFin.Evento = evento.Evento; funcionario.FichaFinanceiraFuncionario.Add(fichaFin); } } else //qualquer outro codigo de calculo não tratado especificamente igual os acima... { FichaFinanceiraFuncionario fichaFin = new FichaFinanceiraFuncionario( funcionarioComp: funcionario, evento: evento.Evento, valor: 0M, //valor eh 0 pq é pra ser editado na folha tipoReferencia: evento.Evento.TipoReferencia, dataRef: dataRef, quantidade: GetAliquotaInss(funcionario)); fichaFin.Evento = evento.Evento; funcionario.FichaFinanceiraFuncionario.Add(fichaFin); } } //percorrendo eventos cadastrados para o funcionario foreach (var eventoFunc in funcionario.Funcionario.Eventos) { FichaFinanceiraFuncionario fichaFin = new FichaFinanceiraFuncionario(funcionario, eventoFunc.Evento, eventoFunc.Valor, eventoFunc.Evento.TipoReferencia, dataRef, 0M); fichaFin.Evento = eventoFunc.Evento; funcionario.FichaFinanceiraFuncionario.Add(fichaFin); } return(funcionario.FichaFinanceiraFuncionario); }
/// <summary> /// Obtem o valor do salario conforme o tipo de fechamento da competencia. /// </summary> /// <param name="tipoFechcompetencia"></param> /// <param name="funcionario"></param> /// <returns></returns> public decimal GetSalarioCompetencia(TypeTipoFechamentoFolha tipoFechcompetencia, FuncionarioCompetencia funcionario) { var salarioFechamento = 0M; var func = funcionario.Funcionario; //se for mensal, serao 30 dias trabalhados if (tipoFechcompetencia == TypeTipoFechamentoFolha.Mensal && func.TipoRecebimento == TypeRecebimento.Mensalista) { salarioFechamento = func.Salario; return(salarioFechamento); } //[...] quinzenal, 15 dias... else if (tipoFechcompetencia == TypeTipoFechamentoFolha.Quinzenal && func.TipoRecebimento == TypeRecebimento.Mensalista) { salarioFechamento = (func.Salario / 30) * 15; return(salarioFechamento); } //[...] e semanal 7 dias trabalhados else if (tipoFechcompetencia == TypeTipoFechamentoFolha.Semanal && func.TipoRecebimento == TypeRecebimento.Mensalista) { salarioFechamento = (func.Salario / 30) * 7; return(salarioFechamento); } //se nenhum acima, retorna o salario else { return(func.Salario); } }
public XFrmAdicionarFichaFinanceira(CompetenciaFolha comp, FuncionarioCompetencia func) : this() { this.comp = comp; this.func = func; }