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
-
Validação Inicial: Verifica se o lançamento existe (
Func_ValidarExistenciaLancamento(Lancamento)) e se o percentual é maior que zero (Lancamento.Percentual > 0M). -
Aprendiz Menor de 18 Anos: Se o empregado é aprendiz e tem menos de 18 anos, dispara erro.
-
Divisor Horário: Inicialmente
divisor = VG_HsMes(horas mensais de referência). -
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 produtoVG_VlrBaseCalcInsal * VG_PrcAdicInsal. -
HoleriteVerba.ValorTotal← arredonda o valor total calculado:`ValorTotal = Func_ArredondamentoPadrao(VG_HorasParaVerbasProp * (VG_VlrBaseCalcInsal * VG_PrcAdicInsal) / divisor)`
-
-
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_ValidarExistenciaLancamentoSysFunc_ContagemMesesSysFunc_UltimoDiaMesFunc_ArredondamentoPadraoSysFunc_Panico
🔔 Eventos/Gatilhos
- Condição de Ativação:
Func_ValidarExistenciaLancamento(Lancamento) == trueeLancamento.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: ?)
- Base de Cálculo: Usa 30 dias como divisor e multiplica pelos dias trabalhados (VG_DiasTrab).
- 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: ?)
- Aplica‑se apenas a empregados do tipo Horista, independente do tipo de vínculo.
- 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)).
- Cap de horas: Após o cálculo, aplica if (QtdeHsCalcInsal > days * (VG_HsMes / 30)) QtdeHsCalcInsal = days * (VG_HsMes / 30);.
- 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;
- Mensagem de log: Adiciona AddInfo(“Valor base cálculo insalubridade…”) antes de prosseguir.**
- 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: ?)
- 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).
- 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).
- 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: ?)
- 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).
- Condição de corte: Se VG_HorasParaVerbasProp <= 0 ou VG_HorasParaVerbasProp <= horasatestado → regra retorna null (não gera verba).
- ValorTotal: ValorReferencia / VG_HsMes * (VG_HorasParaVerbasProp - horasatestado) (subtrai as horas de atestado).
👤 PlasticosPR (ID da Fórmula: ?)
- 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.
- Cálculo não proporcionalizado: Calcula apenas VG_VlrBaseCalcInsal * (VG_PrcAdicInsal / 100M), sem proporcionalização.
- Nenhum ajuste de divisor por dia do mês.
- Nenhum uso de variáveis adicionais
👤 Sugisawa (ID da Fórmula: ?)
- Condição de sindicato:
- Se
Sindicato.CNPJfor 76684067000154 (SINDESC) ou 77636363000142 (SINDIFAR) a regra usaVG_VlrMesInsalSindesccomoValorReferencia. - Caso contrário, aplica a mesma lógica da regra geral (base * percentual).
- Se
- 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
-
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).
-
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).
-
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).
-
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