Voltar ao Blog Gestão Empresarial

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

Luis Felipe Miléo

· 5 min de leitura

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_13 em 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.

#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