Sincronización de empleados
Objetivo
Esta guía describe cómo sincronizar empleados (funcionarios) de su sistema de RH con Pontotel.
Flujo de sincronización
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]
Paso 1: Buscar Empleado por CPF o 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
|
Paso 2: Crear empleado
| 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": "Juan Pérez",
"data_admissao": "2025-01-15",
"email": "joao.silva@empresa.com",
"is_active": True
}
|
Paso 3: Sincronización incremental
En la sincronización incremental, solo enviamos los registros que han sido modificados desde la última sincronización:
| 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
|
Tratamiento de Desconectamientos
Cuando un funcionario está desconectado, no delete el empleado — lo desaté:
| 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()
|
No delete empleados
Deletar a un empleado borra históricas de punto y vacaciones. Usá siempre is_active: false Para desactivar.
Reglas de negocio
| Regla | Descripción |
| CPF único por empleador | Dos empleados no pueden tener el mismo CPF en el mismo empleador |
| Matrícula opcional | Si no se informa, la API generará automáticamente |
| Empleador obligatorio | empregador_id Es obligatorio en la creación |
| Fecha de admisión | Debe ser una fecha válida en el pasado o presente |
Campos Obligatorios en la Creación
| Campo | Tipo | Descripción |
empregador_id | Integer | ID del empleador |
cpf | string | CPF del funcionario |
nome | string | Nombre completo |
data_admissao | date | Fecha de admisión |
Siguientes pasos