47 - Horas de Paralisação
⚙️ Metadados
- Código: 47
- Tipo: Provento
- INSS: SAL
- FGTS: SAL
- IRRF: SAL
- Natureza eSocial: 1000 - Salário, vencimento, soldo
- DSR: Não
- Médias: Não
- Impacto Financeiro: Não
- Impacto Contábil: Sim
- Sequência: 2
🧮 Regra Geral
-
Lógica de Cálculo:
- A verba é calculada apenas se houver um lançamento (
Lancamento) para ela, validado pela funçãoFunc_ValidarExistenciaLancamento. - É calculado um
LimiteValor47como o valor do salário nominal (VG_VlrSalNom) dividido pelas horas do mês (VG_HsMes), multiplicado pelas horas trabalhadas (VG_HsTrab), com arredondamento padrão. - Cenário 1 (Lançamento apenas de Quantidade): Se
Lancamento.Quantidadefor maior que zero eLancamento.ValorTotalfor zero, aHoleriteVerba.Quantidaderecebe o valor deLancamento.Quantidade. OHoleriteVerba.ValorTotalé calculado como o salário nominal (VG_VlrSalNom) dividido pelas horas do mês (VG_HsMes), multiplicado pelaLancamento.Quantidade, com arredondamento padrão. - Cenário 2 (Lançamento apenas de Valor): Se
Lancamento.Quantidadefor zero eLancamento.ValorTotalfor maior que zero, aHoleriteVerba.ValorTotalrecebe o valor deLancamento.ValorTotal, com arredondamento padrão. - Cenário 3 (Lançamento de Quantidade e Valor): Se
Lancamento.QuantidadeeLancamento.ValorTotalforem maiores que zero, aHoleriteVerba.Quantidaderecebe o valor deLancamento.Quantidadee oHoleriteVerba.ValorTotalrecebe o valor deLancamento.ValorTotal, com arredondamento padrão. - Validação Final: Após o cálculo, se o
HoleriteVerba.ValorTotalexceder oLimiteValor47ou se as horas trabalhadas (VG_HsTrab) forem zero, oHoleriteVerba.ValorTotalé zerado e um erro de pânico (SysFunc_Panico) é disparado, indicando que o valor da verba excede o salário do mês.
- A verba é calculada apenas se houver um lançamento (
-
Fórmula matemática:
LimiteValor47 = Func_ArredondamentoPadrao((VG_VlrSalNom / VG_HsMes) * VG_HsTrab)ValorTotal (se Quantidade) = Func_ArredondamentoPadrao((VG_VlrSalNom / VG_HsMes) * Lancamento.Quantidade)ValorTotal (se Valor) = Func_ArredondamentoPadrao(Lancamento.ValorTotal)
-
Variáveis Utilizadas:
Lancamento.QuantidadeLancamento.ValorTotalVG_VlrSalNom(Valor do Salário Nominal)VG_HsMes(Horas do Mês)VG_HsTrab(Horas Trabalhadas)HoleriteVerba.QuantidadeHoleriteVerba.ValorTotal.
-
Condições Especiais:
if (Func_ValidarExistenciaLancamento(Lancamento) == true): A verba só é processada se houver um lançamento.if (Lancamento.Quantidade > 0M && Lancamento.ValorTotal == 0M): Condição para cálculo baseado apenas na quantidade.else if (Lancamento.Quantidade == 0M && Lancamento.ValorTotal > 0M): Condição para cálculo baseado apenas no valor.else if (Lancamento.Quantidade > 0M && Lancamento.ValorTotal > 0M): Condição para cálculo baseado em quantidade e valor.if (HoleriteVerba.ValorTotal > LimiteValor47 || VG_HsTrab == 0): Validação para zerar a verba e emitir erro se o valor exceder o limite ou se não houver horas trabalhadas.
🔗 Dependências
- Verbas Relacionadas: Verbas 20 e 45.
- Tipo de Relação: Geração/Afetação. O comentário no código indica que esta verba afeta o valor das verbas 20 e 45, sugerindo que o valor da verba 47 pode ser um insumo ou condição para o cálculo dessas outras verbas.
🧩 Funções
Func_ValidarExistenciaLancamento(Lancamento): Verifica se existe um lançamento para a verba no holerite atual.Func_ArredondamentoPadrao(decimal): Arredonda um valor decimal para o padrão de precisão do sistema.Argumento(object): Utilizada para registrar valores na memória de cálculo da verba.EscreverMemoria(string, string): Formata e registra a memória de cálculo detalhada da verba.SysFunc_Panico(string): Interrompe o processo de cálculo e exibe uma mensagem de erro crítica.
💡 Proposta de Novo Cálculo
Fórmula proposta (padronizada):
DivisorEfetivo = SE(SobrescreverDivisor == Verdadeiro, DivisorSobrescrito, HorasMes)
LimiteValor47 = Func_ArredondamentoPadrao((SalarioNominal / DivisorEfetivo) * HorasTrabalhadas)
ValorBruto = SE(Qtd > 0 E VlrTotal == 0, (SalarioNominal / DivisorEfetivo) * Qtd, VlrTotal)
ValorValidado = SE(ValidarTeto == Verdadeiro E (ValorBruto > LimiteValor47 OU HorasTrabalhadas == 0), 0, ValorBruto)
ValorFinal47 = Func_ArredondamentoPadrao(MAX(PisoMinimo, MIN(ValorValidado, SE(PossuiTeto == Verdadeiro, TetoMaximo, ValorValidado))))
1. Filtros de Elegibilidade e Isenções (Piso Seguro)
SE Config.PossuiDataVigenciaInicio E Solicitacao.DataReferencia < Config.DataVigenciaInicio ENTÃO RETORNAR NULO FIM_SE
SE Solicitacao.TipoProcesso == PROVISOES E NAO Config.PermitirCalculoEmProvisoes ENTÃO RETORNAR NULO FIM_SE
SE NAO Config.TiposFolhaPermitidos.Contem(Solicitacao.TipoFolha) ENTÃO RETORNAR NULO FIM_SE
SE Config.ExigirFiltroElegibilidadeEmpresa E NAO Config.EmpresasHabilitadas.Contem(Empregador.Id) ENTÃO RETORNAR NULO FIM_SE
SE NAO Config.TiposPagamentoPermitidos.Contem(Empregado.TipoPagamento) ENTÃO RETORNAR NULO FIM_SE
2. Determinação da Base de Cálculo, Lançamentos e Valoração
LancamentoManual = Holerite.ObterLancamento(“47”)
SE NAO Func_ValidarExistenciaLancamento(LancamentoManual) ENTÃO RETORNAR NULO FIM_SE
Proteção do Divisor Mensal e Salário Nominal DivisorAplicado = SE(Config.SobrescreverDivisorHoras, Config.ValorDivisorSobrescrito, Empregado.HorasMes) SE DivisorAplicado <= 0.0 ENTÃO DivisorAplicado = 220.0 FIM_SE
BaseSalarioNominal = Holerite.ObterValorBase(Config.IdentificadorBaseCalculo) SE BaseSalarioNominal <= 0.0 ENTÃO BaseSalarioNominal = Empregado.SalarioNominal FIM_SE
ValorHoraSalario = BaseSalarioNominal / DivisorAplicado HorasTrabalhadas = Empregado.HorasTrabalhadas
Tratamento de Horas Trabalhadas Zeradas (Substituição de SysFunc_Panico por Descarte/Alerta Seguro) SE HorasTrabalhadas <= 0.0 ENTÃO SE Config.TratarEntradaInvalidaComoAlerta ENTÃO GravarAlertaLog(“MENSAGEM_HORAS_TRABALHADAS_ZERO_47”, “Impossível calcular Horas de Paralisação: Empregado sem horas trabalhadas registradas no mês.”) FIM_SE RETORNAR NULO FIM_SE
Cálculo do Limite Máximo Permitido LimiteValorMaximo = Func_ArredondamentoPadrao(ValorHoraSalario * HorasTrabalhadas)
Avaliação dos Cenários de Lançamento (Quantidade vs Valor) QuantidadeCalculada = 0.0 ValorBrutoCalculado = 0.0
SE LancamentoManual.Quantidade > 0.0 E LancamentoManual.ValorTotal == 0.0 ENTÃO Cenário 1: Apuração por Quantidade Lançada QuantidadeCalculada = LancamentoManual.Quantidade ValorBrutoCalculado = ValorHoraSalario * QuantidadeCalculada
SENÃO SE LancamentoManual.Quantidade == 0.0 E LancamentoManual.ValorTotal > 0.0 ENTÃO Cenário 2: Apuração por Valor Lançado Direto QuantidadeCalculada = 0.0 ValorBrutoCalculado = LancamentoManual.ValorTotal
SENÃO SE LancamentoManual.Quantidade > 0.0 E LancamentoManual.ValorTotal > 0.0 ENTÃO Cenário 3: Apuração por Quantidade e Valor Lançados QuantidadeCalculada = LancamentoManual.Quantidade ValorBrutoCalculado = LancamentoManual.ValorTotal
SENÃO RETORNAR NULO FIM_SE
3. Aplicação de Limites, Tetos, Pisos e Validação de Estouro (Eliminação do SysFunc_Panico)
SE Config.ValidarTetoSalarioMes E ValorBrutoCalculado > LimiteValorMaximo ENTÃO SE Config.AcaoEstouroLimite == “BLOQUEAR_E_ALERTAR” ENTÃO GravarAlertaLog(“MENSAGEM_EXCEDE_SALARIO_47”, String.Format(“Valor das Horas de Paralisação (R$ {0}) excede o limite do salário do mês (R$ {1}). Verba desconsiderada.”, ValorBrutoCalculado.ToString(“N2”), LimiteValorMaximo.ToString(“N2”))) RETORNAR NULO SENÃO SE Config.AcaoEstouroLimite == “CORRAGEM_PARA_TETO” ENTÃO ValorBrutoCalculado = LimiteValorMaximo FIM_SE FIM_SE
SE Config.PossuiTetoMaximo E ValorBrutoCalculado > Config.ValorTetoMaximo ENTÃO ValorBrutoCalculado = Config.ValorTetoMaximo SENÃO SE Config.PossuiPisoMinimo E ValorBrutoCalculado < Config.ValorPisoMinimo ENTÃO ValorBrutoCalculado = Config.ValorPisoMinimo FIM_SE
ValorFinal47 = Func_ArredondamentoPadrao(ValorBrutoCalculado)
SE ValorFinal47 <= 0.0 E NAO Config.GravarVerbaZerada ENTÃO RETORNAR NULO FIM_SE
4. Gravação de Campos, Acumuladores Fiscais e Insumos para Verbas Correlacionadas (Verbas 20 e 45)
RubricaHorasParalisacao = CriarVerbaHoleriteBO(“47”, “Horas de Paralisação”) RubricaHorasParalisacao.TipoVerba = “P”
SE QuantidadeCalculada > 0.0 ENTÃO RubricaHorasParalisacao.Quantidade = Func_ArredondamentoPadrao(QuantidadeCalculada) FIM_SE
RubricaHorasParalisacao.ValorTotal = ValorFinal47
Disparo de Base de Insumo para Impactar Verbas Relacionadas (Verbas 20 e 45) Holerite.AcumularBase(“BASE_HORAS_PARALISACAO”, ValorFinal47) Holerite.AcumularBase(“QTD_HORAS_PARALISACAO”, QuantidadeCalculada)
Encargos Sociais Conforme Metadados (INSS: SAL, FGTS: SAL, IRRF: SAL) SE Config.TributarINSS ENTÃO Holerite.AcumularBase(“BASE_INSS_FOLHA”, ValorFinal47) SENÃO Holerite.AcumularBase(“BASE_INSS_ISENTA_FOLHA”, ValorFinal47) FIM_SE
SE Config.TributarFGTS ENTÃO Holerite.AcumularBase(“BASE_FGTS_FOLHA”, ValorFinal47) SENÃO Holerite.AcumularBase(“BASE_FGTS_ISENTA_FOLHA”, ValorFinal47) FIM_SE
SE Config.TributarIRRF ENTÃO Holerite.AcumularBase(“BASE_IRRF_FOLHA”, ValorFinal47) SENÃO Holerite.AcumularBase(“BASE_IRRF_ISENTA_FOLHA”, ValorFinal47) FIM_SE
Repercussão de Reflexos: DSR e Médias (DSR: Não, Médias: Não conforme Metadados) SE Config.ComporDSR E SysFunc_VerbaPossuiDSR(“47”) ENTÃO Holerite.AcumularBase(“BASE_HORAS_VARIAVEIS_DSR”, ValorFinal47) Func_DSR(“47”, “DSR s/ Horas de Paralisação”, “47”, ValorFinal47, RubricaHorasParalisacao, VERDADEIRO) FIM_SE
SE Config.IncorporaMedias ENTÃO Holerite.AcumularBase(“BASE_MEDIAS_13”, ValorFinal47) Holerite.AcumularBase(“BASE_MEDIAS_FERIAS”, ValorFinal47) Holerite.AcumularBase(“BASE_MEDIAS_RESCISAO”, ValorFinal47) FIM_SE
Holerite.ListaHoleriteVerba.Adicionar(RubricaHorasParalisacao)
Registro em memória de cálculo detalhada Argumento(“SALARIO_NOMINAL_47”, BaseSalarioNominal) Argumento(“DIVISOR_APLICADO_47”, DivisorAplicado) Argumento(“HORAS_TRABALHADAS_47”, HorasTrabalhadas) Argumento(“LIMITE_MAXIMO_47”, LimiteValorMaximo) Argumento(“VALOR_FINAL_47”, ValorFinal47)
EscreverMemoria(“HORAS_PARALISACAO”, String.Format(“Horas de Paralisação: Salário Nominal R$ {0} | Divisor {1} | Qtd {2}h | Limite Mês R$ {3} | Valor Final R$ {4}”, BaseSalarioNominal.ToString(“N2”), DivisorAplicado.ToString(“N2”), QuantidadeCalculada.ToString(“N2”), LimiteValorMaximo.ToString(“N2”), ValorFinal47.ToString(“N2”)))
RETORNAR RubricaHorasParalisacao
FIM
Parametrizações Propostas para Reestruturação
1. REGRAS DE ENTRADA E FILTROS DE ELEGIBILIDADE
Tipos de Folha Permitidos …: [X] Regular [ ] Férias [X] Rescisão [ ] Provisões
Tipos de Pagamento Elegíveis …: [X] Mensalista [X] Horista [ ] Comissionista
Modo de Entrada de Dados …: [ Permitir Quantidade, Valor ou Ambos v ]
Tratamento para Dados/Mês Inválidos …: [ Gravar Alerta no Log e Descartar Verba v ]
[ ] Exigir Filtro de Elegibilidade por Empresa / Estabelecimento / Cliente
2. DIRETRIZES DE CÁLCULO E SEGURANÇA
Identificador da Base de Cálculo …: [ SALARIO_NOMINAL v ]
[ ] Sobrescrever Divisor Mensal Padrão
Valor do Divisor Sobrescrito …: [ 220,00 ]
[X] Validar Limite do Salário do Mês (Limite = Horas Trabalhadas * Salário Hora)
Ação ao Estourar Limite …: [ Bloquear Verba e Registar Alerta (Sem Pânico) v ]
3. LIMITES E REPERCUSSÕES
[ ] Compor DSR (Descanso Semanal Remunerado)
[ ] Incorporar em Médias (13º, Férias e Rescisão)
[X] Alimentar Base de Insumo para Verbas Dependentes (Verbas 20 e 45)
[ ] Possui Teto Máximo R$ …: [ 0,00 ]
[ ] Possui Piso Mínimo R$ …: [ 0,00 ]
[ ] Gravar Verba quando Valor Final for Zero
4. ENCARGOS E NATUREZA ESOCIAL
Natureza eSocial …: [ 1000 - Salário, vencimento, soldo v ]
Incidência INSS …: [ Salário / Tributado Integral (SAL) ]
Incidência FGTS …: [ Salário / Tributado Integral (SAL) ]
Incidência IRRF …: [ Salário / Tributado Integral (SAL) ]
Afeta DSR …: [ ] Sim [X] Não (Conforme Metadados)
Incorpora Médias …: [ ] Sim [X] Não (Conforme Metadados)
Status Documental
- Status: Documentada
- Origem: export do Notion + catálogo da wiki
- Fonte rastreável:
30dc75ea2e838139a8f0c114ac6bf45e