Voltar ao Blog Gestão Empresarial

Férias CLT no Odoo: art. 130, abono pecuniário e terço constitucional

Como o Odoo calcula férias CLT, aplica o terço do art. 7º XVII da CF, controla abono pecuniário do art. 143 e gera o S-2230 do eSocial.

Luis Felipe Miléo

Luis Felipe Miléo

· 6 min de leitura

Férias é um cálculo CLT que parece simples e tem armadilhas em todos os passos: o número de dias varia com faltas (art. 130), tem o terço constitucional, pode ter abono pecuniário, pode ser fracionada (Lei 13.467/2017), e exige aviso prévio de 30 dias. No eSocial, vira S-2230 (afastamento por férias) com regras de prazo e código de motivo específico.

A folha CLT da KMEE (PR #277) implementa o ciclo completo de férias com integração ao hr.leave do Odoo. Este post explica.

A regra básica

Após cada período aquisitivo de 12 meses de trabalho, o colaborador tem direito a férias no período concessivo de 12 meses subsequentes. Se a empresa não conceder dentro do concessivo, paga em dobro (art. 137 CLT).

A duração das férias varia conforme faltas injustificadas no período aquisitivo, segundo o art. 130 da CLT:

Faltas no períodoDireito a férias
Até 5 faltas30 dias corridos
6 a 14 faltas24 dias corridos
15 a 23 faltas18 dias corridos
24 a 32 faltas12 dias corridos
Mais de 32 faltasPerde direito

Faltas justificadas (atestado médico, casamento, óbito de familiar) não contam. Faltas em dia de descanso semanal ou feriado também não.

Terço constitucional

O art. 7º, XVII da CF/88 garante que o trabalhador receba férias remuneradas com pelo menos 1/3 a mais que o salário normal. Esse terço incide sobre:

  • O valor das férias gozadas
  • O valor do abono pecuniário (1/3 dos dias vendidos)
  • O aviso prévio indenizado quando há férias proporcionais
  • Em rescisão: férias vencidas, proporcionais e abono

Abono pecuniário (art. 143)

O colaborador pode “vender” até 1/3 das férias (10 dias se tem direito a 30) em troca de pagamento em dinheiro. A solicitação precisa ser feita até 15 dias antes do término do período aquisitivo, e o empregador é obrigado a aceitar.

O abono é isento de INSS e IRRF (Lei 7.713/88, art. 6º, V) — particularidade que diferencia das férias gozadas, que tributam normalmente.

Fracionamento (Lei 13.467/2017)

A reforma trabalhista permite dividir as férias em até 3 períodos, desde que:

  • Um dos períodos tenha pelo menos 14 dias corridos
  • Os outros dois tenham pelo menos 5 dias corridos cada
  • Haja concordância do empregado

Não pode iniciar férias em dia de descanso ou nos 2 dias que antecedem feriado (art. 134 §3º).

Mapping no Odoo

O Odoo já tem hr.leave (folgas) — a folha CLT estende com tipo dedicado:

class HrLeaveType(models.Model):
    _inherit = "hr.leave.type"
    is_ferias_clt = fields.Boolean()
    cod_motivo_afast_esocial = fields.Char()  # codigo tabela 18

E o hr.leave (solicitação) ganha:

class HrLeave(models.Model):
    _inherit = "hr.leave"
    abono_pecuniario_dias = fields.Integer()
    adiantamento_13 = fields.Boolean()  # paga 1a parcela junto
    periodo_aquisitivo_id = fields.Many2one("hr.period.aquisitivo")
    fracionamento_seq = fields.Integer()  # 1, 2 ou 3

E um modelo dedicado para período aquisitivo:

class HrPeriodAquisitivo(models.Model):
    _name = "hr.period.aquisitivo"
    employee_id = fields.Many2one("hr.employee")
    contract_id = fields.Many2one("hr.contract")
    date_start = fields.Date()
    date_end = fields.Date()
    faltas = fields.Integer(compute="_compute_faltas")
    dias_direito = fields.Integer(compute="_compute_dias_direito")
    state = fields.Selection([
        ("aberto", "Aberto"),
        ("vencido", "Vencido"),
        ("concedido", "Concedido"),
        ("indenizado", "Indenizado em rescisao"),
    ])

O _compute_dias_direito aplica a tabela do art. 130 a partir das faltas; o _compute_faltas consulta hr.attendance ou hr.leave com tipo “falta injustificada”.

Salary rules dedicadas

{
    "code": "FERIAS_GOZ",
    "name": "Ferias gozadas",
    "amount_python_compute": """
result = (contract.wage / 30) * inputs.DIAS_FERIAS.amount
""",
    "condition_python": "payslip.tipo_folha == 'ferias'",
}
{
    "code": "FERIAS_TERCO",
    "name": "1/3 ferias",
    "amount_python_compute": "result = inputs.FERIAS_GOZ.amount / 3",
}
{
    "code": "FERIAS_ABONO",
    "name": "Abono pecuniario",
    "amount_python_compute": """
result = (contract.wage / 30) * inputs.DIAS_ABONO.amount
""",
}
{
    "code": "FERIAS_ABONO_TERCO",
    "name": "1/3 sobre abono",
    "amount_python_compute": "result = inputs.FERIAS_ABONO.amount / 3",
}
{
    "code": "INSS_FERIAS",
    "amount_python_compute": "result = _calcula_inss_ferias(inputs.FERIAS_GOZ.amount + inputs.FERIAS_TERCO.amount)",
}
# Note: nao ha INSS sobre abono nem sobre 1/3 do abono

A separação clara entre rubricas de gozo e abono garante que as incidências corretas sejam aplicadas.

Programação de férias

A KMEE recomenda configurar o aviso prévio de 30 dias como obrigatório no fluxo do hr.leave. O sistema bloqueia a aprovação de férias com início em menos de 30 dias da data atual, exceto com justificativa do RH. Isso evita que gerentes aprovem férias-relâmpago que ferem o art. 135 CLT.

Um relatório mensal lista todos os períodos aquisitivos vencendo nos próximos 60 dias, para o RH antecipar a programação e evitar férias em dobro.

S-2230 no eSocial

Férias é afastamento temporário no eSocial. O evento S-2230 vai:

  • Início das férias — com codMotAfast=15 (férias)
  • Fim das férias — alteração do mesmo evento com dtTermAfast

O Odoo dispara automaticamente:

def action_validate(self):
    super().action_validate()
    if self.holiday_status_id.is_ferias_clt:
        self._criar_s2230_inicio()

Como S-2230 está no escopo do PR #277 com modelagem completa mas transmissão automatizada ainda em validação, hoje o fluxo está semi-automatizado: Odoo gera o XML, o usuário revisa e dispara a transmissão.

Férias em rescisão

Em desligamento, ficam pendentes:

  • Férias vencidas + 1/3 — período aquisitivo já vencido sem ter sido gozado
  • Férias proporcionais + 1/3 — fração do período aquisitivo em curso (com mesma regra de 14 dias para mês cheio que o 13º)

Se o motivo é justa causa (mtvDeslig=03), férias proporcionais não são devidas — apenas as vencidas.

O que pode dar errado

  • Faltas em hr.attendance não migradas — gera férias de 30 dias quando deveria ser menor.
  • Abono com INSS — sistema novo configurando incidência errada na rubrica.
  • Fracionamento em 4 períodos — viola Lei 13.467/2017, gera autuação fiscal.
  • Aviso de 30 dias ignorado — vira passivo no TAC trabalhista.
  • S-2230 sem dtTermAfast quando colaborador retorna — afastamento fica em aberto eternamente no eSocial.

Conclusão

Férias CLT no Odoo une hr.leave, hr.contract e o motor de payslip num fluxo que cobre concessão, abono e rescisão. A folha CLT da KMEE entrega isso em produção desde o Odoo 8.0 e está sendo doada no PR #277.

Veja folha de pagamento Odoo, eSocial Odoo e Odoo vs Senior.

#folha #esocial

Compartilhar

Sobre o autor

Luis Felipe Miléo

Luis Felipe Miléo

Desenvolvedor Odoo · KMEE

Desenvolvedor especializado em localização fiscal e projetos open source no ecossistema Odoo/OCA, com foco em integrações para o mercado latino-americano.

Ver perfil no LinkedIn