Beispiel #1
0
        /// <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);
            }
        }
Beispiel #2
0
        /// <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;
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        //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);
        }
Beispiel #5
0
        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);
                }
            }
        }