Sincronização de Empregados
Objetivo
Este guia descreve como sincronizar empregados (funcionários) do seu sistema de RH com a Pontotel.
Fluxo de Sincronização
flowchart LR
A[Seu Sistema RH] -->|Busca empregados| B[Seu Banco de Dados]
B -->|Para cada funcionário| C{Existe na Pontotel?}
C -->|Não| D[POST /empregados/]
C -->|Sim| E{Dados mudaram?}
E -->|Sim| F[PATCH /empregados/id/]
E -->|Não| G[Ignorar]
D --> H[Armazenar ID Pontotel]
Passo 1: Buscar Empregado por CPF ou Matrícula
| Python |
|---|
| def buscar_empregado(cpf: str, empregador_id: int, headers: dict) -> dict | None:
"""Busca empregado por CPF dentro de um empregador"""
response = requests.get(
"https://apis.pontotel.com.br/pontotel/api/v4/empregados/",
params={"cpf": cpf, "empregador_id": empregador_id},
headers=headers
)
response.raise_for_status()
data = response.json()
return data["results"][0] if data["count"] > 0 else None
|
Passo 2: Criar Empregado
| Python |
|---|
| def criar_empregado(dados: dict, headers: dict) -> dict:
response = requests.post(
"https://apis.pontotel.com.br/pontotel/api/v4/empregados/",
json=dados,
headers=headers
)
response.raise_for_status()
return response.json()
# Payload completo de criação
payload = {
"empregador_id": 5,
"cpf": "123.456.789-00",
"matricula": "EMP-001",
"nome": "João Silva",
"data_admissao": "2025-01-15",
"email": "joao.silva@empresa.com",
"is_active": True
}
|
Passo 3: Sincronização Incremental
Na sincronização incremental, enviamos apenas os registros que foram modificados desde a última sincronização:
| Python |
|---|
| from datetime import datetime, timedelta
def sincronizar_incremental(data_ultima_sync: datetime, auth) -> dict:
"""Sincroniza apenas empregados modificados desde a última sync"""
headers = auth.get_headers()
resultado = {"criados": 0, "atualizados": 0, "erros": []}
# 1. Buscar empregados modificados no seu sistema
empregados_modificados = seu_sistema.buscar_modificados_desde(data_ultima_sync)
for func in empregados_modificados:
try:
existente = buscar_empregado(func["cpf"], func["empregador_id"], headers)
if not existente:
criar_empregado(func, headers)
resultado["criados"] += 1
else:
requests.patch(
f"https://apis.pontotel.com.br/pontotel/api/v4/empregados/{existente['id']}/",
json=func,
headers=headers
).raise_for_status()
resultado["atualizados"] += 1
except Exception as e:
resultado["erros"].append({"cpf": func.get("cpf"), "erro": str(e)})
return resultado
|
Tratamento de Desligamentos
Quando um funcionário é desligado, não delete o empregado — desative-o:
| Python |
|---|
| def desligar_empregado(id: int, data_demissao: str, headers: dict):
"""Desativa empregado na Pontotel"""
requests.patch(
f"https://apis.pontotel.com.br/pontotel/api/v4/empregados/{id}/",
json={
"is_active": False,
"data_demissao": data_demissao
},
headers=headers
).raise_for_status()
|
Não delete empregados
Deletar um empregado apaga históricas de ponto e férias. Use sempre is_active: false para desativação.
Regras de Negócio
| Regra | Descrição |
| CPF único por empregador | Dois empregados não podem ter o mesmo CPF no mesmo empregador |
| Matrícula opcional | Se não informada, a API gerará automaticamente |
| Empregador obrigatório | empregador_id é obrigatório na criação |
| Data de admissão | Deve ser uma data válida no passado ou presente |
Campos Obrigatórios na Criação
| Campo | Tipo | Descrição |
empregador_id | integer | ID do empregador |
cpf | string | CPF do funcionário |
nome | string | Nome completo |
data_admissao | date | Data de admissão |
Próximos Passos