Skip to main content
Ajustes de Registro é o workflow oficial de correção de batidas de ponto: quando um colaborador esqueceu de bater, quando o REP estava fora, quando há atestado médico, etc. Em vez de criar registro diretamente (que é auditável como origem: AJUSTE), o ajuste passa por solicitação → aprovação → aplicação. Motivo de Ajuste e Abono é o catálogo cadastrado pela UN com os motivos válidos (atestado médico, esquecimento, equipamento indisponível, etc.). Cada ajuste referencia um motivo do catálogo.

Por que existe esse fluxo

Auditoria CLT

Modificações em batidas precisam de trilha auditável. O fluxo força documentar quem solicitou, quem aprovou, qual o motivo, quando aconteceu.

Conformidade Portaria 671

Art. 98 exige preservação do registro original. Um ajuste é um novo registro que indica retificação, sem apagar o anterior.

Workflow RH/Gestor

Permite divisão de papéis: colaborador solicita, gestor aprova, RH valida. Sistemas externos podem participar como aprovadores via API.

Estatística de retrabalho

Catalogar motivos mostra padrões: muito esquecimento → trocar REP; muito atestado → revisar saúde organizacional.

Endpoints — Ajustes de Registro

MétodoRotaDescrição
GET/ajuste-registroLista ajustes com filtros (status, período, colaborador)
GET/ajuste-registro/countContagem agregada
GET/ajuste-registro/{id}Detalhe
POST/ajuste-registroCriar ajuste em massa
POST/ajuste-registro/solicitarSolicitar ajuste (fluxo aprovação)
POST/ajuste-registro/previaPrévia da frequência se o ajuste fosse aplicado
PUT/ajuste-registroEditar em massa
PATCH/ajuste-registro/statusAprovar/rejeitar em massa
PATCH/ajuste-registro/{id}/collaborators/bindVincular colaboradores ao ajuste
PATCH/ajuste-registro/{id}/collaborators/unbindDesvincular

Endpoints — Motivos

MétodoRotaDescrição
GET/motivo-ajuste-registroLista motivos cadastrados na UN
GET/motivo-ajuste-registro/{id}Detalhe
POST/motivo-ajuste-registroCria motivo
PUT/motivo-ajuste-registro/{id}Atualiza
DELETE/motivo-ajuste-registro/{id}Remove
Schema completo em Referência da API.

Fluxo workflow

[Colaborador esquece de bater]

POST /ajuste-registro/solicitar

   PENDENTE

[Gestor revisa]

PATCH /ajuste-registro/status (APROVADO ou REJEITADO)

APROVADO → batida criada com origem AJUSTE

[Frequência recalculada]

Fluxos típicos

Solicitar ajuste por esquecimento

async function solicitarAjusteEsquecimento(
  token,
  colaboradorId,
  dataHora,
  motivoId,
) {
  const resp = await fetch(
    'https://api.pontua.com.br/ajuste-registro/solicitar',
    {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${token}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        colaboradorId,
        dataHora,           // ISO 8601 da batida que faltou
        motivoId,           // do catálogo de motivos
        observacao: 'Esqueci de bater entrada',
      }),
    },
  )

  const ajuste = await resp.json()
  return ajuste.id  // PENDENTE até gestor aprovar
}

Prévia: simular impacto antes de aplicar

async function simularImpacto(token, ajusteRequest) {
  // Em vez de criar o ajuste, simular como ficaria a frequência
  const previaResp = await fetch(
    'https://api.pontua.com.br/ajuste-registro/previa',
    {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${token}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(ajusteRequest),
    },
  )

  const previa = await previaResp.json()
  // previa contém os totais de horas trabalhadas/extras se aprovado
  return previa
}

Aprovar lote pelo gestor

async function aprovarLote(token, ajusteIds) {
  await fetch('https://api.pontua.com.br/ajuste-registro/status', {
    method: 'PATCH',
    headers: {
      Authorization: `Bearer ${token}`,
      'Content-Type': 'application/json',
    },
    body: JSON.stringify({
      ajusteIds,
      novoStatus: 'APROVADO',
    }),
  })
}

Cadastrar motivos padrão na UN

async function setupMotivosPadrao(token) {
  const motivos = [
    { nome: 'Atestado médico', tipo: 'ABONO' },
    { nome: 'Esquecimento de bater', tipo: 'AJUSTE' },
    { nome: 'Equipamento indisponível', tipo: 'AJUSTE' },
    { nome: 'Atestado odontológico', tipo: 'ABONO' },
    { nome: 'Reunião externa', tipo: 'AJUSTE' },
    { nome: 'Falha no app', tipo: 'AJUSTE' },
  ]

  for (const m of motivos) {
    await fetch('https://api.pontua.com.br/motivo-ajuste-registro', {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${token}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify(m),
    })
  }
}

Gotchas conhecidos

Se você tenta POST /ajuste-registro/solicitar para data em fechamento CONCLUIDO, retorna erro. Reabra o fechamento primeiro (Fechamento), aplique o ajuste, feche de novo.
PATCH /status em lote aceita conjunto de IDs sem revalidar regras específicas (ex.: tolerância de turno). Use a previa antes para simular cada ajuste se houver dúvida.
DELETE /motivo-ajuste-registro/{id} não cascateia. Ajustes que referenciavam o motivo continuam com motivoId apontando para inexistente. Em vez de deletar, marque o motivo como inativo se o sistema permitir.
POST /ajuste-registro cria ajuste em massa — útil para casos como “todos do departamento X tiveram falha de REP no dia 15”. Após criar, vincule colaboradores via bind/unbind antes de aprovar.

Veja também