Wiki / SuperCalculo ~8 min

80 - Adicional de Insalubridade

⚙️ Metadados

  • Código: 80
  • Tipo: Provento
  • INSS: SAL
  • FGTS: SAL
  • IRRF: SAL
  • Natureza eSocial: 1202 - Adicional de insalubridade
  • DSR: Não
  • Médias: Não
  • Impacto Financeiro: Não
  • Impacto Contábil: Sim
  • Sequência: 231

🧮 Regra Geral

ID: 53

  1. Validação Inicial: Verifica se o lançamento existe (Func_ValidarExistenciaLancamento(Lancamento)) e se o percentual é maior que zero (Lancamento.Percentual > 0M).

  2. Aprendiz Menor de 18 Anos: Se o empregado é aprendiz e tem menos de 18 anos, dispara erro.

  3. Divisor Horário: Inicialmente divisor = VG_HsMes (horas mensais de referência).

  4. Montagem da Verba:

    • HoleriteVerba.DescricaoFinal → concatena descrição e percentual.

    • HoleriteVerba.Quantidade ← VG_VlrBaseCalcInsal (valor base já ajustado em alguns casos).

    • HoleriteVerba.Percentual ← VG_PrcAdicInsal (percentual de adicional).

    • HoleriteVerba.ValorReferencia ← arredonda (Func_ArredondamentoPadrao) o produto VG_VlrBaseCalcInsal * VG_PrcAdicInsal.

    • HoleriteVerba.ValorTotal ← arredonda o valor total calculado:

      `ValorTotal = Func_ArredondamentoPadrao(VG_HorasParaVerbasProp * (VG_VlrBaseCalcInsal * VG_PrcAdicInsal) / divisor)`
  5. Memória de Cálculo: Registra um bloco de memória para auditoria (Argumentos.HoleriteVerba.ArgumentosMemoriaCálculo[ArgumentosMemoriaCálculo]).

  • Variáveis Principais:

    • VG_HsMes — Horas mensais de referência.
    • VG_VlrBaseCalcInsal — Valor base de cálculo (já inclui Gratificação de Função em alguns clientes).
    • VG_PrcAdicInsal — Percentual de adicional de insalubridade.
    • VG_HorasParaVerbasProp — Horas remuneradas que participam do cálculo.
    • VG_HsMes / 30 * Dia — Fórmula de ajuste proporcional de divisor.
  • Funções Utilizadas:

    • Func_ValidarExistenciaLancamento
    • SysFunc_ContagemMeses
    • SysFunc_UltimoDiaMes
    • Func_ArredondamentoPadrao
    • SysFunc_Panico

🔔 Eventos/Gatilhos

  • Condição de Ativação:
    • Func_ValidarExistenciaLancamento(Lancamento) == true e Lancamento.Percentual > 0M.
  • Quando Calculado: Sempre que houver lançamento de verba 80 com percentual positivo e lançamento válido.

🔗 Dependências

  • Verbas Relacionadas: Verba 1151 – Gratificação de Função – Comentário indica que, em BrasilService, VG_VlrBaseCalcInsal já inclui o valor da verba 1151.

🧩 Funções

  • Func_ValidarExistenciaLancamento(Lancamento) — valida existência do lançamento.
  • SysFunc_ContagemMeses — calcula idade do empregado em anos.
  • SysFunc_UltimoDiaMes — obtém o último dia do mês corrente.
  • Func_ArredondamentoPadrao — arredonda valores para duas casas decimais (ou conforme regra contábil).
  • SysFunc_Panico — dispara exceção/erro.

🎯 Particularidades por Cliente/Setor

👤 Acal (ID da Fórmula: ?)
  • Divisor de horas: A fórmula de acal leva em conta o número real de dias de trabalho (VG_LimitadorDiasMes). Se o período for completo (30 dias), o divisor resulta em VG_HsMes; se houver menos dias, o divisor diminui, aumentando o valor total (ValorTotal aumenta proporcionalmente). Decimal HorasParaDivisor = VG_HsMes / 30M * VG_LimitadorDiasMes;

  • Variáveis Específicas:

    • VG_LimitadorDiasMes – usada apenas no cálculo de HorasParaDivisor.
👤 BML (ID da Fórmula: ?)
  1. Base de Cálculo: Usa 30 dias como divisor e multiplica pelos dias trabalhados (VG_DiasTrab).
  2. Divisor Ajustado: Não há ajuste de divisor; o divisor sempre é 30 dias.
  • Variáveis Específicas:
    • HoleriteVerba.ValorTotal = Func_ArredondamentoPadrao(HoleriteVerba.ValorReferencia / 30M * VG_DiasTrab);
    • Utiliza VG_DiasTrab, uma variável não presente na regra geral.
👤 Bundy (ID da Fórmula: ?)
  1. Aplica‑se apenas a empregados do tipo Horista, independente do tipo de vínculo.
  2. Cálculo de horas trabalhadas exclusivo: Soma horas de verbas 45, 118, 165, 166 e 266, subtrai horas de verbas 6, 7, 466 e 640, e restringe o resultado ao limite de carga horária mensal do mês (days * (VG_HsMes / 30)).
  3. Cap de horas: Após o cálculo, aplica if (QtdeHsCalcInsal > days * (VG_HsMes / 30)) QtdeHsCalcInsal = days * (VG_HsMes / 30);.
  4. Divisor diferente: Divide pelo total de horas mensais (VG_HsMes) e multiplica pelo QtdeHsCalcInsal (base * percent/100 / VG_HsMes * QtdeHsCalcInsal). 1.Retorno nulo quando horas calculadas são ≤ 0: Retorna null se QtdeHsCalcInsal <= 0;
  5. Mensagem de log: Adiciona AddInfo(“Valor base cálculo insalubridade…”) antes de prosseguir.**
  6. Chamada de DSR: Verifica if (SysFunc_VerbaPossuiDSR(HoleriteVerba.Verba.Codigo) && HoleriteVerba.ValorTotal > 0) e executa Func_DSR.
👤 Crasa
  • Se o cliente for crasa e o último dia do mês não for dia 30, recalcula o divisor proporcionalmente (divisor = VG_HsMes / 30 * DiaDoÚltimoDia).
👤 Employer (ID da Fórmula: ?)
  1. Uso do bloco DSR: Inclui um bloco condicional que cria uma verba “DSR” quando a verba de insalubridade tem valor total maior que zero e o contrato possui DSR (SysFunc_VerbaPossuiDSR).
  2. Cálculo do valor total: O código faz o mesmo cálculo após a primeira divisão, mas inclui, comentado, uma lógica alternativa que utiliza VG_HsTrab. Embora o trecho comentado seja desativado, a presença indica que employer considera Horas de Trabalho (VG_HsTrab) como potencial divisor, diferentemente da regra geral que usa somente a carga horária mensal (VG_HsMes).
  3. Remoção de verificações de aprendiz e idade: Não possui essas validações.
👤 Influx
  • Caso o cliente seja influx, dispara erro (SysFunc_Panico).
👤 JMalucelli (ID da Fórmula: ?)
  1. Cálculo de horas de atestado:
    • DiasAtestado = dias de afastamento por atestado médico (inclui isenção CPP) + dias de atestado lançados em verba 10036.
    • horasatestado = DiasAtestado * (VG_HsMes / VG_DivisorDiasMes).
  2. Condição de corte: Se VG_HorasParaVerbasProp <= 0 ou VG_HorasParaVerbasProp <= horasatestado → regra retorna null (não gera verba).
  3. ValorTotal: ValorReferencia / VG_HsMes * (VG_HorasParaVerbasProp - horasatestado) (subtrai as horas de atestado).
👤 PlasticosPR (ID da Fórmula: ?)
  1. Validação de Aprendiz: A regra geral impede a aplicação de insalubridade a aprendizes menores de 18 anos; PlasticosPR não possui tal verificação.
  2. Cálculo não proporcionalizado: Calcula apenas VG_VlrBaseCalcInsal * (VG_PrcAdicInsal / 100M), sem proporcionalização.
  3. Nenhum ajuste de divisor por dia do mês.
  4. Nenhum uso de variáveis adicionais
👤 Sugisawa (ID da Fórmula: ?)
  1. Condição de sindicato:
    • Se Sindicato.CNPJ for 76684067000154 (SINDESC) ou 77636363000142 (SINDIFAR) a regra usa VG_VlrMesInsalSindesc como ValorReferencia.
    • Caso contrário, aplica a mesma lógica da regra geral (base * percentual).
  2. Eliminação de variáveis não usadas: Não utiliza Empregado.TipoVinculo, Solicitacao.Cliente, nem o cálculo de divisor especial da regra geral.

💡 Proposta de Novo Cálculo

Fórmula proposta (padronizada):

  • Se Tipo = NaoProporcionalizado: ValorFinal = BaseInsalubridade * (Perc / 100)

  • Se Tipo = PorDiasTrabalhados: ValorDiario = (BaseInsalubridade * (Perc / 100)) / 30

    ValorFinal = ValorDiario * VG_DiasTrab

  • Se Tipo = PorHorasHorista: ValorHora = (BaseInsalubridade * (Perc / 100)) / VG_HsMes

    HorasConsideradas = MenorValor(HorasComposicao, TetoHorasMes)

    ValorFinal = ValorHora * HorasConsideradas

  • Se Tipo = PadraoMensalista: ValorHora = (BaseInsalubridade * (Perc / 100)) / ((VG_HsMes / 30) * DivisorDias)

    HorasConsideradas = VG_HorasParaVerbasProp - HorasAtestado

    ValorFinal = ValorHora * HorasConsideradas


INÍCIO Processar_Adicional_Insalubridade_Geral (DadosEmpregado, DadosLancamento, ParametrosSistema)

1. Validação de Ativação e Lançamento de Alíquota

SE Func_ValidarExistenciaLancamento(DadosLancamento) == FALSE OU DadosLancamento.Percentual <= 0 ENTÃO RETORNAR FIM SE

PerfilConfig = ParametrosSistema.ConfiguracaoVerba.ObterPerfilInsalubridade(HoleriteVerba.Verba.Codigo)

2. Trava de Compliance Legal (Substitui os Bloqueios Hardcoded e Exceções Influx)

SE PerfilConfig.BloquearClienteIntegral == TRUE ENTÃO RegistrarCriticaAuditoria(DadosEmpregado.Id, “Cálculo de Insalubridade expressamente desativado para as regras deste cliente.”) RETORNAR FIM SE

IdadeEmpregado = SysFunc_ContagemMeses(DadosEmpregado.DataNascimento, ParametrosSistema.Global.DataReferencia) / 12 SE IdadeEmpregado < 18 E DadosEmpregado.Categoria == EnumCategoria.Aprendiz E PerfilConfig.PermitirAprendizMenor18 == FALSE ENTÃO RegistrarCriticaAuditoria(DadosEmpregado.Id, “CRÍTICA DE COMPLIANCE: Proibido trabalho insalubre para menores de 18 anos (CLT Art. 405).”) RETORNAR FIM SE

Filtro de elegibilidade por tipo de contrato (Requisito Bundy - Apenas Horistas) SE PerfilConfig.FiltroTipoEmpregado == EnumTipoEmpregado.ApenasHoristas E DadosEmpregado.TipoContrato != EnumTipoContrato.Horista ENTÃO RETORNAR FIM SE

3. Definição Dinâmica da Base de Cálculo (Mínimo vs. Sindicato vs. Integrações)

BaseInsalubridade = 0.0000

SE PerfilConfig.OrigemBase == EnumOrigemBaseInsal.TabelaUnificadaSindicato ENTÃO // Requisito IMCP / Sugisawa: Busca valor fixado por CCT na tabela do Sindicato do Contrato BaseInsalubridade = MóduloSindicato.ObterValorBaseInsalubridade(DadosEmpregado.IdSindicato) SENÃO // Padrão Geral: Utiliza a variável global de base de insalubridade do sistema BaseInsalubridade = ParametrosSistema.Global.VG_VlrBaseCalcInsal FIM SE

Checkbox para incluir Rubricas Complementares na Base (Requisito BrasilService - Ex: Gratificação 1151) SE PerfilConfig.IncluirGratificacaoNaBase == TRUE ENTÃO ValorGratificacao = MóduloLancamentos.ObterValorCalculado(DadosEmpregado.Id, PerfilConfig.IdVerbaGratificacao) BaseInsalubridade = BaseInsalubridade + ValorGratificacao FIM SE

PercentualAdicional = DadosLancamento.Percentual / 100.0000 ValorReferenciaBase = BaseInsalubridade * PercentualAdicional

4. Modificadores de Proporcionalidade, Jornada e Abatimentos de Atestado

ValorFinalCalculado = 0.0000

SE PerfilConfig.ModoProporcionalidade == EnumProporcionalidade.NaoProporcionalizado ENTÃO // Requisito PlasticosPR: Aplica o valor cheio seco, sem cortes diários ValorFinalCalculado = ValorReferenciaBase

SENÃO_SE PerfilConfig.ModoProporcionalidade == EnumProporcionalidade.PorHorasHorista ENTÃO // Requisito Bundy: Apura horas trabalhadas via composição de verbas de ponto QtdHorasEfetivas = MóduloPonto.CalcularHorasInsalubresComposicao(DadosEmpregado.Id, PerfilConfig.VerbasAditivas, PerfilConfig.VerbasDedutivas) TetoHorasMes = MóduloCalendario.ObterDiasMesCivil(ParametrosSistema.Global.DataReferencia) * (ParametrosSistema.Global.VG_HsMes / 30.0000)

Aplica o CAP de horas mensais configurado QtdeHsCalcInsal = Math.Min(QtdHorasEfetivas, TetoHorasMes)

SE QtdeHsCalcInsal <= 0 ENTÃO RETORNAR FIM SE

DivisorHoras = ParametrosSistema.Global.VG_HsMes ValorFinalCalculado = (ValorReferenciaBase / DivisorHoras) * QtdeHsCalcInsal

SENÃO_SE PerfilConfig.ModoProporcionalidade == EnumProporcionalidade.PorDiasTrabalhados ENTÃO Requisito BML: Base comercial dividida por 30 multiplicada pelos dias ativos ValorFinalCalculado = (ValorReferenciaBase / 30.0000) * ParametrosSistema.Global.VG_DiasTrab

SENÃO // Padrão Geral / Acal / Crasa / JMalucelli (Base Mensalista) Definição do Divisor de acordo com a parametrização do calendário DivisorDias = 30.0000 SE PerfilConfig.TipoDivisorCalendario == EnumDivisorCalendario.DiasReaisMesCivil ENTÃO DivisorDias = MóduloCalendario.ObterDiasMesCivil(ParametrosSistema.Global.DataReferencia) // Crasa (Último dia do mês) SENÃO_SE PerfilConfig.TipoDivisorCalendario == EnumDivisorCalendario.LimitadorDiasAcal ENTÃO DivisorDias = ParametrosSistema.Global.VG_LimitadorDiasMes // Acal FIM SE

Apuração de horas/dias de direito subtraindo afastamentos por atestado (Requisito JMalucelli) HorasDireito = ParametrosSistema.Global.VG_HorasParaVerbasProp

SE PerfilConfig.AbaterAtestadosMedicos == TRUE ENTÃO DiasAtestado = MóduloAfastamento.ObterDiasAtestadoCompetencia(DadosEmpregado.Id) HorasAtestado = DiasAtestado * (ParametrosSistema.Global.VG_HsMes / DivisorDias)

SE HorasDireito <= 0 OU HorasDireito <= HorasAtestado ENTÃO RETORNAR FIM SE HorasDireito = HorasDireito - HorasAtestado FIM SE

DivisorHorarioFinal = (ParametrosSistema.Global.VG_HsMes / 30.0000) * DivisorDias SE DivisorHorarioFinal > 0 ENTÃO ValorFinalCalculado = (ValorReferenciaBase / DivisorHorarioFinal) * HorasDireito FIM SE FIM SE

5. Consolidação Contábil no Holerite e Disparo Automático de DSR Reflexo

HoleriteVerba.Quantidade = BaseInsalubridade HoleriteVerba.Percentual = DadosLancamento.Percentual HoleriteVerba.ValorReferencia = Func_ArredondamentoPadrao(ValorReferenciaBase) HoleriteVerba.ValorTotal = Func_ArredondamentoPadrao(ValorFinalCalculado)

SE PerfilConfig.ConcatenarPercentualDescricao == TRUE ENTÃO HoleriteVerba.DescricaoCustomizada = HoleriteVerba.Verba.Descricao + ” ” + DadosLancamento.Percentual.ToString(“F2”) + ”%” FIM SE

Tratamento Automatizado de Reflexo de DSR (Requisito Bundy / Employer) SE HoleriteVerba.ValorTotal > 0 E PerfilConfig.GerarDSRAutomatico == TRUE ENTÃO Func_DispararDSRReflexo(HoleriteVerba.Verba.Codigo, HoleriteVerba.ValorTotal) FIM SE

FIM


Impactos

  • Migração das bases fixas de sindicatos para tabelas de parâmetros.
  • Necessidade de definir em tela o comportamento de proporcionalidade (se abate atestados, se usa dias trabalhados ou horas).

Benefícios

  • Autonomia: Usuário define se a insalubridade segue o salário mínimo ou base sindical em tela.
  • Segurança Jurídica: Padronização da trava de menores de 18 anos para conformidade legal.
  • Manutenibilidade: Eliminação de blocos de código específicos para clientes (Acal, BML, Bundy, etc).

Parametrizações Propostas para Reestruturação

  1. Configuração de Base de Cálculo

    • Opção para selecionar: Salário Mínimo Federal, Piso da CCT, ou Valor Fixo por Sindicato.
    • Checkbox para “Incluir Gratificação de Função na Base” (Cenário BrasilService).
  2. Definição de Divisor e Proporcionalidade

    • Seletor de Divisor: Fixo 30 dias, Dias Civis do Mês ou Carga Horária Mensal.
    • Configuração de Abatimentos: Opção para deduzir horas de atestado (Cenário JMalucelli) ou considerar apenas dias trabalhados (Cenário BML).
  3. Regras de Elegibilidade e Trava

    • Parâmetro global: “Permitir Insalubridade para Aprendiz Menor de 18 anos” (Sim/Não).
    • Filtro por Categoria: Permitir cálculo apenas para Horistas (Cenário Bundy).
  4. Automação de Reflexos

    • Flag “Gerar DSR Automaticamente” sobre o valor da verba 80.

Clientes com mesma regra

A conversão da regra em comportamento puramente paramétrico através de chaves de controle na interface elimina 100% dos scripts proprietários e centraliza as auditorias da folha.

  • Acal: Assistida integralmente ao selecionar o “Limitador de Dias do Fechamento” na Seção 2, calculando o divisor com base na variável VG_LimitadorDiasMes.
  • BML: Atendida ao selecionar a opção “Proporcional por Dias Trabalhados” (Seção 2), que fixa o divisor em 30 dias e multiplica diretamente pelas horas e dias ativos informados em folha.
  • Bundy: Amparada pelo modelo “Proporcional por Composição de Horas do Ponto” (Seção 2). A listagem de verbas aditivas e dedutivas é inserida na Seção 3 junto com a ativação da trava de teto mensal, enquanto o gatilho de reflexo de DSR (Seção 5) substitui a chamada direta de função no código.
  • Crasa: Totalmente integrada selecionando a opção de divisor por “Dias Reais Mês Civil” (Seção 2), forçando o cálculo automático da jornada com base no calendário civil.
  • Employer: Atendida de forma transparente pela desativação das checagens de aprendiz (Seção 4) e pela flag ativa de reflexo automático de DSR (Seção 5).
  • IMCP e Sugisawa: Unificadas sob a rota da Seção 1. Ao parametrizar a busca por “Tabela Unificada Sindicato”, o motor extingue as validações de strings de CNPJ em C# e captura o valor diretamente da tabela associativa da CCT.
  • Influx: Isolada de forma segura pela flag [X] Bloquear integralmente o cálculo desta verba para este cliente (Seção 4).
  • JMalucelli: Coberta integralmente pela ativação da flag [X] Abater dias/horas de Atestado Médico (Seção 2), que executa a dedução de afastamentos antes da distribuição do provento.
  • PlasticosPR: Atendida selecionando o modelo “Não Proporcionalizado” (Seção 2), que garante o cálculo direto e integral do adicional sem reduções por dias do mês.

Status Documental

  • Status: Documentada
  • Origem: export do Notion + catálogo da wiki
  • Fonte rastreável: 30dc75ea2e838172ae95d4848cd54690

Voltar ao catálogo

Digite para pesquisar...

Scroll para zoom · Esc para fechar

⌨️ Atalhos de teclado
Navegação
Ctrl K Pesquisar na wiki
Ctrl F Buscar na página
? Ver atalhos
Visualização
Ctrl Shift F Modo foco
A+ / A− Tamanho da fonte
Ctrl D Alternar tema
Ações
Ctrl B Favoritar página
Esc Fechar dialogs