API · v1 · stabil
CODEMETA OSDeveloper Center
Konsole öffnen
Entity · projects

Project Schema

Schema-ID
project
Collection
projects
Permissions
  • Lesenproject_view
  • Anlegenproject_create
  • Ändernproject_edit
  • Löschenproject_delete

Felder

Project Schema

projects4 Permissions

Schema for validating project entities

titlestringerforderlich

Project title

1–200 Zeichen
descriptionstringoptional

Project description

max 2000 Zeichennullable
statusstringerforderlich

Project status

PLANNEDACTIVEIN_REVIEWON_HOLDCOMPLETEDCANCELLED
startDatedateoptional

Project start date (YYYY-MM-DD)

nullable
endDatedateoptional

Project end date (YYYY-MM-DD)

nullable
budgetstringoptional

Project budget as decimal string

Patternnullable
managerIduuidoptional

Project manager user UUID

nullable
orgUnitIduuidoptional

Organisational unit (department / team) the project is organisationally located in.

nullable
teamUserIdsuuid[]optional

Internal users that make up the project team (independent of orgUnitId). Used for team_member data scope, task filters and notifications.

Default: []nullable
partyIduuidoptional

Associated party UUID

nullable
partyAddressIduuidoptional

Specific site/address of the associated party

Default: nullnullable
contractIduuidoptional

Associated contract UUID

nullable
standaloneBillingobjectoptional

ADR 0274 — STANDALONE billing for this project. When enabled, all billable time of this project (direct PROJECT bookings + its tickets + its tasks) is carved out of the customer collective Leistungsnachweis and billed as its own project LN via POST /projects/:id/generate-performance-record. NEW projects default to enabled=true (materialised at create). EXISTING projects with this object ABSENT are treated as collective (resolveBillingUnit: absent → not standalone) — production-safe, no backfill. `performanceRecord*`/`invoicedAt` back-references are server-set only.

Default: {}nullable
enabledbooleanerforderlich
Default: true
performanceRecordIduuidoptional
read-onlynullable
performanceRecordNumberstringoptional
read-onlynullable
invoicedAtdatetimeoptional
read-onlynullable
budgetMinutesintegeroptional

Time budget in minutes

≥ 0nullable
budgetUsedMinutesintegeroptional

Used time budget in minutes (auto-computed)

≥ 0nullable
methodologystringerforderlich

Project methodology

KANBANSCRUMWATERFALLHYBRID
defaultBoardIduuidoptional

Default board UUID

nullable
tagsstring[]optional

Project tags

Default: []nullable
salesOrderIduuidoptional

Linked sales_order UUID (works for both native and weclapp-sourced orders). Phase 1 of ADR 0139.

nullable
salesOrderSourcestringoptional

Origin of the linked sales-order (ADR 0139)

internalweclappnull
nullable
controllingobjectoptional

Aggregated controlling data for the project (ADR 0139). Recomputed by reconcile-order-tasks job and on task/time-record mutations.

read-onlynullable
totalPlannedMinutesintegeroptional
≥ 0nullable
totalPlannedAmountstringoptional
Patternnullable
totalLoggedMinutesintegeroptional
≥ 0nullable
totalLoggedAmountstringoptional
Patternnullable
totalBillableMinutesintegeroptional
≥ 0nullable
totalBillableAmountstringoptional
Patternnullable
lastRecalculatedAtdatetimeoptional
nullable
weclappSalesOrderIdstringoptional

weclapp sales order ID

nullable
weclappOrderUrlstringoptional

URL to the weclapp sales order detail page

nullable
weclappSalesOrderNumberstringoptional

weclapp sales order number (e.g. AB-2026-00042)

max 100 Zeichennullable
weclappPerformanceRecordIdstringoptional

weclapp performance record created from the sales order at project billing completion (ADR 0412). Set once — the completion endpoint is idempotent on it.

max 200 Zeichenread-onlynullable
weclappPerformanceRecordNumberstringoptional

Number of the weclapp performance record (display/deep-link).

max 100 Zeichenread-onlynullable
weclappBillingCompletedAtdatetimeoptional

When the weclapp billing completion ran for this project.

read-onlynullable
weclappSalesInvoiceIdstringoptional

weclapp sales invoice created from the performance record (ADR 0412). Set once — the create-invoice endpoint is idempotent on it.

max 200 Zeichenread-onlynullable
weclappSalesInvoiceNumberstringoptional

Number of the weclapp sales invoice (display).

max 100 Zeichenread-onlynullable
weclappSalesInvoiceUrlstringoptional

URL to the weclapp sales invoice detail page.

read-onlynullable
weclappInvoiceCreatedAtdatetimeoptional

When the weclapp sales invoice was created from the billing dialog.

read-onlynullable
weclappSalesOrderDataobjectoptional

Cached weclapp sales order data

nullable
orderNumberstringoptional
orderDatestringoptional
netAmountstringoptional
grossAmountstringoptional
statusstringoptional
customerNamestringoptional
itemsobject[]optional
articleNumberstringoptional
nullable
namestringoptional
quantitynumberoptional
unitPricestringoptional
lastSyncedAtdatetimeoptional
limitsobjectoptional

Project cap configuration (budget, hours, deadlines). Used by /projects/:id/limits and warning logic.

nullable
budgetWarningPercentintegeroptional

Percent of budget at which a warning is raised

0 – 100Default: 80
hoursWarningPercentintegeroptional

Percent of project-total hours at which a warning is raised

0 – 100Default: 80
hoursPerTaskWarningPercentintegeroptional

Percent of task.maxMinutes at which a warning is raised

0 – 100Default: 80
deadlineWarningDaysintegeroptional

Days before the project deadline at which a warning is raised

0 – 365Default: 7
hardBlockOnExceedbooleanoptional

If true, new time records are rejected once project-level budget or hours are exceeded

Default: false
thresholdsNotifiedstring[]optional

Threshold keys that have already triggered a notification (first-time only).

Default: []
budgetCapPercentintegeroptional

Per-project HARD CAP (Obergrenze) as % of the € budget (controlling.totalLoggedAmount / budget). Once logged spend reaches this percent, further time bookings on the project or its tasks are rejected (422 project-cap-exceeded). null/absent ⇒ inherit the tenant default (settings.projects.defaultLimits.budgetCapPercent); 0 ⇒ explicitly no €-cap for this project (overrides a tenant default). Values > 100 allow a controlled overrun. Tolerated missing on existing projects — runtime fallback, no backfill.

0 – 1000nullable
hoursCapPercentintegeroptional

Per-project HARD CAP (Obergrenze) as % of the hours budget (usedMinutes / budgetMinutes). Once the projected usage reaches this percent, further time bookings are rejected (422). null/absent ⇒ inherit the tenant default (settings.projects.defaultLimits.hoursCapPercent), else the legacy limits.hardBlockOnExceed flag (= 100%); 0 ⇒ explicitly no hours-cap. Values > 100 allow a controlled overrun. Runtime fallback, no backfill.

0 – 1000nullable
lockThresholdPercentintegeroptional

Per-project override (%) for the task-progress review lock. When task completion (done/total) first reaches this, the project auto-locks for team-lead review. Null ⇒ use tenant default (settings.projectLock.thresholdPercent, default 70).

0 – 100nullable
budgetLockThresholdPercentintegeroptional

Per-project override (%) for the BUDGET-progress review lock (ADR 0191). When budget usage (controlling.totalLoggedAmount / budget €) first reaches this, the project auto-locks for team-lead review — independent of, and OR-combined with, the task-progress lock. Setting a value enables budget-locking for this project even if the tenant default is off. Null ⇒ use tenant default (settings.projectLock.lockOnBudget + budgetThresholdPercent).

0 – 100nullable
planLockThresholdPercentintegeroptional

Per-project override (%) for the POSITION-PLAN review lock (ADR 0422). When plan usage (controlling.totalLoggedMinutes / totalPlannedMinutes, else the amount equivalent) first reaches this, the project auto-locks for team-lead review — independent of, and OR-combined with, the task and budget locks. Exists because order-materialised projects usually carry no project-level €/hours budget: their planned effort lives in the position limits, so neither of the other two triggers can ever fire there. Setting a value enables plan-locking for this project even if the tenant switch is off. Null ⇒ use tenant default (settings.projectLock.lockOnPlan + planThresholdPercent).

0 – 100nullable
reviewLockobjectoptional

Progress-based review lock state (ADR 0191). One-time checkpoint: once released it does not re-lock at the same threshold. Set/cleared ONLY by the project-lock service and the /projects/:id/review endpoints — listed in protectedFields so generic CRUD PATCH cannot write it.

read-onlynullable
statusstringoptional

none = never locked; locked = awaiting team-lead release (blocks technician time bookings); released = reviewed & freed (no re-lock at this threshold).

nonelockedreleased
Default: "none"
thresholdPercentintegeroptional

Effective threshold (%) that triggered the lock.

0 – 100nullable
lockedAtdatetimeoptional
nullable
lockedProgressPercentintegeroptional

Progress percent of the triggering metric (see lockedMetric) at the moment the lock fired.

0 – 100nullable
lockedMetricstringoptional

Which metric crossed its threshold and triggered the lock: "tasks" (completion done/total), "budget" (controlling.totalLoggedAmount / budget €) or "plan" (controlling.totalLoggedMinutes / totalPlannedMinutes — the position plan, ADR 0422). Drives the banner + review-task wording.

tasksbudgetplan
nullable
consumedMetricsstring[]optional

Per-metric one-time checkpoints already consumed (ADR 0191, extended by ADR 0422). A metric in this list does not re-lock — but the task, budget and plan checkpoints are independent, so releasing one never disables the others. Absent on locks written before this field existed; the service then derives it from lockedMetric (no backfill).

Default: []nullable
reviewTaskIduuidoptional

The auto-created review task assigned to the reviewer(s).

nullable
reviewerIdsuuid[]optional

Internal user IDs allowed to release (team leads of orgUnit, else the project manager). Mirrored onto the review task assignees.

Default: []nullable
releasedAtdatetimeoptional
nullable
releasedByuuidoptional

Internal user ID who released the lock.

nullable
customerAccessobjectoptional

Customer access configuration for project visibility

nullable
modestringoptional

Access mode for customer project view

DISABLEDAUTHENTICATEDSECURE_LINKLINK_PLUS_LOGIN
visibilityProfilestringoptional

Predefined visibility profile or CUSTOM for manual feature selection

MINIMALSTANDARDEXTENDEDCOLLABORATIVECUSTOM
featuresobjectoptional

Individual feature flags for customer visibility

statusProgressbooleanoptional
nextMilestonebooleanoptional
timelinePhasesbooleanoptional
ganttReadOnlybooleanoptional
releasedDocumentsbooleanoptional
ownChangeRequestsbooleanoptional
createChangeRequestsbooleanoptional
viewAssignedTasksbooleanoptional
commentOnTasksbooleanoptional
createTasksbooleanoptional
assignTasksToCustomerbooleanoptional
uploadFilesOnTasksbooleanoptional
uploadFilesToDmsbooleanoptional
approvalsbooleanoptional
externalActivityFeedbooleanoptional
accessTokenstringoptional

Random token for public access URL

read-onlynullable
accessTokenCreatedAtdatetimeoptional

When the access token was generated

read-onlynullable
allowedPartyIdsuuid[]optional

Party UUIDs that are allowed to access the project

Default: []nullable
sourceTemplateIduuidoptional

task_template this project was instantiated from.

nullable
sourceTemplateVersionstringoptional

Pinned template version at instantiation time.

Patternnullable
inboundReplyAckedAtdatetimeoptional

Timestamp at which the latest inbound customer email was acknowledged as "handled, no reply needed". Clears the awaiting-reply badge when >= the last inbound email time; a newer inbound email re-arms it. Mirrors opportunity.inboundReplyAckedAt.

nullable
inboundReplyAckedBystringoptional

User who acknowledged the latest inbound customer email (see inboundReplyAckedAt).

nullable

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/projects — Liste, paginiert + filterbar
  • GET /api/v1/projects/<id> — Einzelne Entity
  • POST /api/v1/projects — Anlegen
  • PATCH /api/v1/projects/<id> — Teil-Update
  • DELETE /api/v1/projects/<id> — Soft-Delete
  • GET /api/v1/projects/<id>/timeline — Audit + Aktivitäten

Suche