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
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íodo | Direito a férias |
|---|---|
| Até 5 faltas | 30 dias corridos |
| 6 a 14 faltas | 24 dias corridos |
| 15 a 23 faltas | 18 dias corridos |
| 24 a 32 faltas | 12 dias corridos |
| Mais de 32 faltas | Perde 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
dtTermAfastquando 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.
Sobre o autor
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 LinkedInArtigos relacionados
Open Finance regulado vs APIs proprietárias: qual usar para cada caso
7 de jul. de 2026
Gestão EmpresarialDDA no Odoo: contas a pagar 100% automatizadas
30 de jun. de 2026
Gestão EmpresarialTOTVS está descontinuando sua API bancária — Odoo é a alternativa neutra
9 de jun. de 2026