/// <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); } }
/// <summary> /// Adicionar uma nova competencia para edição /// </summary> /// <param name="periodo"></param> /// <param name="usuario"></param> public CompetenciaFolha(DateTime periodo, Usuario usuario, TypeTipoFechamentoFolha tipoFechamento) { this.FuncionariosCompetencia = new HashSet <FuncionarioCompetencia>(); this.DataInicialCompetencia = DataUtil.GetDataInicialDoMes(periodo.Month); this.DataFinalCompetencia = DataUtil.GetDataFinalDoMes(periodo.Month); this.Periodo = periodo.ToString("MM/yyyy"); //if(periodo.Month.ToString().Length > 1) //{ // this.Periodo = "0" + this.Periodo; //} this.IdUsuario = usuario.IdUsuario; this.Status = TypeStatusCompetencia.EmEdicao; this.TipoFechamento = tipoFechamento; }
private decimal obtemDiasFolha(TypeTipoFechamentoFolha p_tipoFechamento) { var qtd = 0M; if (p_tipoFechamento == TypeTipoFechamentoFolha.Mensal) { qtd = 30; } else if (p_tipoFechamento == TypeTipoFechamentoFolha.Quinzenal) { qtd = 15; } else if (p_tipoFechamento == TypeTipoFechamentoFolha.Semanal) { qtd = 7; } return(qtd); }
//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); }
public bool ExecutaCalculoFolha(DateTime periodo, object usuario, object tipoFechamento, object grupoEvento, bool considerGrpFunc, CancellationTokenSource cts) { using (var ctx = new BalcaoContext()) { Usuario p_usuario = usuario as Usuario; TypeTipoFechamentoFolha p_tipoFechamento = tipoFechamento != null ? (TypeTipoFechamentoFolha)tipoFechamento : TypeTipoFechamentoFolha.Mensal; GrupoEvento p_grupoEvento = grupoEvento as GrupoEvento; try { server.InsertLogTask(new LogIts(this.itsTask.IdTask, "Buscando funcionarios....")); //busca os funcionarios que irão entrar no calculo da folha var funcionariosFolha = ctx.FuncionarioDao.Where(f => (f.Situacao == TypeSituacaoFuncionario.Admitido || f.Situacao == TypeSituacaoFuncionario.Ferias) && f.DataAdmissao.Date <= periodo) .ToList(); //criando a competencia var competencia = new CompetenciaFolha(DataUtil.GetDataFinalDoMes(periodo), p_usuario, p_tipoFechamento); #region validacoes if (funcionariosFolha.Count == 0) { throw new Exception("Não foram encontrados funcionários ativos na competência selecionada."); } //verifica se ja existe competencia com o mesmo periodo e periodicidade criada. if (IsCompetenciaExistente(competencia)) { throw new Exception("Competencia ja existente!"); } if (p_grupoEvento.EventosGrupo.Count == 0) { throw new GrupoEventoVazio(); } #endregion //Adiciona um funcionario à competencia server.InsertLogTask(new LogIts(this.itsTask.IdTask, "Adicionando funcionarios na competencia em criacao...")); funcionariosFolha.ForEach(fu => { competencia.FuncionariosCompetencia.Add(new FuncionarioCompetencia(fu) { Competencia = competencia }); }); ICollection <FichaFinanceiraFuncionario> teste; foreach (var funcComp in competencia.FuncionariosCompetencia.ToList()) { //verifica se foi cancelada a cada passada no laço VerificaSuspensao(cts.IsCancellationRequested); GrupoEvento grupo; if (considerGrpFunc && funcComp.Funcionario.GrupoDefault != null) { grupo = funcComp.Funcionario.GrupoDefault; } else { grupo = p_grupoEvento; } teste = GerarFichaFinanceira(funcComp, grupo, p_tipoFechamento); teste.ToList().ForEach(ff => { funcComp.FichaFinanceiraFuncionario.Add(ff); }); } //manipulacao do funcionarioCompetencia, dentro do .ForEach foreach (var funcionario in competencia.FuncionariosCompetencia) { //verifica se foi cancelada a cada passada no laço VerificaSuspensao(cts.IsCancellationRequested); foreach (var ficha in funcionario.FichaFinanceiraFuncionario) { if (ficha.Evento.SomaBaseINSS) { funcionario.ValorBaseInss += ficha.ValorMovimento; } if (ficha.Evento.SomaBaseIRRF) { funcionario.ValorBaseIrrf += ficha.ValorMovimento; } funcionario.ValorAliquotaIrrf = GetAliquotaIrrf(funcionario); //zera a referencia ficha.Evento = null; } } server.InsertLogTask(new LogIts(this.itsTask.IdTask, "Gravando dados....")); var rt = ctx.CompetenciaFolhaDao.Save(competencia); server.InsertLogTask(new LogIts(this.itsTask.IdTask, "Finalizando processo...")); server.InsertLogTask(new LogIts(this.itsTask.IdTask, competencia.FuncionariosCompetencia.Count + " funcionarios na competencia criada..")); server.InsertLogTask(new LogIts(this.itsTask.IdTask, "Processo finalizado.")); return(rt); } catch (Exception ex) { throw ex; //XMessageIts.Advertencia(ex.Message); } } }