S-2299 desligamento no eSocial: rescisão CLT automatizada no Odoo
Como o Odoo gera o evento S-2299 de desligamento, calcula verbas rescisórias do art. 477 CLT e transmite ao eSocial via esociallib.
Luis Felipe Miléo
S-2299 é o evento que encerra o vínculo trabalhista no eSocial. Sem ele transmitido e processado com sucesso, o colaborador não pode sacar FGTS, não recebe seguro-desemprego e a empresa fica em débito junto à Receita e ao Ministério do Trabalho. Diferente do S-2200 (admissão), o S-2299 carrega também o cálculo das verbas rescisórias — ou seja, um erro de folha vira erro de eSocial.
A folha CLT da KMEE (PR #277) implementa S-2299 completo, com cálculo de verbas integrado ao motor de salary rules do Odoo. Este post explica o fluxo.
Quando enviar
O prazo do S-2299 é até o 10º dia subsequente ao desligamento. Mas o art. 477 da CLT exige pagamento das verbas rescisórias em 10 dias corridos a partir do término do contrato — independente do tipo de aviso prévio. Atrasar gera multa equivalente a um salário do empregado.
Na prática isso significa que a folha rescisória precisa estar fechada antes do envio do S-2299, porque o evento carrega os totalizadores de remuneração final.
Motivos de desligamento
O leiaute S-1.3 trabalha com mais de 30 códigos de motivo no campo mtvDeslig. Os principais que vemos no órgão público federal cliente da KMEE:
- 02 — Rescisão sem justa causa por iniciativa do empregador
- 03 — Rescisão com justa causa por iniciativa do empregador
- 06 — Rescisão por iniciativa do empregado
- 07 — Rescisão por término de contrato a prazo determinado
- 11 — Aposentadoria
- 17 — Falecimento
- 23 — Rescisão por acordo entre empregado e empregador (Lei 13.467/2017)
Cada motivo dispara um conjunto diferente de verbas. Demissão sem justa causa paga multa de 40% do FGTS; pedido de demissão não. Acordo do art. 484-A paga 50% do aviso e 20% do FGTS. O Odoo precisa saber escolher.
Estrutura do evento
evtDeslig
├── ideEvento (tpAmb, procEmi, verProc)
├── ideEmpregador (tpInsc, nrInsc)
├── ideVinculo (cpfTrab, matricula)
├── infoDeslig
│ ├── mtvDeslig (codigo de motivo)
│ ├── dtDeslig
│ ├── indPagtoAPI (indicador pagto aviso previo indenizado)
│ ├── dtProjFimAPI (data projetada fim aviso)
│ ├── pensAlim (sim/nao)
│ ├── percAliment (% pensao)
│ ├── vrAlim (valor pensao)
│ ├── nrCertObito (se obito)
│ ├── observacao
│ └── sucessaoVinc (se sucessao)
├── infoTSVTermino (se trabalhador sem vinculo)
├── verbasResc
│ ├── dmDev (demonstrativo)
│ │ ├── ideDmDev
│ │ ├── infoPerApur / infoPerAnt
│ │ └── itensRemun (rubricas com codRubr, vrRubr, indResc)
└── procJudTrab (se decisao judicial)
Cálculo das verbas rescisórias
A hr.payslip rescisória usa um conjunto dedicado de salary rules marcadas com code próprio (RESC_*). O motor do Odoo rola normalmente, mas o cálculo precisa cobrir:
- Saldo de salário — dias trabalhados no mês corrente
- Aviso prévio indenizado — 30 dias + 3 dias por ano (Lei 12.506/2011)
- Férias vencidas + 1/3 — se houver período vencido
- Férias proporcionais + 1/3 — fração de meses do período aquisitivo corrente
- 13º proporcional — meses trabalhados no ano / 12
- Multa 40% FGTS — apenas em demissão sem justa causa (ou 20% no acordo)
- Indenizações adicionais — convenção coletiva, estabilidade, etc.
Cada uma dessas verbas vira uma linha em itensRemun do S-2299, com codRubr apontando para a tabela S-1010 da empresa e indResc indicando que é rubrica de rescisão.
Mapping no Odoo
O hr.contract ganha campos para encerramento:
date_end = fields.Date()
deslig_motivo = fields.Selection(...) # codigos eSocial
aviso_previo_tipo = fields.Selection([
("indenizado", "Indenizado"),
("trabalhado", "Trabalhado"),
("dispensado", "Dispensado"),
])
aviso_previo_dias = fields.Integer() # 30 + 3*ano (max 90)
data_projetada_aviso = fields.Date(compute="_compute_data_projetada_aviso")
pensao_alimenticia_pct = fields.Float()
E a hr.payslip rescisória tem um wizard dedicado que:
- Calcula a data projetada do aviso prévio
- Determina período aquisitivo de férias em aberto
- Aplica regras conforme
deslig_motivo - Gera o demonstrativo
dmDevcom infoPerApur (mês corrente) e infoPerAnt (competências anteriores)
Geração do XML
from esociallib.s_2299 import EvtDeslig
def gerar_s2299(self):
self._validar_payslip_rescisoria()
evt = EvtDeslig(
ide_evento={"tpAmb": self.company_id.tp_amb},
ide_empregador={"tpInsc": "1", "nrInsc": self.company_id.cnpj_cpf[:8]},
ide_vinculo={"cpfTrab": self.employee_id.cpf, "matricula": self.contract_id.matricula_esocial},
info_deslig=self._build_info_deslig(),
verbas_resc=self._build_verbas_resc_from_payslip(),
)
return sign_event(evt.to_xml(), self.company_id.certificate_id)
O _build_verbas_resc_from_payslip percorre as payslip.line da rescisão e mapeia cada uma para um item em itensRemun, respeitando incidências de INSS, IRRF e FGTS.
Integração com S-1200, S-1210 e S-1299
S-2299 é parte de uma sequência: o evento de remuneração da rescisão (S-1200) precisa ter sido enviado antes; o pagamento das verbas vira S-1210 (pagamentos); e tudo precisa estar consolidado no S-1299 (fechamento) da competência.
A folha do órgão público federal cliente já tem S-2299 rodando em produção desde o Odoo 8.0. A migração para Odoo 16 entrega S-2299 completo — S-1210 e S-1299 estão em desenvolvimento ativo no PR #277, próximos a entrar.
O que pode dar errado
- Data do desligamento posterior ao envio — eSocial não aceita desligamento futuro fora da janela de aviso prévio.
- Verbas zeradas em motivo que exige pagamento — rejeita silenciosamente até a transmissão.
- Aviso prévio sem
dtProjFimAPIquando o tipo é “indenizado” — campo condicional. - Pensão alimentícia sem percentual quando o vínculo tem ordem judicial ativa.
- Falta do S-2206 antes quando o desligamento é precedido de alteração contratual nos últimos 30 dias.
O Odoo valida tudo isso pré-envio.
Conclusão
S-2299 fecha o ciclo do vínculo CLT no eSocial. A combinação Odoo + folha CLT da KMEE traz cálculo de verbas, geração de XML e transmissão num único fluxo. Veja mais em folha de pagamento Odoo e eSocial Odoo, ou compare com 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