Time Record Schema
Felder
Time Record Schema
Schema for validating time record entities
userId
User ID who recorded this time entry
date
Date of the time entry (ISO date format)
startTime
Start time for exact time tracking (ISO datetime)
endTime
End time for exact time tracking (ISO datetime)
durationMinutes
Total duration in minutes
breakMinutes
Break time in minutes
breakStartTime
When the break started (ISO datetime) — legacy, first break
breaks
Multiple break entries with start time and duration
startTime
Break start time (ISO datetime)
durationMinutes
Break duration in minutes
description
Work description
internalNote
Internal note not visible to customer
serviceTypeId
Service type UUID — primary classification for billing parameters
serviceNature
Snapshot von service_type.serviceNature zum Buchungszeitpunkt (SUPPORT = im Full-Service enthalten, ORDER_BASED = auftragsbezogen). Server-gesetzt (protected), als direktes Feld in der Analytics-Auswertung gruppierbar. Null = nicht klassifiziert.
SUPPORTORDER_BASEDnullentryType
Derived from serviceType.category (legacy compatibility)
WORKTRAVELREMOTEON_SITEPHONEADMINCONSULTINGMAINTENANCESUPPORTCUSTOMlocation
Location where work was performed (defaults from serviceType.defaultLocation)
OFFICECUSTOMER_SITEREMOTETRAVELpartyId
Company UUID — always required (own company or customer)
isInternal
If true, not visible to customer and not billable
referenceType
Type of linked entity (Auftrag)
TICKETPROJECTTASKCONTRACTPHONE_CALLCONTACT_PERSONASSETreferenceId
UUID of linked entity (Auftrag)
linkedProjectId
Linked project UUID (max. one; primary reference when set)
linkedTicketId
Linked ticket UUID (max. one; must belong to linkedProjectId when both set)
linkedTaskId
Linked task UUID (max. one; must belong to linkedTicketId/linkedProjectId when set)
linkedContactPersonIds
Linked contact person (PERSON party) UUIDs — informational, never billing-relevant while a work-item link exists
linkedAssetIds
Linked asset UUIDs — informational, never billing-relevant while a work-item link exists
contractId
Associated contract UUID (can be set alongside referenceType/Id)
positionId
ADR 0310: project_position this direct-on-project booking is billed against. Set when time is booked off a project appointment (calendar_event.positionId) so the position Ist (consumedMinutes/consumedAmount) reflects it. Only meaningful for direct project bookings (referenceType=PROJECT); task bookings already carry their position via task.positionId.
assetId
Asset the work was performed on (inherited from the linked ticket)
coverageMode
How this record is handled financially against a contract
INCLUDEDCONTINGENTCONTRACT_RATEBILLABLEcoverageContractId
Contract that covers this record (resolver result)
coverageAssignmentId
Contract assignment whose coverage rule applied
coverageContingentId
Contingent the work was deducted from (CONTINGENT mode)
coverageContractRatePerHour
Frozen contract special rate snapshot (CONTRACT_RATE mode)
coverageRateSource
Frozen rate-source snapshot for revision safety
CONTRACT_RATECONTINGENTINCLUDEDSTANDARDcoverageResolverVersion
Resolver logic version active when coverage was resolved
coverageResolvedAt
Timestamp the coverage was resolved
coverageAmbiguous
Asset could not be determined unambiguously — manual clarification needed
overageBlocked
Contingent overage was blocked by policy — overhang billed regularly
overageSurchargeAmount
Surcharge amount for the contingent overhang (ALLOW_WITH_SURCHARGE)
coveragePartial
A reference linked multiple assets, so coverage was split across them and this record mixes covered + billable shares (ADR 0164). When true, billing invoices only `billableMinutes - coveredMinutes`.
coveredMinutes
Sum of per-asset share minutes resolving to INCLUDED/CONTINGENT coverage (ADR 0164). Subtracted from billable minutes for coveragePartial records so covered work is not double-charged.
coverageAllocations
Per-asset coverage split snapshot when a reference links multiple assets (ADR 0164). Display/audit only — the actual contingent deduction lives in contingent_ledger / contingent_usages.
assetId
contractId
contingentId
billingMode
INCLUDEDCONTINGENTCONTRACT_RATEBILLABLEconsumedAmount
unit
overageBlocked
sourceType
Origin entity type this time record was booked from. CALENDAR_EVENT marks records booked off a calendar appointment via "Zeit buchen" — the source event is then hidden in the calendar (the time record renders in its place).
PHONE_CALLREMOTE_SESSIONCALENDAR_EVENTsourceId
Origin entity ID this time record was booked from
billableType
Billability classification
FULLNONEPARTIALbillable
Derived: true when billableType !== NONE
billableAmount
Billable minutes when billableType is PARTIAL
billablePercent
Billable percentage when billableType is PARTIAL
billableMinutes
Computed billable minutes (after rounding and inclusive deduction)
nonBillableMinutes
Non-billable minutes
nonBillableReason
Reason why time is not billable
ratePerHour
Hourly rate in EUR as decimal string
appliedRatePerHour
Snapshot of the hourly rate that was effective when this time record was created. Read-only after insert (ADR 0139 — Snapshot-Pattern analog ADR 0128a). Sourced from serviceType.billing.pricing[] or articlePrices[] depending on priceSource.
appliedRateSource
Provenance of the frozen base rate (ADR 0415): contract = contract.conditions.serviceRates / CONTRACT_RATE, party_override / party_discount = customer conditions (party.serviceTypeOverrides), article = article.articlePrices, service_type = tenant-wide mask price. Server-set alongside appliedRatePerHour; billing uses it to decide whether a BILLING_DATE re-resolve may replace the frozen rate (a contract-driven rate never is). Null on legacy records (treated conservatively: frozen rate kept).
contractparty_overrideparty_discountarticleservice_typenullconsumedAmount
Snapshot of billable amount = durationMinutes/60 * appliedRatePerHour, computed once on insert. Drives task.consumedAmount aggregation for limitMode=amount tasks (ADR 0139).
weclappTimeRecordId
Linked weclapp time-record ID after successful push
weclappSyncState
Sync state of this time-record against weclapp
pendingsyncederrornullweclappLastSyncedAt
Last successful weclapp push timestamp
weclappLastSyncError
Last weclapp push error message
weclappOrderItemId
weclapp salesOrderItem id of the TIME position appended to the sales order for this booking (non-service-position time, ADR 0412). Dedupe key for retries and the removal address when the approval is revoked.
weclappTravelOrderItemIds
weclapp salesOrderItem ids of the TRAVEL positions appended to the sales order for this booking (ADR 0412).
isFlatRate
Whether this is a flat-rate billing entry
flatRateAmount
Flat rate amount in EUR as decimal string
assignmentType
Assignment target type
CUSTOMEREMPLOYEEASSETORG_UNITassignmentId
Assignment target UUID
orgUnitId
Associated org unit (department/team) UUID
costCenterId
Associated cost center UUID
source
Herkunftsmarker (z. B. TANSS). Entspricht der Wert einem `externalMaster`-Provider, ist der Datensatz ein read-only Spiegel (ADR 0377) und nur vom Sync pflegbar; Bearbeitungsversuche scheitern mit 423. Der Guard wirkt pro Dokument — lokal erfasste Zeitbuchungen tragen kein `source` und bleiben normal bearbeitbar.
status
Unified lifecycle status: DRAFT → SUBMITTED → APPROVED → RECORDED → INVOICED. Branches: REJECTED, CREDITED.
DRAFTSUBMITTEDAPPROVEDREJECTEDRECORDEDINVOICEDCREDITEDapprovedById
User who approved this entry
approvedAt
Timestamp when approved (ISO datetime)
rejectionReason
Reason for rejection if status is REJECTED
budgetHold
Parked over-limit draft (ADR 0223): this entry was recorded against a ticket whose budget cap (Obergrenze) is already reached. It stays a permanent DRAFT, is EXCLUDED from budget.consumedMinutes and from billing, and blocks the ticket from being closed until the cap is raised (which auto-converts it back to a normal draft) or it is deleted. Distinct from a regular status:'DRAFT'.
isUnclear
Employee flagged this entry as unclear/needing clarification at recording time (e.g. unsure how to bill it, missing context). Surfaced to the team lead in the draft overview so it can be resolved before approval. Client-editable by the recorder.
unclearNote
Optional note describing what is unclear about this entry (set alongside isUnclear).
consultationTaskIds
Task UUIDs of Rücksprache (consultation) tasks raised for this entry. Owned by the request-consultation endpoint — never client-editable.
performanceRecordId
Leistungsnachweis this record was booked onto (set when status becomes RECORDED, cleared when the Leistungsnachweis is deleted)
invoiceId
Invoice this record was billed on (set when status becomes INVOICED, cleared when the invoice attempt is rolled back)
isOvertime
Whether this time entry is overtime (outside regular hours)
isWeekend
Whether this time entry was performed on a weekend or public holiday
isEmergencyService
Whether this time entry was emergency/on-call service
overtimeReason
Reason explaining why overtime/weekend/emergency service was necessary
flatRateServiceId
Reference to a flat rate service (Pauschalleistung)
appliedSurcharges
Surcharges applied to this time record
surchargeId
Reference to the surcharge definition ID
name
Surcharge name at time of application
percentChange
Percentage change applied
autoApplied
Whether this surcharge was auto-applied based on time rules
appliedMinutes
Minutes of this booking the surcharge actually covers (ADR 0431). Absent on records booked before the minute-accurate split, and on records resolved without clock times (only all-day rules could apply, so there is no minute share to report).
surchargeSegmentation
Minute-accurate surcharge split of this booking (ADR 0431) — the breakdown behind the blended `ratePerHour`.
basis
MINUTE = split from real clock times. DAY = the booking had no start/end, so only all-day rules were evaluated and `segments` is empty.
MINUTEDAYstackingMode
Stacking mode in force at booking time, frozen — the contract/service-type setting can change later.
ADDITIVEMAXeffectiveFactor
Minute-weighted multiplier on the base rate. `ratePerHour` = base × this, rounded to 2 decimals.
segments
fromTime
Local wall-clock start. "24:00" marks end-of-day.
toTime
minutes
surchargeIds
Surcharges covering this segment. Empty = base rate.
percentTotal
Percent applied after stacking (not necessarily the sum of all hits).
ratePerHour
This segment's own hourly rate, frozen. Stored rather than recomputed from base × factor: the base rate may change, and an amount already shown to a customer must not move retroactively (same freeze rule as `ratePerHour`, ADR 0139/0163). NOTE: summing minutes × these rates can differ from the invoiced amount by cents — the invoice bills `billableMinutes × ratePerHour` (the blended rate), and these are the breakdown shown alongside it.
tripIds
References to trip entities linked to this time record
travel
Travel information when entryType includes travel
mode
Mode of transportation
CARPUBLIC_TRANSPORTFLIGHTTAXIBIKEWALKdistanceKm
Distance in kilometers
durationMinutes
Travel duration in minutes
isRoundTrip
If true, distanceKm is one-way and will be doubled for billing
distanceBillable
Whether distance/mileage is billable
timeBillable
Whether travel time is billable
ratePerKm
Rate per kilometer in EUR as decimal string
timeBillingMode
How travel time is billed when timeBillable=true
HOURLYFLAT_RATEtimeRatePerHour
Hourly rate for travel time in EUR (when timeBillingMode=HOURLY)
timeFlatRateAmount
Flat-rate amount for travel time in EUR (when timeBillingMode=FLAT_RATE)
parkingCost
Parking costs in EUR as decimal string
tollCost
Toll costs in EUR as decimal string
startLocation
Start location (free text)
endLocation
End location (free text)
vehicleInfo
Vehicle information (license plate, description)
tags
Time entry tags
Keine Felder passen zum Filter.
Standard-Endpoints
Diese Resource folgt dem generischen CRUD-Vertrag der Plattform. Lesen Sie die Konventionen für Pagination, Idempotenz, Optimistic Locking und Audit. Die wichtigsten Endpoints:
GET /api/v1/time_records— Liste, paginiert + filterbarGET /api/v1/time_records/<id>— Einzelne EntityPOST /api/v1/time_records— AnlegenPATCH /api/v1/time_records/<id>— Teil-UpdateDELETE /api/v1/time_records/<id>— Soft-DeleteGET /api/v1/time_records/<id>/timeline— Audit + Aktivitäten