Timesheet

Correções de Reconciliação de Folha de Ponto

A API de Reconciliação de Folha de Ponto permite que usuários autorizados criem ou corrijam lançamentos de tempo em massa. Você pode enviar uma única correção ou um lote de correções em uma única solicitação.

Este artigo explica quem pode usar a API, quais informações cada correção precisa, as regras que são aplicadas e como interpretar os resultados.


Quem pode usar

Para enviar correções de reconciliação de folha de ponto, você deve:

  • Ser um Administrador Financeiro, e

  • Ser um Administrador de Folha de Ponto, e

  • Ter o recurso Correções de Folha de Ponto habilitado para sua organização, e

  • Ter o recurso Correção de Reconciliação de Folha de Ponto habilitado para sua organização.

Se qualquer uma dessas condições não for atendida, a solicitação será rejeitada com a resposta 403 Forbidden e nenhuma correção será salva.


O que você pode fazer

  • Enviar uma única correção – envie uma entrada de correção e receba o resultado para essa entrada.

  • Enviar um lote de correções – envie várias entradas de correção de uma vez e receba um resultado por linha, além de um resumo geral.

Cada entrada cria uma nova correção ou atualiza uma existente. Para atualizar uma correção existente, inclua seu Id de Registro. Para criar uma nova correção, deixe o Id de Registro vazio (ou defina-o como 0).


Informações necessárias para cada correção

Cada entrada de correção é composta pelos seguintes campos.

Obrigatórios

Toda entrada deve incluir todos os seguintes campos:

  • Data – a data à qual o tempo se refere.

  • Horas – o número de horas registradas para a correção.

  • Uma forma de identificar o recurso – forneça uma Referência de Recurso ou uma Referência Externa.

  • Uma forma de identificar o trabalho – forneça pelo menos um entre Referência de Projeto, Referência Alternativa de Projeto ou Projeto (nome) para trabalhos não relacionados a projetos, como 'Licença' etc.

Opcionais

Estes campos podem ser fornecidos para adicionar mais detalhes ou para suportar cenários específicos:

  • Id de Registro – o identificador de uma correção existente que você deseja atualizar. Para obter o Id de Registro de correções existentes, use o endpoint 'Find' para buscar correções em um intervalo de datas. Omita o Id de Registro para criar uma nova correção.

  • Recurso – o nome do recurso (pessoa).

  • Referência Financeira – uma referência financeira associada ao trabalho.

  • Tarefa – a flex-task à qual o tempo se refere.

  • Sub Atividade – uma atividade mais granular dentro da tarefa.

  • Valor Local – um valor monetário para a entrada, na moeda local.

  • Código de Moeda Local – a moeda para o Valor Local.

  • Notas – notas em texto livre sobre a correção.


Regras de validação

As correções são verificadas em duas etapas.

1. Verificações básicas (de entrada)

Estas são aplicadas primeiro a cada entrada:

  • Uma Data deve ser fornecida.

  • Horas devem ser fornecidas.

  • O recurso deve ser identificável por uma Referência de Recurso ou uma Referência Externa.

  • O trabalho deve ser identificável por uma Referência de Projeto, uma Referência Alternativa de Projeto ou um nome de Projeto.

  • RecordId deve ser maior ou igual a 0.

Uma entrada que falhar em qualquer uma dessas verificações é marcada como inválida e não é processada adiante. O motivo é retornado para essa entrada.

2. Verificações de negócio

As entradas que passam nas verificações básicas são então validadas em relação aos dados e regras da sua organização, por exemplo:

  • O RecordId deve existir no sistema.

  • O recurso referenciado deve existir.

  • O projeto ou item de trabalho referenciado deve existir e ser válido para correções de folha de ponto.

  • A data deve estar dentro de um período aberto para correção (períodos que foram bloqueados ou anteriores à Data de Bloqueio de Capitalização não podem ser corrigidos).

  • O Projeto deve ser de um tipo ou status que a Configuração de Folha de Ponto marque como excluído das correções.

  • Qualquer moeda fornecida deve ser válida.

Entradas que falham em uma verificação de negócio são marcadas como inválidas e o motivo específico é retornado para a linha correspondente. Entradas que passam em todas as verificações são submetidas.

Sucesso parcial é suportado. Quando você envia um lote, as entradas válidas são aplicadas mesmo que outras entradas no mesmo lote sejam inválidas. Você não precisa reenviar o lote inteiro para corrigir uma única linha com erro.


Entendendo os resultados

Correção única

A resposta informa se a entrada foi válida ou inválida, e inclui quaisquer mensagens de validação explicando por que uma entrada foi rejeitada.

Lote de correções

A resposta inclui um resumo geral e um detalhamento por linha:

  • Status – o resultado geral do lote:

    • success – todas as entradas foram válidas e aplicadas.

    • partial – algumas entradas foram válidas e aplicadas; outras foram inválidas.

    • failed – nenhuma entrada foi válida; nada foi aplicado.

  • Contagem total – o número de entradas enviadas.

  • Contagem válida – o número de entradas que passaram na validação e foram aplicadas.

  • Contagem inválida – o número de entradas que falharam na validação.

  • Resultados por linha – para cada entrada, se foi válida e quaisquer mensagens de validação.

  • Id de Correlação – uma referência para o lote, útil ao revisar ou acompanhar um envio.


Dicas para um envio sem erros

  • Sempre inclua Data e Horas em cada entrada.

  • Forneça uma Referência de Recurso ou Referência Externa para que o recurso possa ser identificado sem ambiguidade.

  • Forneça uma Referência de Projeto, Referência Alternativa de Projeto ou nome de Projeto para que o trabalho possa ser identificado.

  • Certifique-se de que a Data esteja dentro de um período ainda aberto para reconciliação.

  • Para atualizar uma correção existente em vez de criar uma nova, inclua seu Id de Registro.

  • Ao enviar um lote, revise os resultados por linha para que você possa corrigir e reenviar apenas as linhas que falharam.

URL Base

/rest/api/timesheetreconciliation

Limites de Taxa

Endpoint

Limite

GET Find

100 requisições por 10 segundos

POST single

20 requisições por 5 segundos

POST bulk

10 requisições por 2 segundos

O status do limite de taxa é retornado nos cabeçalhos da resposta:

Cabeçalho

Descrição

RateLimit-Limit

Máximo de requisições permitidas na janela

RateLimit-Remaining

Capacidade restante

RateLimit-Reset

Segundos até a janela ser redefinida


Endpoints

1. Localizar Registros de Correção por Intervalo de Datas{#find}

Recupera registros de correção de reconciliação de folha de ponto para o intervalo de datas especificado. Tanto startDate quanto endDate são obrigatórios.

Exemplo HTTP

Endpoint: GET /rest/api/timesheetreconciliation/find

Exemplo cURL

curl -X GET "https://organisation.fluid.work/rest/api/timesheetreconciliation/find?startDate=2026-07-01&endDate=2026-07-31&version=3.0" \
  -H "Authorization: Bearer {your_api_token}" \
  -H "Accept: application/json"

Parâmetros de Consulta:

Parâmetro

Tipo

Obrigatório

Descrição

startDate

DateTime

Sim

Início do intervalo de datas (inclusivo). Formato ISO 8601 ou yyyy-MM-dd.

endDate

DateTime

Sim

Fim do intervalo de datas (inclusivo). Formato ISO 8601 ou yyyy-MM-dd.

version

string

Não

Versão da API (ex.: "3" ou "3.0"). Padrão para a versão estável mais recente.

fields

string

Não

Lista separada por vírgulas de campos a incluir na resposta.

expand

string

Não

Lista separada por vírgulas de expansões de propriedades personalizadas.

skip

integer

Não

Número de registros a ignorar para paginação. Padrão: 0.

take

integer

Não

Número de registros a retornar. Padrão: 50 (máx. 50).

Cabeçalhos de Resposta:

Cabeçalho

Descrição

Item-Count

Número de registros retornados nesta resposta

Total-Count

Número total de registros correspondentes

Resposta:

[
  {
    "fields": {
      "recordId": 1042,
      "date": "2026-07-01T00:00:00",
      "resource": "Henry Rogers",
      "resourceRef": "Henry.rogers",
      "externalRef": "EMP-001",
      "project": "Project Solara",
      "projectRef": "ED-EN-1000",
      "alternateProjectRef": null,
      "financialRef": "FR-JC-01",
      "task": null,
      "subActivity": null,
      "hours": 8.0,
      "localValue": 0.0,
      "localCurrencyCode": null,
      "notes": null
    }
  }
]

Resposta (400 Bad Request) — parâmetros de data ausentes ou inválidos:

{
  "message": "startDate and endDate are required and must be valid dates."
}

Resposta (403 Forbidden):

{
  "message": "You do not have the required permission to fetch timesheet reconciliation corrections."
}

2. Criar Entrada de Correção Única

Cria ou atualiza uma única entrada de correção de reconciliação de folha de ponto.

Exemplo HTTP

Endpoint: POST /rest/api/timesheetreconciliation

Corpo da Requisição:

{
  "fields": {
    "recordId": 0,
    "date": "2026-07-01T00:00:00Z",
    "resourceRef": "Henry.rogers",
    "projectRef": "ED-EN-1000",
    "financialRef": "FR-JC-01",
    "subActivity": "Application Support",
    "hours": 8.0,
    "localValue": 350.00,
    "localCurrencyCode": "GBP",
    "notes": "July correction"
  }
}

Exemplo cURL

curl -X POST "https://organisation.fluid.work/rest/api/timesheetreconciliation?version=3.0" \
  -H "Authorization: Bearer {your_api_token}" \
  -H "Content-Type: application/json" \
  -d '{
    "fields": {
      "recordId": 0,
      "date": "2026-07-01T00:00:00Z",
      "resourceRef": "Henry.rogers",
      "projectRef": "ED-EN-1000",
      "financialRef": "FR-JC-01",
      "subActivity": "Application Support",
      "hours": 8.0,
      "localValue": 350.00,
      "localCurrencyCode": "GBP",
      "notes": "July correction"
    }
  }'

Resposta — Entrada válida:

{
    "fields": {
        "rowIndex": 1,
        "isValid": true,
        "status": "valid",
        "validationMessages": []
    }
}

Resposta — Erro de validação:

{
    "fields": {
        "rowIndex": 1,
        "isValid": false,
        "status": "invalid",
        "validationMessages": [
            "This row was skipped as Project 'Vacations' is not a valid Miscellaneous Task as configured in Timesheet Configuration."
        ]
    }
}

Resposta (403 Forbidden):

{
  "message": "You do not have the required permission to create timesheet reconciliation corrections."
}

3. Criar Entradas de Correção em Massa

Envia múltiplas entradas de correção de reconciliação de folha de ponto em uma única requisição. Cada entrada é validada e processada de forma independente. Linhas inválidas não impedem que linhas válidas sejam salvas.

Exemplo HTTP
Endpoint: POST /rest/api/timesheetreconciliation/bulk

Corpo da Requisição:

[
  {
    "fields": {
      "recordId": 0,
      "date": "2026-07-01T00:00:00Z",
      "resourceRef": "Henry.rogers",
      "projectRef": "ED-EN-1000",
      "hours": 8.0
    }
  },
  {
    "fields": {
      "recordId": 1042,
      "date": "2026-07-02T00:00:00Z",
      "resourceRef": "Henry.rogers",
      "projectRef": "ED-EN-1000",
      "financialRef": "FR-JC-01",
      "hours": 10.5
    }
  },
  {
    "fields": {
      "recordId": 0,
      "date": "2026-07-03T00:00:00Z",
      "resourceRef": "unknown.user",
      "projectRef": "ED-EN-1000",
      "hours": 8.0
    }
  }
]

Exemplo cURL

curl -X POST "https://organisation.fluid.work/rest/api/timesheetreconciliation/bulk?version=3.0" \
  -H "Authorization: Bearer {your_api_token}" \
  -H "Content-Type: application/json" \
  -d '[
    {
      "fields": {
        "recordId": 0,
        "date": "2026-07-01T00:00:00Z",
        "resourceRef": "Henry.rogers",
        "projectRef": "ED-EN-1000",
        "hours": 8.0
      }
    },
    {
      "fields": {
        "recordId": 1042,
        "date": "2026-07-02T00:00:00Z",
        "resourceRef": "Henry.rogers",
        "projectRef": "ED-EN-1000",
        "financialRef": "FR-JC-01",
        "hours": 10.5
      }
    }
  ]'

Resposta — Sucesso parcial:

{
  "status": "partial",
  "totalCount": 3,
  "validCount": 2,
  "invalidCount": 1,
  "correlationId": "12345678-1234-1234-1234-123456789012",
  "results": [
    {
      "fields": {
        "rowIndex": 1,
        "isValid": true
        "status": "valid",
        "validationMessages": [],
      }
    },
    {
      "fields": {
        "rowIndex": 2,
        "isValid": true
        "status": "valid",
        "validationMessages": [],
      }
    },
    {
      "fields": {
        "rowIndex": 3,
        "isValid": false
        "status": "valid",
        "validationMessages": [
          "Row 3: no resource found matching the Resource Ref 'unknown.user'"
        ]
      }
    }
  ]
}

Modelo de Requisição

O objeto de requisição de nível superior encapsula um objeto fields.

{
  "fields": { ... }
}

Campo

Tipo

Obrigatório

Descrição

recordId

integer

Não

Id de uma entrada de correção existente a ser atualizada. Use 0 (ou omita) para criar uma nova entrada. Não pode ser negativo.

date

DateTime

Sim

Data da entrada de correção. Deve ser posterior à Data de Bloqueio de Capitalização.

resourceRef

string

Sim*

ID de referência do recurso (ex.: "Henry.rogers"). Obrigatório a menos que externalRef seja fornecido.

externalRef

string

Sim*

ID de funcionário do recurso. Alternativa a resourceRef.

project

string

Não

Nome de exibição do projeto. Usado para resolver entradas de tarefas diversas quando projectRef está ausente.

projectRef

string

Sim**

Referência Externa do Projeto (ex.: "ED-EN-1000").

alternateProjectRef

string

Sim**

Referência Alternativa do Projeto.

financialRef

string

Não

Referência financeira para a entrada de tempo (ex.: um código de custo ou elemento WBS).

task

string

Não

Título da tarefa do quadro flex. Usado quando a correção tem como alvo uma entrada de tarefa do quadro flex. Não pode ser combinado com financialRef.

subActivity

string

Não

Tipo de subatividade (ex.: "Application Support"). Obrigatório para entradas que não são de projeto; deve corresponder aos valores de subatividade configurados nos MetaDados.

hours

decimal

Sim

Horas para a correção. Deve ser maior que zero para novos registros (recordId = 0).

localValue

decimal

Não

Valor monetário de substituição em moeda local. Quando fornecido junto com localCurrencyCode, ignora a conversão pela tabela de tarifas.

localCurrencyCode

string

Não

Código de moeda para localValue (ex.: "GBP", "USD"). Deve ser um código de moeda válido configurado no sistema.

notes

string

Não

Notas em texto livre anexadas à entrada de correção.

* resourceRef ou externalRef é obrigatório.
** projectRef ou alternateProjectRef é obrigatório (ou project para entradas de tarefas diversas).


Modelos de Resposta

Retornado pelos endpoints de criação individual e criação em lote.

Campo

Tipo

Descrição

status

string

Status geral do lote: "success", "partial", "failed" ou "error".

totalCount

integer

Número total de registros enviados.

validCount

integer

Número de registros que passaram na validação e foram salvos.

invalidCount

integer

Número de registros que falharam na validação.

correlationId

string

GUID único atribuído a esta requisição para rastreamento e correlação de logs.

results

array

Lista de Fields, um por linha enviada.

status valores

Valor

Significado

"success"

Todos os registros enviados eram válidos e foram salvos.

"partial"

Alguns registros eram válidos e foram salvos; outros falharam na validação.

"failed"

Nenhum registro era válido; nada foi salvo.

"error"

Ocorreu um erro de processamento inesperado.

Resultado por linha

Campo

Tipo

Descrição

rowIndex

integer

Posição baseada em 1 desta linha dentro da lista enviada.

isValid

boolean

true se o registro passou em todas as validações e foi salvo.

status

string

"valid" ou "invalid".

validationMessages

string[]

Array de mensagens de erro de validação. Vazio quando válido.

Resposta para o endpoint 'Find'

Retornado por registro pelo endpoint GET /find.

Campo

Tipo

Descrição

recordId

integer

TimeActual.Id — use este valor como recordId ao enviar uma atualização para este registro.

date

DateTime

Data de início do timesheet para esta entrada de correção.

resource

string

Nome completo do recurso.

resourceRef

string

ID de referência do recurso.

externalRef

string

ID de funcionário do recurso.

project

string

Nome de exibição do projeto ou tarefa.

projectRef

string

Referência externa do projeto.

alternateProjectRef

string

Referência externa secundária do projeto.

financialRef

string

Referência financeira para a entrada de tempo.

task

string

Título da tarefa do quadro Flex, se aplicável.

subActivity

string

Tipo de subatividade.

hours

decimal

Horas registradas.

localValue

decimal

Valor monetário local armazenado.

localCurrencyCode

string

Código da moeda local.

notes

string

Notas anexadas à entrada.


Regras de Validação

A validação é executada em duas fases: nível de requisição (pré-processador) e nível de processador.

Fase 1 — Validação no Nível de Requisição

Aplicada antes da execução do processador. Uma linha que falha em qualquer uma dessas verificações é marcada como inválida e excluída da execução do processador.

Regra

Mensagem de erro

date está ausente

"Date is required"

hours está ausente

"Hours is required"

Nem resourceRef nem externalRef foi fornecido

"Resource Ref or External Ref is required"

Nenhum de projectRef, alternateProjectRef ou project foi fornecido

"Project Ref, Alternate Project Ref, or Project is required"

Fase 2 — Validação no Nível do Processador

Aplicada para cada entrada que passa na Fase 1.

Regra

Fragmento da mensagem de erro

recordId é negativo

"Record Id is not valid"

date é igual ou anterior à Data de Bloqueio de Capitalização

"must be later than the Capitalization Lock Date"

Recurso não encontrado por resourceRef

"no resource found matching the Resource Ref"

Recurso não encontrado por externalRef

"no resource found matching the External Ref"

Recurso não possui plano de recurso para date

"resource does not have a valid resourceplan for date"

Projeto não encontrado por projectRef ou alternateProjectRef

"no project found matching the Project Ref"

O tipo de projeto está excluído da reconciliação de timesheet

"project type is excluded from corrections"

O status do projeto impede novas entradas

"project status"is excluded from corrections

subActivity está em branco para entradas que exigem uma

"the subactivity value '' is invalid"

O valor de subActivity não está na lista configurada

"the subactivity value '...' is invalid"

Nome da tarefa diversa não encontrado na configuração

"is not a valid Miscellaneous Task as configured in Timesheet Configuration"

Título de task não encontrado nas tarefas do quadro flex

mensagem de tarefa não encontrada

task e financialRef ambos fornecidos

"Task and Financial Ref cannot both be specified"

hours é zero para um novo registro (recordId = 0)

"Hours must be greater than zero"

localCurrencyCode não é uma moeda válida do sistema

"is not a valid currency code"

recordId > 0 e a combinação enviada não corresponde ao registro no banco de dados

"No record found matching."

Linha duplicada dentro do lote (mesmo recurso + projeto + data + finRef + subActivity)

Apenas o registro mais recente na lista de duplicatas é considerado para envio; todos os demais registros duplicados são ignorados com uma mensagem de duplicata detectada

Correspondência de Combinação para Atualizações (recordId > 0)

Quando recordId é maior que zero, o processador busca o registro de correção existente por esse ID e compara os seguintes campos com o que foi enviado:

campo

date

Recurso

Projeto

subActivity

GUID da Tarefa

financialRef

Se algum campo não corresponder, a linha é rejeitada e o registro existente permanece inalterado. Somente hours, localValue, localCurrencyCode e notes podem diferir dos valores armazenados — todos os outros campos atuam como chave de identidade para confirmar que o registro correto está sendo atualizado.


Comportamento de Processamento

  1. Validação da solicitação: Cada linha é verificada em relação às regras de campos obrigatórios.

  2. Remoção de duplicatas: Linhas que compartilham a mesma chave (resourceRef, projectRef, date, financialRef, subActivity) dentro de um único lote são desduplicadas. A linha que aparece por último na lista de combinações duplicadas é mantida; as duplicatas anteriores são rejeitadas sem processamento.

  3. Execução do processador: Todas as entradas válidas são enviadas.


Versionamento

A API suporta versionamento por meio do parâmetro de consulta version:

  • version=3 ou version=3.0 — API V3 (atual)

  • Omitido — resolve para a versão estável mais recente (atualmente V3)

POST /rest/api/timesheetreconciliation?version=3.0

Filtragem de Campos

Use o parâmetro de consulta fields para limitar quais campos aparecem na resposta:

GET rest/api/timesheetreconciliation/find?startDate=2026-08-01&endDate=2026-08-30&fields=resourceRef,projectRef,recordid

Melhores Práticas

  1. Use o endpoint Find antes de atualizações em massa: Chame GET /rest/api/timesheetreconciliation/find primeiro para recuperar os valores atuais de recordId e os valores exatos dos campos armazenados no banco de dados. Isso garante que a verificação de combinação seja aprovada ao enviar atualizações.

  2. Trate recordId como um identificador opaco: Obtenha-o a partir do endpoint 'Find'.

  3. Para atualizações, altere apenas hours, localValue, localCurrencyCode ou notes: Qualquer alteração em date, resourceRef, projectRef, financialRef, subActivity ou task em uma linha com recordId > 0 fará a verificação de combinação falhar e a linha será rejeitada.

  4. Use o endpoint em massa para envios de múltiplas linhas: O endpoint em massa processa todas as linhas em um único lote e retorna resultados por linha. Enviar linhas individualmente por meio de múltiplas chamadas POST únicas é menos eficiente.

  5. Verifique isValid por linha: Itere sobre results e verifique isValid para identificar linhas rejeitadas e suas validationMessages.

  6. Trate o sucesso parcial: O campo status indica "success", "partial" ou "failed".

  7. Respeite a Data de Bloqueio de Capitalização: Entradas com uma date igual ou anterior à Data de Bloqueio de Capitalização são sempre rejeitadas. Verifique a data de bloqueio antes de enviar correções históricas.

  8. Entradas de tarefas diversas: Para entradas direcionadas a uma tarefa diversa em vez de um projeto padrão, defina o campo project com o nome de exibição da tarefa e deixe projectRef e alternateProjectRef vazios. Não inclua subActivity em linhas de tarefas diversas.

  9. Entradas de tarefas do quadro flex: Defina o campo task com o título exato da tarefa do quadro flex. Não combine task com financialRef.

  10. Use a filtragem de campos: Use o parâmetro de consulta fields para reduzir o tamanho do payload da resposta quando apenas campos específicos são necessários.

Was this article helpful?