Skip to content

Jornadas & Ausências ​

As jornadas definem quanto se espera trabalhar em cada dia; feriados e ausências aprovadas zeram essa expectativa. Juntos, eles alimentam o expectedMinutes de cada dia consolidado e o saldo mensal — sem eles, todo feriado ou dia de férias apareceria como falta no relatório.

Headers obrigatórios

Todas as requisições devem incluir X-Timesheet-Id e Authorization: Bearer {token}. Gerenciar jornadas, dias de jornada, vínculos e feriados exige gestor (isManager); ausências podem ser criadas pelo próprio profissional, mas só gestores aprovam.


Jornadas (Schedules) ​

Modelos de jornada — "44h comercial", "6x1", "meio período". O detalhe dia a dia fica nos dias da jornada.

Estrutura de Dados ​

CampoTipoDescrição
idNumberIdentificador da jornada.
nameStringNome (máx. 150 caracteres).
weeklyMinutesNumberTotal semanal esperado em minutos (informativo).
isDefaultBooleanIndica a jornada padrão da instância.

Jornada padrão

Toda instância nasce com a jornada Comercial 44h (segunda a sexta, 09:00–18:00, 480 min/dia, 60 min de intervalo), criada no setup inicial.

Endpoints ​

http
GET    /v1/timesheet/schedules
GET    /v1/timesheet/schedules/list
GET    /v1/timesheet/schedules/:id
POST   /v1/timesheet/schedules
PUT    /v1/timesheet/schedules/:id
DELETE /v1/timesheet/schedules/:id

Criar Jornada (gestor) ​

AtributoTipoObrigatórioDescrição
namestringSimNome (máx. 150 caracteres).
weeklyMinutesnumberNãoTotal semanal em minutos (mín. 0).
isDefaultbooleanNãoMarca como jornada padrão.

Respostas ​

201 Created / 204 No Content

Criação retorna { "id": 1 }; atualização e remoção respondem 204. Listagens aceitam page/perPage/search.


Dias da Jornada (Schedule Days) ​

O detalhe de cada modelo, dia da semana a dia da semana: horário previsto, minutos esperados e intervalo. A escrita é feita em lote (sync), substituindo os dias informados.

Estrutura de Dados ​

CampoTipoDescrição
weekdayNumberDia da semana: 0 = domingo até 6 = sábado.
startsAtStringHorário de início (HH:mm, null em dias sem expediente).
endsAtStringHorário de término (HH:mm).
expectedMinutesNumberMinutos esperados no dia.
breakMinutesNumberMinutos de intervalo previstos.

Listar Dias da Jornada ​

http
GET /v1/timesheet/schedules/:scheduleId/days

Retorna o array de dias ordenado por weekday. Na resposta, startsAt/endsAt vêm no formato do banco (HH:mm:ss, ex.: "08:00:00"); na escrita (sync), envie HH:mm.

Sincronizar Dias (gestor) ​

Substitui a grade da jornada em uma única chamada. O weekday não pode se repetir no payload — duplicado falha com 422 DUPLICATED_WEEKDAY.

http
PUT /v1/timesheet/schedules/:scheduleId/days

Payload (Body) ​

AtributoTipoObrigatórioDescrição
daysarraySimAté 7 itens, um por dia da semana.
days[].weekdaynumberSim0 (domingo) a 6 (sábado).
days[].startsAtstringNãoHorário de início HH:mm (pode ser null).
days[].endsAtstringNãoHorário de término HH:mm (pode ser null).
days[].expectedMinutesnumberNãoMinutos esperados (mín. 0).
days[].breakMinutesnumberNãoMinutos de intervalo (mín. 0).

Exemplo de Requisição ​

bash
curl -X PUT "https://api.us.basis.tavares.in/v1/timesheet/schedules/1/days" \
  -H "X-Timesheet-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "days": [
      { "weekday": 1, "startsAt": "08:00", "endsAt": "17:00", "expectedMinutes": 480, "breakMinutes": 60 },
      { "weekday": 2, "startsAt": "08:00", "endsAt": "17:00", "expectedMinutes": 480, "breakMinutes": 60 }
    ]
  }'

Respostas ​

204 No Content

Sincronização concluída com sucesso.


Vínculo de Jornada (User Schedules) ​

Define quem segue qual jornada e desde quando. É um histórico, pelo mesmo motivo das tarifas: mudança de jornada não reescreve o passado. A vigência ativa é usada no cálculo do expectedMinutes de cada dia.

Estrutura de Dados ​

CampoTipoDescrição
timesheetUserIdNumberProfissional.
timesheetScheduleIdNumberJornada.
effectiveFromDateInício da vigência (YYYY-MM-DD).
effectiveToDateFim da vigência (null = indefinida).

Regra de Vigências ​

Vigências do mesmo profissional não podem se sobrepor: a aplicação rejeita com 422 SCHEDULE_OVERLAP qualquer vínculo que colida com um existente (null em effectiveTo conta como 9999-12-31). effectiveTo anterior a effectiveFrom falha com 422 INVALID_EFFECTIVE_RANGE.

Endpoints (somente gestores) ​

http
GET    /v1/timesheet/user-schedules?timesheetUserId=2
POST   /v1/timesheet/user-schedules
GET    /v1/timesheet/user-schedules/:id
PUT    /v1/timesheet/user-schedules/:id
DELETE /v1/timesheet/user-schedules/:id

Criar Vínculo ​

AtributoTipoObrigatórioDescrição
timesheetUserIdnumberSimProfissional existente na instância.
timesheetScheduleIdnumberSimJornada existente na instância.
effectiveFromdateSimInício da vigência (YYYY-MM-DD).
effectiveTodateNãoFim da vigência (>= effectiveFrom).

Respostas ​

422 Unprocessable Entity

Vigência sobreposta a outro vínculo do mesmo profissional.

json
{
  "message": "Já existe uma vigência que se sobrepõe ao período informado",
  "code": "SCHEDULE_OVERLAP"
}

Feriados (Holidays) ​

Feriados nacionais, estaduais, municipais ou da empresa. Um feriado com isWorkingDay: false zera os minutos esperados do dia e ativa o multiplicador de feriado no cálculo financeiro.

Estrutura de Dados ​

CampoTipoDescrição
dateDateData do feriado (YYYY-MM-DD).
nameStringNome (máx. 150 caracteres).
scopeStringAbrangência: national (padrão), state, city ou company.
regionCodeStringCódigo da região (UF/município, máx. 20 caracteres, opcional).
isWorkingDayBooleantrue = dia útil mesmo sendo feriado (padrão: false).

A combinação date + scope + regionCode é única por instância — duplicados falham com 422.

Endpoints ​

http
GET    /v1/timesheet/holidays?startsOn=2026-01-01&endsOn=2026-12-31
POST   /v1/timesheet/holidays
GET    /v1/timesheet/holidays/:id
PUT    /v1/timesheet/holidays/:id
DELETE /v1/timesheet/holidays/:id

A listagem aceita startsOn/endsOn (YYYY-MM-DD) além de page/perPage. Escrita restrita a gestores.


Ausências (Absences) ​

Férias, atestados, folgas e licenças. Uma ausência aprovada zera os minutos esperados dos dias cobertos — sem isso, todo dia de férias apareceria como falta no saldo mensal.

Estrutura de Dados ​

CampoTipoDescrição
timesheetUserIdNumberProfissional ausente.
kindStringTipo: vacation, sick_leave, day_off, holiday, unpaid ou other.
statusStringpending (padrão na criação), approved, rejected ou cancelled.
startsOn / endsOnDateJanela da ausência (endsOn >= startsOn).
isPaidBooleanAusência remunerada (padrão: true).
reasonStringJustificativa (opcional).
reviewedByTimesheetUserId / reviewedAtNumber / DateTimeQuem revisou e quando (preenchidos na aprovação/rejeição).

Fluxo de Aprovação ​

pending ──approve──> approved
   │  └──reject───> rejected
   └──cancel────> cancelled

Todas as transições partem de pending; agir sobre ausência já decidida falha com 422 INVALID_STAGE_MOVE. Somente dias com ausência approved têm a expectativa zerada.

Endpoints ​

http
GET   /v1/timesheet/absences
POST  /v1/timesheet/absences
GET   /v1/timesheet/absences/:id
PATCH /v1/timesheet/absences/:id/approve
PATCH /v1/timesheet/absences/:id/reject
PATCH /v1/timesheet/absences/:id/cancel

Listar Ausências ​

Aceita page, perPage, timesheetUserId, status e kind. Profissionais só enxergam as próprias ausências (o filtro timesheetUserId é ignorado); gestores veem todas.

Criar Ausência ​

O profissional cria a própria ausência; gestores podem criar para qualquer pessoa (422 FORBIDDEN → 403 caso contrário).

AtributoTipoObrigatórioDescrição
timesheetUserIdnumberNãoProfissional (padrão: o autenticado).
kindstringSimTipo da ausência.
startsOndateSimInício (YYYY-MM-DD).
endsOndateSimFim (>= startsOn).
isPaidbooleanNãoRemunerada (padrão: true).
reasonstringNãoJustificativa.

Exemplo de Requisição ​

bash
curl -X POST "https://api.us.basis.tavares.in/v1/timesheet/absences" \
  -H "X-Timesheet-Id: 3fa85f64-5717-4562-b3fc-2c963f66afa6" \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "kind": "vacation",
    "startsOn": "2026-12-21",
    "endsOn": "2027-01-04",
    "reason": "Férias anuais"
  }'

Respostas ​

201 Created / 204 No Content

Criação retorna { "id": 1 } com status pending. As transições (approve, reject, cancel) respondem 204 e exigem gestor.