13º salário no Odoo: 1ª e 2ª parcelas com cálculo correto
Como o Odoo calcula 1ª e 2ª parcela do 13º salário, aplica INSS e IRRF apenas na 2ª, e gera os eventos S-1200 do eSocial em competência separada.
Luis Felipe Miléo
13º salário é o cálculo de folha que mais gera dúvida em sistemas novos: ele tem competência própria no eSocial, divide-se em duas parcelas com regras diferentes, e tem incidências de INSS e IRRF que só aparecem na segunda. Errar 13º vira passivo trabalhista cobrável e ainda derruba o S-1299 da competência anual no eSocial.
A folha CLT da KMEE (PR #277) implementa cálculo das duas parcelas conforme CLT e Lei 4.090/1962, com geração de S-1200 em competência 13. Este post explica.
A regra básica
Direito do trabalhador CLT a partir de 15 dias de trabalho no mês: 1/12 de um salário por mês trabalhado no ano. Frações superiores a 14 dias contam como mês cheio. Quem trabalhou de janeiro a dezembro recebe um salário; quem entrou em julho recebe 6/12.
A base de cálculo é a remuneração de dezembro (ou da rescisão), incluindo média de variáveis (horas extras, comissões, adicionais). É aqui que muito sistema erra: usa só o salário base e esquece da média.
1ª parcela — adiantamento
Pagamento entre 1º de fevereiro e 30 de novembro. Na prática a maioria das empresas paga em novembro, mas pode ser quebrado em qualquer mês desse intervalo. O valor é 50% do salário do mês anterior ao pagamento (não 50% do 13º estimado — é literalmente meio salário).
Particularidades:
- Sem desconto de INSS
- Sem desconto de IRRF
- Sai pela folha mas não vai para o S-1200 da competência mensal — vai num S-1200 separado de competência 13
- O empregado pode pedir para receber junto com as férias (art. 4º, Decreto 57.155/65) — opção exercida no aniversário do contrato
2ª parcela
Pagamento até 20 de dezembro. Aqui é onde a complexidade aparece:
Valor 2a parcela = (Salario Dezembro + medias variaveis) - 1a parcela paga - INSS - IRRF
O INSS é calculado sobre o valor cheio do 13º (não sobre só a 2ª parcela), com tabela progressiva normal. O IRRF segue a regra tributação exclusiva: também sobre o valor cheio, mas com tabela mensal própria, separada da tributação do salário de dezembro. Isso é uma das poucas situações de cálculo separado de IR no Brasil.
Mapping no Odoo
A hr.payslip ganha um campo de tipo:
class HrPayslip(models.Model):
_inherit = "hr.payslip"
tipo_folha = fields.Selection([
("normal", "Mensal"),
("13_1", "13o Primeira Parcela"),
("13_2", "13o Segunda Parcela"),
("ferias", "Ferias"),
("rescisao", "Rescisao"),
("complementar", "Complementar"),
])
competencia_esocial = fields.Char(compute="_compute_competencia_esocial")
Para o 13º a competencia_esocial retorna "2026-13" (em vez de "2026-12"), o que dispara a montagem de um S-1200 em competência anual separado.
Salary rules dedicadas
# 13o calculado no fechamento de dezembro/rescisao
{
"code": "DEC_TER",
"name": "13o salario",
"amount_python_compute": """
result = (contract.wage + worked_days.MEDIA_VARIAVEIS.amount) * (worked_days.MESES_13.number_of_days / 12)
""",
"appears_on_payslip": True,
}
# 1a parcela (adiantamento)
{
"code": "DEC_TER_1",
"name": "13o 1a parcela",
"amount_python_compute": "result = inputs.SALARIO_BASE.amount * 0.50",
"condition_python": "payslip.tipo_folha == '13_1'",
}
# 2a parcela
{
"code": "DEC_TER_2",
"name": "13o 2a parcela",
"amount_python_compute": "result = inputs.DEC_TER.amount - inputs.DEC_TER_1.amount",
"condition_python": "payslip.tipo_folha == '13_2'",
}
# INSS sobre 13o (so na 2a parcela)
{
"code": "INSS_13",
"amount_python_compute": "result = _calcula_inss_13(payslip)",
"condition_python": "payslip.tipo_folha == '13_2'",
}
# IRRF sobre 13o (tabela mensal, separado do salario)
{
"code": "IRRF_13",
"amount_python_compute": "result = _calcula_irrf_13(payslip)",
"condition_python": "payslip.tipo_folha == '13_2'",
}
A particularidade do _calcula_irrf_13 é que ele zera as deduções já consideradas no IRRF do salário de dezembro — não dá para descontar dependentes duas vezes. A KMEE encapsula isso em função utilitária no l10n_br_hr_payroll.
Médias de variáveis
O 13º incide sobre médias de variáveis recebidas no ano: horas extras habituais, adicional noturno, comissões, gratificações. A regra de cálculo da média varia (média aritmética dos meses recebidos, ou dos últimos 12 meses), e o Odoo configura isso por rubrica:
class HrSalaryRule(models.Model):
_inherit = "hr.salary.rule"
media_13 = fields.Selection([
("nao", "Nao entra na media"),
("media_meses_recebidos", "Media dos meses em que houve recebimento"),
("media_12_meses", "Media dos ultimos 12 meses"),
])
No fechamento de dezembro, um cron percorre as rubricas marcadas e popula worked_days.MEDIA_VARIAVEIS para o cálculo da hr.payslip do 13º.
Geração do S-1200 competência 13
O S-1200 do 13º tem perApur no formato AAAA-13 (com mês 13). O itensRemun traz as rubricas do 13º com codIncCP específico (incidência previdenciária do 13º) e codIncFGTS próprio.
def gerar_s1200_decimo_terceiro(self, ano):
payslip_13 = self.env["hr.payslip"].search([
("employee_id", "=", self.id),
("tipo_folha", "=", "13_2"),
("date_to", ">=", f"{ano}-01-01"),
("date_to", "<=", f"{ano}-12-31"),
])
evt = EvtRemun(
ide_evento={"perApur": f"{ano}-13", "tpAmb": ...},
ide_empregador={...},
ide_trabalhador=self._build_ide_trab(),
dm_dev=self._build_dm_dev_from_payslip(payslip_13),
)
return sign_event(evt.to_xml(), self.company_id.certificate_id)
Rescisão e proporcionalidade
Em demissão, o 13º proporcional vai junto na rescisão. A regra é a mesma (1/12 por mês), só que apenas até a data de saída. Se o desligamento é no dia 14 do mês, esse mês não conta; no dia 15, conta como mês cheio.
A hr.payslip rescisória inclui rubrica RESC_13_PROP que faz o cálculo. Se já houve pagamento de 1ª parcela, o valor é deduzido.
O que pode dar errado
- Médias zeradas — esquecer de marcar
media_13em rubricas de horas extras é o erro mais comum. - IRRF do 13º somado ao IRRF de dezembro — vira recolhimento a maior, e DARF separado precisa ser desfeito.
- S-1200 mensal de dezembro com rubricas do 13º — confunde o eSocial e bagunça os totalizadores S-5001.
- 1ª parcela em folha que descontou INSS — passivo trabalhista, precisa ser estornado.
- Funcionário que entrou após 17/dez — não tem direito (menos de 15 dias trabalhados).
Conclusão
13º no Odoo é um caso onde o motor de payslip brilha: tipo de folha + condições nas rules + competência separada cobrem 100% da regra CLT. A folha CLT da KMEE entrega esse fluxo desde a versão 8.0 e está sendo migrada 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